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),并使用 Streaming ASM API 直接发射类文件:

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

这就是现在的工作方式。在实验可能性领域,我一直在研究一个更快的实验性字节码,部分原因是它跳过了构建 CFG 并直接访问 Scala 抽象语法树(然后使用 Tree 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 回答