关于scala如何映射到jvm字节码的很好的参考

关于scala如何映射到jvm字节码的很好的参考,scala,jvm,bytecode,Scala,Jvm,Bytecode,关于Scala编译器如何将各种Scala特性映射到字节码,有什么好的描述吗 谷歌很快找到了大卫·波拉克2009年演讲的支持材料 但我怀疑这可能既过时又不完整 我可以尝试自己通过scalap javap收集这些数据,但如果能从其他人的努力和洞察力中获益,那将是一件好事 我不知道。 考虑使用字节码检查工具检查编译器产生的代码。在编写性能关键代码时,验证是否正确应用了专门化、是否消除了闭包、是否通过字节码指令直接访问了数组、是否正确扩展了宏等,这通常很有用 如果您使用的是Sublime,则在Scal

关于Scala编译器如何将各种Scala特性映射到字节码,有什么好的描述吗

谷歌很快找到了大卫·波拉克2009年演讲的支持材料

但我怀疑这可能既过时又不完整

我可以尝试自己通过scalap javap收集这些数据,但如果能从其他人的努力和洞察力中获益,那将是一件好事

我不知道。 考虑使用字节码检查工具检查编译器产生的代码。在编写性能关键代码时,验证是否正确应用了专门化、是否消除了闭包、是否通过字节码指令直接访问了数组、是否正确扩展了宏等,这通常很有用


如果您使用的是Sublime,则在Scala REPL上有一个this。

命令,请使用
:javap-c
查看生成的字节码

例如:

scala> class Bytes { def a = println("hello") }
defined class Bytes

scala> :javap -c Bytes
Compiled from "<console>"
public class Bytes extends java.lang.Object{
public void a();
  Code:
   0:   getstatic   #13; //Field scala/Predef$.MODULE$:Lscala/Predef$;
   3:   ldc #15; //String hello
   5:   invokevirtual   #19; //Method scala/Predef$.println:(Ljava/lang/Object;)V
   8:   return

public Bytes();
  Code:
   0:   aload_0
   1:   invokespecial   #24; //Method java/lang/Object."<init>":()V
   4:   return

}
scala>类字节{defa=println(“hello”)}
定义的类字节
scala>:javap-c字节
从“”编译
公共类字节扩展了java.lang.Object{
公共无效a();
代码:
0:getstatic#13;//字段scala/Predef$.MODULE$:Lscala/Predef$;
3:ldc#15;//字符串你好
5:invokevirtual#19;//方法scala/Predef$.println:(Ljava/lang/Object;)V
8:返回
公共字节();
代码:
0:aload_0
1:invokespecial#24;//方法java/lang/Object。“:()V
4:返回
}

这可能会因版本而异。你试过查看编译器源代码吗?你也可以编译一些类,然后反汇编它们。我可以浏览并尝试理解源代码,反汇编一堆scala,或者阅读几年的scala内部邮件列表,但我希望能找到一些东西来简化这一切。我很懒。@sbu我想你是对的,它会随着版本的变化而变化。我最感兴趣的是2.10.1,但即将到来的使用Java1.7JVM特性的变化也很有趣。好吧,没人费心编写Javac编译器的内部代码,所以像Scala这样不太流行的语言也不太可能有这样的东西。另外,如果你想看看类文件中到底有什么,我推荐一个像我的喀拉喀托一样的反汇编程序。Scalap旨在使scala输出美观,但它不会向您显示低级字节码的详细信息。@sbumb:“没有人费心编写Javac编译器的内部代码…”。他要求的是scalabytecode映射,这不一定需要理解编译器的内部工作。javac的内部工作与javabytecode映射之间的区别相同(后者仅通过jvm规范就有很好的文档记录)。也就是说,即使是在scala的案例中,也几乎没有记录在案,至少在我所知道的一个地方没有记录在案。谢谢,我知道我可以做到这一点,但我要找的是其他人的分析,而不是我自己的分析。