不使用Java创建.class文件

时间:2012-09-08 20:08:21

标签: java jvm

我正在尝试创建一种名为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规范获取任何线索,但我无法获得任何信息。

2 个答案:

答案 0 :(得分:3)

Java类文件以二进制格式表示字节码,而不是 ASCII文本。这意味着指令在编译形式中并不是真正的人类可读 - 类文件只是一堆原始数据。尝试打开使用javac创建的类文件,并检查输出的外观。有关类文件二进制格式的更多详细信息,您可以在Java class files上看到相关维基百科文章。

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

答案 1 :(得分:3)

我考虑使用像:

这样的字节码库

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

您需要熟悉JVM Specification

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