2009-07-30 52 views
28

在最近问到的一个问题中,我的简单回答突出了我对Java,JVM以及代码如何编译和运行的误解。这使我想要把我的理解降到更低的层次。对于像汇编这样的低层次理解,我没有任何问题,字节码和JVM如何混淆我。面向对象的代码如何在低级别上被分解,这一点在我看来是失败的。我想知道是否有人对如何了解Java的JVM,字节码和底层功能有任何建议。是否有任何实用程序允许您直接编写和运行字节码,因为我相信通过使用某些东西获得经验是增加理解它的最佳途径?此外,并阅读关于这个主题的建议,将不胜感激。了解Java字节码和JVM

编辑:次要问题。因此,我有一个小问题,答案给了我一个有趣的想法,以了解jvm,只用一种可读的语法编写一个非常简单的语言(如brainf ** k或ook)的合理性(也许我甚至可以开发它最终支持oo)编译成字节码是?这会是一个很好的学习经历吗?

+2

+1给了brainf ** k为属性'简单';-) – 2009-07-30 15:40:33

+0

我猜“简单”是用在一个小复杂度的意义上,并非易用性;) – SasQ 2015-06-09 21:31:55

回答

29

建议阅读:the JVM spec

您可能还想玩BCEL--还有其他库可以用来操作字节码,但这可能是最知名的。

+0

我不知道这样的规范甚至存在。这真的很有帮助。 – 2009-07-30 15:08:00

11

Apache BCEL将允许您分析和处理来自字节码的.class文件。

javap将允许您反汇编现有的.class文件。这对于打开快速测试课程来理解封面下面的真实情况特别有用。

1

了解Java/JVM的架构:阅读Wikipedia,规格和源代码。

对于理解面向对象的代码是如何在低级别完成:尝试模仿像继承/多态性/封装功能,像C.

一个低级语言在C语言中,你可以通过实现上述目标,例如,函数指针和嵌套结构的组合。

+0

我真的很喜欢这第二个建议。我想我可能不得不试图想出一个优雅的方式来做到这一点。我知道一些真正复杂的多态和继承,但他们都是真正低效率的技术,我可能不会真正算作模拟功能。 – 2009-07-30 15:00:16

+0

在C语言中添加了更多关于这样做的信息。当你对语言有很好的理解以及指针如何工作时,实际上并不难。 – 2009-07-30 16:06:10

+0

@MikeMcQuaid:在C中实现闭包怎么样? – SasQ 2015-06-09 21:38:02

3

我通过阅读the ASM tutorial了解到,并且对图书馆本身进行了讽刺。

恕我直言,ASM比BECL好。

BCEL已被使用 成功的几个项目,如 编译,优化, 混淆器,代码生成器和 分析工具。 不幸的是, 在过去几年没有太多的发展 。请随时致电 帮忙或您可能想要 查看ASM项目 objectweb。 - http://jakarta.apache.org/bcel/

+3

ASM项目:http://asm.ow2.org/ – sova 2010-12-16 07:07:21

+0

如果你真的想手动编写字节码,Krakatau比ASM好得多。 – Antimony 2013-08-04 16:26:56

+0

对不起,链接'ASM教程'已经死了 – zionpi 2013-08-28 12:33:06