Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译为java字节码(不使用java)_Java_Compiler Construction_Bytecode - Fatal编程技术网

编译为java字节码(不使用java)

编译为java字节码(不使用java),java,compiler-construction,bytecode,Java,Compiler Construction,Bytecode,我的编译器类正在创建一种我们打算编译成Java字节码的语言。我们已经取得了很大的进步,并且正在接近代码生成的时间 查找有关如何从编译器创建.class文件的信息时遇到问题。你有什么资源可以给我们一些帮助吗?我们已经有很多关于指令集的文档,但是需要关于如何直接填写类文件/编写十六进制的信息 我们不需要关于反编译.class文件的信息或建议 即使是从零开始编写.class文件的简单示例也会非常好 JVM规范不是我们想要的。我们真正需要的是一个示例或一个演练。可能就是您想要的,尤其是。VM规范:而且应

我的编译器类正在创建一种我们打算编译成Java字节码的语言。我们已经取得了很大的进步,并且正在接近代码生成的时间

查找有关如何从编译器创建.class文件的信息时遇到问题。你有什么资源可以给我们一些帮助吗?我们已经有很多关于指令集的文档,但是需要关于如何直接填写类文件/编写十六进制的信息

我们不需要关于反编译.class文件的信息或建议

即使是从零开始编写.class文件的简单示例也会非常好

JVM规范不是我们想要的。我们真正需要的是一个示例或一个演练。

可能就是您想要的,尤其是。

VM规范:而且应该这样做


您可能会从字节码工程库()中获得一些启发(它必须阅读/理解类文件)。

有许多项目提供了创建Java类文件的高级接口,而无需您自己编写类文件。请看以下内容:

  • ASM-
  • BCEL-
  • 宝藏-
所有这些都提供了创建类文件的API。您可以随时查看他们为此编写的代码,并为您的编译器编写一些类似的代码,尽管我认为这是相当多的工作

使用BCEL查看ClassGen,它应该使您能够以所需的格式写出类文件,下面是一个简单的示例:

ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object",
                             "<generated>", ACC_PUBLIC | ACC_SUPER,
                             null);
classgencg=newclassgen(“HelloWorld”、“java.lang.Object”,
“”,ACC|u PUBLIC | ACC|u SUPER,
无效);

很抱歉让你失望,但这正是你想要的。如果你不能处理规范,那么也许你根本不应该编写编译器。

我想你可以尝试使用现有的工具,检查对结果字节码进行增量更改的效果

资料来源:

public class Hello {
        public static void main(String[] args) {
                System.out.println("H");
        }
}
输出:

从“Hello.java”编译而来
公共类Hello扩展了java.lang.Object{
公众你好();
代码:
0:aload_0
1:invokespecial#1;//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:getstatic#2;//字段java/lang/System.out:Ljava/io/PrintStream;
3:ldc#3;//字符串H
5:invokevirtual#4;//方法java/io/PrintStream.println:(Ljava/lang/String;)V
8:返回
}
二进制:

