【问题标题】:How does the Clojure compiler generates JVM bytecode?Clojure 编译器如何生成 JVM 字节码?
【发布时间】:2014-03-05 17:06:34
【问题描述】:

Clojure 编译器(它只是一个 jar/java 应用程序)使用什么库/api 来生成 JVM 字节码?我很好奇,因为字节码是在运行时由 java 而不是 javac 生成的,所以它是一个输出 jvm 字节码的 java 程序。

【问题讨论】:

    标签: java compiler-construction clojure compilation


    【解决方案1】:

    Clojure 使用名为 ASM 的 Java 库来生成字节码。部分 lib 的 fork 被嵌入到 clojure 项目中:https://github.com/clojure/clojure/tree/master/src/jvm/clojure/asm

    【讨论】:

    • 它实际上是 ASM 的一个子集。作为 Clojure 1.6 的一部分,该子集最近在 master 中更新为 ASM 4.1。
    【解决方案2】:

    Clojure 编译器如何生成 JVM 字节码?

    这只是 Java 编程(除非他们将代码生成器引导到 Clojure ......这似乎不太可能)。作为一个粗略的简化1,打开一个文件,按照JVM规范指定的“classfile”格式写出代码,然后关闭文件。 (或将代码写入 ByteArrayOutputStream 或等效项。)

    郑重声明,Clojure 编译器所做的工作与 Java 编译器在运行时调用时可以做的工作并没有本质上的区别。但显然,由于语言的不同,以及各个开发人员的不同想法和优先级,细粒度的细节会有所不同。


    1 - 如果您想了解代码生成器的一般工作原理,请阅读有关编译器编写的教科书。有关 Clojure 是如何做到这一点的所有血腥细节,请查看源代码...

    【讨论】:

    • 我所知道的关于 Clojure 和 Java 字节码生成的一个例外是 Clojure 本地清除,它没有 Java 模拟 iirc。
    • 有一个CinC(Clojure in Clojure)项目,不使用任何Java代码就可以生成Clojure字节码,但还不成熟。
    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多