Ответ 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 дерева для сборки файлов классов в памяти). Детали в: