我正在尝试创建一种名为Mango的玩具编程语言。我首先希望它编译成Java并作为Java编译和执行。但我发现这是一个非常缓慢的方法。所以我决定将它编译成Java Byte Code并执行它。我已经给出了芒果代码和等效的java代码。你能帮我把我的芒果代码编译成带有字节码的等效.class文件。
在test.mango中
println("Hello World!")
等于
public class test
{
public static void main(String[] args){
System.out.println("Hello World!")
}
}
我在test.java上使用 javap 来生成以下字节码
Compiled from "test.java"
public class test extends java.lang.Object{
public test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String Hello World!
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
但是当我将其保存为test.class并执行它时,我在命令提示符
中收到以下错误java.lang.ClassFormatError: Incompatible magic value number 1131375984
我只学了两个学期的Java编程。我的教授告诉我,你可以使用Java Byte Code在JVM之上编写编程语言。所以只有我想尝试一下。我没有编程语言设计的经验。所以任何帮助都会非常有用。我确实通过Java规范获取任何线索,但我无法获得任何信息。
答案 0 :(得分:3)
Java类文件以二进制格式表示字节码,而不是 ASCII文本。这意味着指令在编译形式中并不是真正的人类可读 - 类文件只是一堆原始数据。尝试打开使用javac
创建的类文件,并检查输出的外观。有关类文件二进制格式的更多详细信息,您可以在Java class files上看到相关维基百科文章。
您可以使用Soot作为编译器链中的中间工具来创建类文件,而不是直接输出二进制字节码。
答案 1 :(得分:3)
我考虑使用像:
这样的字节码库你几乎肯定不想在二进制级别工作。
您需要熟悉JVM Specification。
我强烈建议在深入杂草之前先查看其他简单的JVM语言;事情变得相当复杂,相当快。您不需要Java经验来开发JVM语言,但这并非易事,而且您需要相当多的知识才能获得更多。