接近Java / JVM内部结构[关闭]


15

我已经用Java编程了大约8年,作为一名开发人员,我对该语言非常了解,但是我的目标是加深我对内部语言的了解。我上过PL设计的本科课程,但它们是非常广泛的学术概览(在Scheme,IIRC中)。

有人可以建议一条路线来开始研究细节吗?具体来说,是否有一些特定的主题(例如垃圾回收)更容易解决或成为一个好的起点?是否有关于JVM内部和Java编程语言设计的不错的高级书籍?我当前的方法是从JVM规范开始,并根据需要进行研究。


2
我个人的方法是(现在是)找到Java中所有“为什么会这样正确地工作” 的真正原因。如何定义自动装箱,泛型类型如何工作。var-args呢?SUPER类文件中的标志实际上是做什么的?大部分描述在JVM规范本身中,但是需要一些工作才能将其运用于您的大脑;-)
Joachim Sauer 2012年

Answers:


13

多年前,当我开始使用Java时,我做了一些这样的事情。我的方法是阅读VM规范,并查看javap -c的输出,该输出显示了一个类的反汇编字节码。我还尝试使用Java字节码汇编器创建具有特定字节码的Java类。如果您想尝试一下,可以使用一个名为jasmin的汇编程序。

您可能还需要查看Oracle的Brian Goetz发布的Lambda Expression Translation文档,其中涵盖了将用于翻译Java 8中添加的lambda(本质上是闭包)的策略。

如果您确实想深入研究池的深层内容,还可以从OpenJDK获取Hotspot VM的源代码,并为JDK 8 提供具有lambda支持Javac编译器的早期访问版本(hg存储库)。

研究垃圾收集可能是一个好主意。快速搜索找到了Dobbs博士有关Java垃圾优先GC的文章。我不知道这是一个很好的介绍。我假设您已经了解标记清除和分代垃圾收集器;如果没有,您将需要先阅读这些内容。


3

一些其他想法:

  • 参与OpenJDK项目。通过黑客攻击,了解软件的内部知识是无与伦比的!
  • 查看其他JVM语言(例如Clojure或Scala)如何为JVM生成代码
  • 做一个您感兴趣并且需要使用JVM内部组件的小型项目。也许使用ASM之类的东西来操纵字节码。

2

如果您还不熟悉Java字节码格式,请考虑编写一个微型编译器,该编译器将创建有效的Java字节码(或Jasmin汇编程序)并使其正确运行。

看到您的代码生成的“ Hello World”或“ 4”(给定2 + 2)非常令人满意。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.