2

我正在尝试创建一种名为 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 字节码在 JVM 之上编写编程语言。所以只有我想尝试一下。我没有编程语言设计的经验。所以任何帮助都会非常有用。我确实通过 Java 规范寻找任何线索,但我什么也得不到。

4

2 回答 2

3

Java 类文件以二进制格式而不是ASCII 文本表示字节码。这意味着这些指令在编译后的形式中并不是真正的人类可读的——类文件只是一堆原始数据。尝试打开您创建的类文件javac并检查输出的样子。有关类文件二进制格式的更多详细信息,您可以查看有关Java 类文件的相关 Wikipedia 文章。

与其直接输出二进制字节码,不如使用Soot作为编译器链中的中间工具来创建类文件。

于 2012-09-08T20:16:57.013 回答
3

我会考虑使用一个字节码库,如:

您几乎肯定不想在二进制级别工作。

您需要非常熟悉JVM 规范

我强烈建议在深入杂草之前查看其他简单的 JVM 语言;事情变得相当复杂,相当快。开发 JVM 语言本身并不需要 Java 经验,但这并非易事,而且您确实需要相当多的知识才能走得更远。

于 2012-09-08T20:21:34.127 回答