scala如何生成字节代码?使用像ASM这样的库,还是直接写二进制文件?

Fre*_*ind 13 jvm scala bytecode

我想知道scala如何生成字节代码,它是否使用像ASM这样的库?或者只是将二进制文件写入.class文件以获得性能?

小智 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