Java 如何编写字节码文件?
我正在研究编译器设计,并试图制作一种针对JVM字节码规范子集的小型语言 就像Java如何编译成Java字节码一样,我想编写一个编译器,将我的语言编译成相同的Java字节码,这样就可以输入JVM 我已经非常了解编译的前端基础知识。我可以做一个lexer和一个解析器等等。我知道如何派生和检查语义以及所有这些 那部分对我来说很容易。困难的部分是实际的代码生成。我知道,可能有很多工具,甚至是预先编写的代码生成器。但就像我没有在前端部分使用yacc等工具一样,我也不想在后端使用工具 特别是因为我的前端输出可能不符合这些工具使用的任何标准Java 如何编写字节码文件?,java,jvm,java-bytecode-asm,Java,Jvm,Java Bytecode Asm,我正在研究编译器设计,并试图制作一种针对JVM字节码规范子集的小型语言 就像Java如何编译成Java字节码一样,我想编写一个编译器,将我的语言编译成相同的Java字节码,这样就可以输入JVM 我已经非常了解编译的前端基础知识。我可以做一个lexer和一个解析器等等。我知道如何派生和检查语义以及所有这些 那部分对我来说很容易。困难的部分是实际的代码生成。我知道,可能有很多工具,甚至是预先编写的代码生成器。但就像我没有在前端部分使用yacc等工具一样,我也不想在后端使用工具 特别是因为我的前端输出
一旦有了前端输出,如何生成字节码文件?我知道java字节码是什么样子,但如何将其写入一个新文件,然后将其馈送到JVM?您编写的字节码文件与编写任何二进制文件一样。下面是一个将Java类文件“幻数”0xCAFEBABE写入.class文件的示例:
try (var fout = new FileOutputStream("A.class")) {
byte[] bytecode = {(byte) 0xca, (byte) 0xfe, (byte) 0xba, (byte) 0xbe};
fout.write(bytecode);
}
至于这个神奇数字后面应该是什么,如何实际编写一个包含变量和方法等的Java类,这在JVM规范中有记录:
你会发现这很复杂。这就是为什么人们通常使用更简单的库,比如or。您必须了解java
.class
文件结构和更多关于它的详细信息,在这里编写详细信息非常困难。java类文件的示例结构
ClassFile {
4 bytes Java Magic Number
2 bytes Minor Version
2 bytes Major Version
2 bytes Size of the constant pool
* bytes Numerous bytes making up the constant pool
2 bytes This class' access modifiers (Ie. public)
2 bytes Index of this class in constant pool
2 bytes Index of this class' super class in constant pool
2 bytes Number of interfaces
* bytes Numerous bytes making up interface definitions
2 bytes Number of fields in this class
* bytes Numerous bytes making up field definitions
2 bytes Number of methods in this class
* bytes Numerous bytes making up method definitions
2 bytes Attributes count ( meta data for class file )
* bytes Numerous bytes making up attribute definitions
}
顺便说一下,我们从
希望它能帮助您进一步了解Java VM规范,并使用DataOutputStream。您可能会对我的文章感兴趣,其中解释了它是如何工作的。我也有一个字节码模拟器从那里链接。