13

Scalaはどのようにバイトコードを生成しているのだろうかと思いますが、ASMのようないくつかのライブラリを使用していますか?または、パフォーマンスのために.classファイルにバイナリを書き込むだけですか?

4

2 に答える 2

31

2.10 以降、Scala コンパイラは ASM 4 を使用してバイトコードを発行し、 -target:jvm-1.5 、 -target:jvm-1.6 、および -target:jvm-1.7 をサポートします。

バックエンドの実装の側面については、以下で説明されています。

バイトコード エミッター (GenASM、以下にリンクされているソース) は、前のフェーズで構築された制御フロー グラフ (CFG) にアクセスし、ストリーミング ASM API を使用してクラスファイルを直接出力します。

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

それが今の仕組みです。実験的な可能性の領域では、CFG の構築をスキップし、Scala 抽象構文ツリーに直接アクセスする (ツリー ASM API を使用してメモリ内にクラスファイルを構築する) ため、より高速に発行される実験的なバイトコードに取り組んできました。詳細:

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

于 2012-11-14T14:57:00.790 に答える
2

彼らはいくつかの中間コードを生成し、それを手動で Java バイトコードまたは .net msil に変換しているようです

ここでのコンパイラの概要: https://wiki.scala-lang.org/display/SIW/Overview+of+Compiler+Phases

于 2012-11-14T14:55:07.930 に答える