不使用Java创建.class文件

不使用Java创建.class文件,java,jvm,Java,Jvm,我正在尝试创建一种名为Mango的玩具编程语言。我首先希望它能够编译成Java,并作为Java进行编译和执行。但我发现这是一个非常缓慢的方法。所以我决定将它编译成Java字节码并执行它。我已经给出了mango代码和等价的java代码。你能帮我把我的芒果代码编译成带有字节码的等效.class文件吗 芒果 println("Hello World!") 等于 public class test { public static void main(String[] args){

我正在尝试创建一种名为Mango的玩具编程语言。我首先希望它能够编译成Java,并作为Java进行编译和执行。但我发现这是一个非常缓慢的方法。所以我决定将它编译成Java字节码并执行它。我已经给出了mango代码和等价的java代码。你能帮我把我的芒果代码编译成带有字节码的等效.class文件吗

芒果

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
}

我只学了两个学期的Java编程。我的教授告诉我,可以使用Java字节码在JVM上编写编程语言。所以只有我想尝试一下。我没有编程语言设计的经验。所以任何帮助都会非常有用。我确实查阅了Java规范以寻找任何线索,但没有得到任何线索

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


<>而不是直接输出二进制字节码,也许你可以作为编译器链中的中间工具来创建你的类文件。

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

  • (可能;很久没看了)
您几乎肯定不想在二进制级别工作

您需要非常熟悉


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

javac
是编译器,而不是
javap
@Jeffrey我确实知道javac是Java编译器。但是Javap从java文件生成字节码
1131375984
是四个字节
43 6F 6D 70
,它们是
javap
输出以(
Comp
)开头的字符的ASCII(甚至UTF-8)编码。这是一个问题,因为
javap
实际上并不发出
.class
文件,而是生成字节码文件的可读分析。@Adhithya-
javap
实际上并不“从java文件中生成字节码,`而是从类文件中提取一些信息,并以人类可读的格式打印出来。请看下面我的答案。@Adhithya您似乎混淆了编译器和JVM
javac
除了源代码形式的Java代码外,什么都不懂。JVM与字节码有关(特别是执行字节码)。正如其他人已经解释过的,它期望字节码的唯一官方表示形式:紧凑的二进制格式。感谢您提供的信息。我一定会调查煤烟!
java.lang.ClassFormatError: Incompatible magic value number 1131375984