学习Java字节码和虚拟机(JVM)

40
最近我回答了一个问题,我的简单思维回答突出了我对Java、JVM以及代码如何编译和运行的误解。这引起了我想要更深入地了解的愿望。我对低级别的理解没有问题,比如汇编语言,然而字节码和JVM让我困惑。我不明白面向对象的代码在低级别是如何被拆分的。我想知道有没有人有任何关于学习JVM、字节码和Java低级别功能的建议?是否有任何工具可以让您直接编写和运行字节码,因为我相信亲身体验是增进理解的最佳方式?此外,阅读这个主题的建议也会很受欢迎。
编辑:次要问题。所以我有一个次要问题,答案给了我一个有趣的想法来学习jvm,用可读的语法(也许我甚至可以开发它支持oo)编写一个像brainf **k或Ook那样的非常简单的语言,它能编译成字节码。这会是一个好的学习经验吗?

2
给Brainf**k编程语言加上“简单”的属性,加一分;-) - Andreas Dolk
1
我猜“简单”是指复杂度低,而不是易用性高 ;) - SasQ
6个回答

31

建议阅读:JVM规范

你可能还想尝试使用BCEL - 还有其他的库可以操作字节码,但这可能是最为人所知的一个。


我之前不知道这个规范的存在。这真的很有帮助。 - faceless1_14

13

Apache BCEL可以让您从字节码中分析和手工制作.class文件。

javap可以用来反汇编现有的.class文件。它特别适用于快速创建测试类,以了解底层实际发生了什么。


5

我是通过阅读ASM教程并对库进行试验学习的。

在我看来,ASM比BCEL更好。

BCEL已经在编译器、优化器、混淆器、代码生成器和分析工具等多个项目中得到成功应用。但不幸的是,在过去几年中没有太多开发工作。如果您想帮忙或者想了解一下ObjectWeb上的ASM项目,请随意查看。 - http://jakarta.apache.org/bcel/


而且如果你真的想手动编写字节码,Krakatau比ASM要好得多。 - Antimony
抱歉,链接“ASM教程”已失效。 - zionpi
1
@zionpi,总有Archive.org(http://web.archive.org/web/20070715000000/http://download.forge.objectweb.org/asm/asm-guide.pdf)可供参考。 - SasQ

3

2

Java虚拟机编程是一本关于这个话题的好书。(声明:我与作者合作。)


1

要理解Java/JVM的架构:阅读维基百科、规范和源代码。

要理解面向对象编程在低级别上是如何完成的:尝试在像C这样的低级语言中模拟继承/多态/封装等特性。

在C中,您可以通过函数指针和嵌套结构的组合来实现上述功能。


我真的很喜欢这第二个建议。我想我可能要尝试想出一种优雅的方法来做到这一点。我知道一些多态和继承的非常混乱的方法,但它们都是我想出来的非常低效的技术,可能甚至不能算作是模拟这些特性。 - faceless1_14
增加了有关在C语言中实现此操作的更多信息。当您对语言及指针的工作原理有很好的理解时,实际上并不难。 - Mike McQuaid
@MikeMcQuaid:在C语言中实现闭包怎么样? - SasQ
为了在C语言中近似实现闭包,需要将其拆分成一个保存捕获变量的结构体和一个以该结构体为第一个参数的函数。这就是普通的C库进行回调的方式,可以参考pthread_create的示例。 - Riley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接