Мне интересно, как scala генерировать байтовый код, использует ли он некоторые библиотеки, такие как ASM? Или просто напишите двоичные файлы .class для производительности?
Как scala генерировать байтовый код? Использовать некоторые библиотеки, такие как ASM, или напрямую писать двоичные файлы?
Ответ 1
Начиная с 2.10, компилятор Scala использует ASM 4 для испускания байт-кода, поддерживая -target: jvm-1.5, -target: jvm-1.6 и -target: jvm-1.7
Аспекты реализации бэкэнд описаны в:
- Исправление Scala classfiles через ASM http://lamp.epfl.ch/~magarcia/ScalaCompilerCornerReloaded/2012Q2/GenASM.pdf
Байт-кодовый эмиттер (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 дерева для сборки файлов классов в памяти). Детали в:
Ответ 2
похоже, что они генерируют некоторый промежуточный код, а затем преобразовывают его вручную в java-байт-код или .net msil
Хороший обзор компилятора здесь: https://wiki.scala-lang.org/display/SIW/Overview+of+Compiler+Phases