【问题标题】:byte code, libraries and Java字节码、库和 Java
【发布时间】:2011-08-18 11:49:32
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: java bytecode


    【解决方案1】:

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

    编辑:

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

    【讨论】:

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

    我认为这对实践没有多大帮助,但它有很多甜蜜的理论知识,我认为你会发现它们很有用。

    http://www.codeproject.com/KB/recipes/B32Machine1.aspx

    【讨论】:

      【解决方案3】:

      用于字节码生成/操作的优秀库是 ASM:http://asm.ow2.org

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • @Peter 老实说,最初几乎写了 yacc 然后我记得问题是关于 Java :)
        【解决方案5】:

        Java Virtual Machine Spec 应该可以满足您的大部分需求。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-15
          • 1970-01-01
          • 1970-01-01
          • 2016-07-09
          • 2010-09-10
          • 1970-01-01
          相关资源
          最近更新 更多