Scalaはどのようにバイトコードを生成しているのだろうかと思いますが、ASMのようないくつかのライブラリを使用していますか?または、パフォーマンスのために.classファイルにバイナリを書き込むだけですか?
2 に答える
2.10 以降、Scala コンパイラは ASM 4 を使用してバイトコードを発行し、 -target:jvm-1.5 、 -target:jvm-1.6 、および -target:jvm-1.7 をサポートします。
バックエンドの実装の側面については、以下で説明されています。
- ASM 経由で Scala クラスファイルを出力する http://lamp.epfl.ch/~magarcia/ScalaCompilerCornerReloaded/2012Q2/GenASM.pdf
バイトコード エミッター (GenASM、以下にリンクされているソース) は、前のフェーズで構築された制御フロー グラフ (CFG) にアクセスし、ストリーミング ASM API を使用してクラスファイルを直接出力します。
https://github.com/scala/scala/blob/master/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
それが今の仕組みです。実験的な可能性の領域では、CFG の構築をスキップし、Scala 抽象構文ツリーに直接アクセスする (ツリー ASM API を使用してメモリ内にクラスファイルを構築する) ため、より高速に発行される実験的なバイトコードに取り組んできました。詳細:
彼らはいくつかの中間コードを生成し、それを手動で Java バイトコードまたは .net msil に変換しているようです
ここでのコンパイラの概要: https://wiki.scala-lang.org/display/SIW/Overview+of+Compiler+Phases