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

时间:2012-11-14 14:33:36

标签: scala jvm bytecode

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

2 个答案:

答案 0 :(得分:30)

从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

答案 1 :(得分:2)

看起来他们正在生成一些中间代码,然后手动将其转换为java字节码或.net msil

编译器概述:https://wiki.scala-lang.org/display/SIW/Overview+of+Compiler+Phases