CA FE BA BE 00 00 00 32 00 1D 0A 00 06 00 0F 09         _______2________
00 10 00 11 08 00 12 0A 00 13 00 14 07 00 15 07         ________________
00 16 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29         _____<init>___()
56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E         V___Code___LineN
75 6D 62 65 72 54 61 62 6C 65 01 00 04 6D 61 69         umberTable___mai
6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67         n___([Ljava/lang
2F 53 74 72 69 6E 67 3B 29 56 01 00 0A 53 6F 75         /String;)V___Sou
72 63 65 46 69 6C 65 01 00 0A 48 65 6C 6C 6F 2E         rceFile___Hello.
6A 61 76 61 0C 00 07 00 08 07 00 17 0C 00 18 00         java____________
19 01 00 01 48 07 00 1A 0C 00 1B 00 1C 01 00 05         ____H___________
48 65 6C 6C 6F 01 00 10 6A 61 76 61 2F 6C 61 6E         Hello___java/lan
67 2F 4F 62 6A 65 63 74 01 00 10 6A 61 76 61 2F         g/Object___java/
6C 61 6E 67 2F 53 79 73 74 65 6D 01 00 03 6F 75         lang/System___ou
74 01 00 15 4C 6A 61 76 61 2F 69 6F 2F 50 72 69         t___Ljava/io/Pri
6E 74 53 74 72 65 61 6D 3B 01 00 13 6A 61 76 61         ntStream;___java
2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D 01         /io/PrintStream_
00 07 70 72 69 6E 74 6C 6E 01 00 15 28 4C 6A 61         __println___(Lja
76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29         va/lang/String;)
56 00 21 00 05 00 06 00 00 00 00 00 02 00 01 00         V_!_____________
07 00 08 00 01 00 09 00 00 00 1D 00 01 00 01 00         ________________
00 00 05 2A B7 00 01 B1 00 00 00 01 00 0A 00 00         ___*____________
00 06 00 01 00 00 00 01 00 09 00 0B 00 0C 00 01         ________________
00 09 00 00 00 25 00 02 00 01 00 00 00 09 B2 00         _____%__________
02 12 03 B6 00 04 B1 00 00 00 01 00 0A 00 00 00         ________________
0A 00 02 00 00 00 03 00 08 00 04 00 01 00 0D 00         ________________
00 00 02 00 0E                                          _____
CA FE BA BE 00 00 00 32 00 1D 0A 00 06 00 0F 09________
00 10 00 11 08 00 12 0A 00 13 00 14 07 00 15 07________________
00 16 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E V_____________亚麻布
75 6D 62 65 72 54 61 62 6C 65 01 00 04 6D 61 69号表
6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 n_____([Ljava/lang
2F 53 74 72 69 6E 67 3B 29 56 01 00 A 53 6F 75/串
72 63 65 46 69 6C 65 01 00 0A 48 65 6C 6C 6F 2E RCE文件你好。
6A 61 76 61 0C 00 07 00 08 07 00 17 0C 00 18 00爪哇____________
19 01 00 01 48 07 00 1A 0C 00 1B 00 1C 01 00 05___________
48 65 6C 6C 6F 01 00 10 6A 61 76 61 2F 6C 61 6E你好,java/lan
67 2F 4F 62 6A 65 63 74 01 00 10 6A 61 76 61 2F g/对象/
6C 61 6E 67 2F 53 79 73 74 65 6D 01 00 03 6F 75语言/系统
74 01 00 15 4C 6A 61 76 61 2F 69 6F 2 F 50 72 69 t____Ljava/io/Pri
6E 74 53 74 72 65 61 6D 3B 01 00 13 6A 61 76 61 ntStream;爪哇
2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D 01/io/PrintStream_
00 07 70 72 69 6E 74 6C 6E 01 00 15 28 4C 6A 61_____________(Lja
76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 va/lang/String;)
56 00 21 00 05 00 06 00 00 00 00 02 00 01 00 V______________
07 00 08 00 01 00 09 00 00 1D 00 01 00 01 00________________
00 00 05 2A B7 00 01 B1 00 00 00 01 00 0A 00 00___*____________
00 06 00 01 00 01 00 09 00 0B 00 0C 00 01________________
00 09 00 00 25 00 02 00 01 00 00 00 09 B2 00 uuuuuuuuuuuuuuuuu%__________
02 12 03 B6 00 04 B1 00 00 01 00 0A 00 00 00________________
0A 00 02 00 00 03 00 08 00 04 00 01 00 0D 00________________
00 02 00 0E_____

SmarteFel包含一个开源的java.class文件生成器


我刚刚编写了一个类文件解析器……第4章包含了发出字节码所需的信息。您发现第4章中缺少哪些具体信息?您能给我们一个教程或示例吗?请参阅我的更新,但我认为您需要更具体地说明发出类文件的哪些部分您不理解。的确,类文件格式正是“关于如何直接填写类文件/写入十六进制的信息”我建议用Java编写一个最小的类,编译它,然后用十六进制调试器和规范查看类文件-最好做很多注释。使用BCEL或类似的东西会更快,但你学到的东西会更少。其他人都给出了这个答案,他们对推荐JVM规范投了反对票,尽管ph值很低粗体的rase-但Jon获得了三张选票。他是对的,但我敢打赌,没有Jon积累的疯狂信誉的人会被贬低。这是你的道具,Jon。很难说,因为Jon的回答和编辑都发生在“一小时前”但是关于不想要JVM规范的粗体行被编辑了,所以很可能Jon的答案出现在编辑之前。Jon和我建议使用VM规范。投票被否决了,然后是编辑或编辑和投票被否决。无论哪种方式,编辑和投票被否决几乎是同时发生的。编辑肯定是在我的答案之后
CA FE BA BE 00 00 00 32 00 1D 0A 00 06 00 0F 09         _______2________
00 10 00 11 08 00 12 0A 00 13 00 14 07 00 15 07         ________________
00 16 01 00 06 3C 69 6E 69 74 3E 01 00 03 28 29         _____<init>___()
56 01 00 04 43 6F 64 65 01 00 0F 4C 69 6E 65 4E         V___Code___LineN
75 6D 62 65 72 54 61 62 6C 65 01 00 04 6D 61 69         umberTable___mai
6E 01 00 16 28 5B 4C 6A 61 76 61 2F 6C 61 6E 67         n___([Ljava/lang
2F 53 74 72 69 6E 67 3B 29 56 01 00 0A 53 6F 75         /String;)V___Sou
72 63 65 46 69 6C 65 01 00 0A 48 65 6C 6C 6F 2E         rceFile___Hello.
6A 61 76 61 0C 00 07 00 08 07 00 17 0C 00 18 00         java____________
19 01 00 01 48 07 00 1A 0C 00 1B 00 1C 01 00 05         ____H___________
48 65 6C 6C 6F 01 00 10 6A 61 76 61 2F 6C 61 6E         Hello___java/lan
67 2F 4F 62 6A 65 63 74 01 00 10 6A 61 76 61 2F         g/Object___java/
6C 61 6E 67 2F 53 79 73 74 65 6D 01 00 03 6F 75         lang/System___ou
74 01 00 15 4C 6A 61 76 61 2F 69 6F 2F 50 72 69         t___Ljava/io/Pri
6E 74 53 74 72 65 61 6D 3B 01 00 13 6A 61 76 61         ntStream;___java
2F 69 6F 2F 50 72 69 6E 74 53 74 72 65 61 6D 01         /io/PrintStream_
00 07 70 72 69 6E 74 6C 6E 01 00 15 28 4C 6A 61         __println___(Lja
76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29         va/lang/String;)
56 00 21 00 05 00 06 00 00 00 00 00 02 00 01 00         V_!_____________
07 00 08 00 01 00 09 00 00 00 1D 00 01 00 01 00         ________________
00 00 05 2A B7 00 01 B1 00 00 00 01 00 0A 00 00         ___*____________
00 06 00 01 00 00 00 01 00 09 00 0B 00 0C 00 01         ________________
00 09 00 00 00 25 00 02 00 01 00 00 00 09 B2 00         _____%__________
02 12 03 B6 00 04 B1 00 00 00 01 00 0A 00 00 00         ________________
0A 00 02 00 00 00 03 00 08 00 04 00 01 00 0D 00         ________________
00 00 02 00 0E                                          _____