Подтвердить что ты не робот

Как scala генерировать байтовый код? Использовать некоторые библиотеки, такие как ASM, или напрямую писать двоичные файлы?

Мне интересно, как scala генерировать байтовый код, использует ли он некоторые библиотеки, такие как ASM? Или просто напишите двоичные файлы .class для производительности?

4b9b3361

Ответ 1

Начиная с 2.10, компилятор Scala использует ASM 4 для испускания байт-кода, поддерживая -target: jvm-1.5, -target: jvm-1.6 и -target: jvm-1.7

Аспекты реализации бэкэнд описаны в:

Байт-кодовый эмиттер (GenASM, источник, связанный ниже) посещает график потока управления (CFG), построенный предыдущей фазой, и использует Streaming ASM API для прямого испускания файлов классов:

https://github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala

Вот как все работает сейчас. В области экспериментальных возможностей я работал над испускаемым экспериментальным байт-кодом, который быстрее, отчасти потому, что он пропускает создание CFG и посещает Scala абстрактные деревья синтаксиса напрямую (используя затем API ASM дерева для сборки файлов классов в памяти). Детали в:

https://github.com/magarciaEPFL/scala/blob/GenBCodeOpt/src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala

Ответ 2

похоже, что они генерируют некоторый промежуточный код, а затем преобразовывают его вручную в java-байт-код или .net msil

Хороший обзор компилятора здесь: https://wiki.scala-lang.org/display/SIW/Overview+of+Compiler+Phases