Java 如何编写字节码文件?

Java 如何编写字节码文件?,java,jvm,java-bytecode-asm,Java,Jvm,Java Bytecode Asm,我正在研究编译器设计,并试图制作一种针对JVM字节码规范子集的小型语言 就像Java如何编译成Java字节码一样,我想编写一个编译器,将我的语言编译成相同的Java字节码,这样就可以输入JVM 我已经非常了解编译的前端基础知识。我可以做一个lexer和一个解析器等等。我知道如何派生和检查语义以及所有这些 那部分对我来说很容易。困难的部分是实际的代码生成。我知道,可能有很多工具,甚至是预先编写的代码生成器。但就像我没有在前端部分使用yacc等工具一样,我也不想在后端使用工具 特别是因为我的前端输出

我正在研究编译器设计,并试图制作一种针对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。您可能会对我的文章感兴趣,其中解释了它是如何工作的。我也有一个字节码模拟器从那里链接。