字节码、库和Java

字节码、库和Java,java,bytecode,Java,Bytecode,如果我想为Java创建一种新语言,我应该制作一个能够生成与JVM规范兼容的字节码的编译器,对吗?还有JDK库 我在哪里可以找到一些信息 谢谢。应该有您所需要的大部分。我将从生成Java源代码的编译器开始。您可能会发现这更容易阅读/理解/调试。稍后,您可以对其进行优化以生成字节码 编辑: 如果您有一些无法轻松转换为Java代码的特性,那么您应该能够使用Jasmin创建少量字节码类,以及所有可以测试到极致的外来功能。从生成的Java代码来看,这看起来像一个普通的方法调用。JVM仍然可以内联该方法,因

如果我想为Java创建一种新语言,我应该制作一个能够生成与JVM规范兼容的字节码的编译器,对吗?还有JDK库

我在哪里可以找到一些信息


谢谢。

应该有您所需要的大部分。

我将从生成Java源代码的编译器开始。您可能会发现这更容易阅读/理解/调试。稍后,您可以对其进行优化以生成字节码

编辑:

如果您有一些无法轻松转换为Java代码的特性,那么您应该能够使用Jasmin创建少量字节码类,以及所有可以测试到极致的外来功能。从生成的Java代码来看,这看起来像一个普通的方法调用。JVM仍然可以内联该方法,因此这可能根本不会影响性能。

取决于您所说的“为Java创建一种新语言”——您是指编译成字节码的语言,并且它生成的代码可以从任何Java应用程序(例如Groovy)或解释语言(您想用Java编写解析器)中使用?
如果是前一个,那么@Joachim是正确的,请查看JVM规范;对于后者,请看一下JavaCC为您的语言语法创建解析器的例子。

一个用于字节码生成/操作的优秀库是ASM:


它是非常通用和灵活的。但是请注意,它的API是基于事件的(类似于Sax解析器)——它读取.class文件,并在遇到新实体(类声明、方法声明、语句等)时调用方法。一开始这可能看起来有点尴尬,但它节省了大量内存(与另一种方法相比:库读取输入,吐出一个完全进化的树结构,然后你必须对它进行迭代)。

我认为这在实际中不会有多大帮助,但它有很多甜美的理论内容,我认为你会发现它们很有用


@老实说,彼得最初几乎写过yacc,但我记得问题是关于Java的:)我认为编译成Java还是字节码更容易取决于语言类型。@Paŭlo Ebermann,没错,但是,也可以很容易地证明生成的代码是正确的,并在它不能按预期的方式工作时进行调试。调试/验证字节码并非微不足道。VerifyError可能比编译器错误更神秘,因此在某些情况下值得付出额外的努力。;)你是对的,对于大多数语言来说这会更好。只有使用不能直接映射到Java的特性的语言才需要直接编译器。(例如,
goto
必须在Java中使用循环和复杂的continue/break用法来实现,可能还需要一个开关。在字节码中有一个goto操作码,所以没有问题。)您可以将goto映射到Java中,并使用循环和到标签的中断。;)