【问题标题】:Best Way to Convert Clojure Source to Java Source Automatically将 Clojure 源代码自动转换为 Java 源代码的最佳方法
【发布时间】:2011-07-02 16:05:02
【问题描述】:

我想获取工作 Clojure 源代码文件 (.clj) 并将它们自动转换为等效的 java 源代码文件 (.java)。我想知道最好的方法是什么,或者是否有可能。转换后的 java 源代码需要足够可接受。

【问题讨论】:

  • 这绝对是可能,因为Clojure编译成JVM字节码,还有字节码到Java的反编译器。但有人怀疑并希望有一条更直接的途径可以产生更高质量的代码......
  • 是的,我的意思是可以生成具有任何可读性的 Java 源代码。
  • 请注意,您最终可能会依赖于 clojure 运行时库。
  • 可能需要付出很多努力才能实现,但我强烈反对这个想法——自动翻译的代码通常很糟糕,人类无法维护。在 Clojure->Java 中情况会更糟,因为 Clojure 有很多在 Java 中不容易表达的结构(宏?eval?)。您已被警告!

标签: java clojure


【解决方案1】:

正如其他人所指出的,您最好的选择是使用字节码反编译器。不过,您仍然需要 clojure 类。但是,更重要的是,如果您的目标是生成需要由 Java 程序员处理的 Java 代码,那么您就不太可能成功。

Clojure 不仅仅是“具有不同语法的 java”。它的语言结构与 java 如此不同,以至于许多惯用 Clojure 的东西在 Java 中看起来很陌生。

即使您的 Java 代码看起来或多或少具有可读性,您的 Java 开发人员也会感到非常沮丧。他们基本上仍然需要编写 Lisp,但使用 Java 语法和非常奇怪的结构:这将是一团糟。

如果您希望在 Java 开发人员团队中使用 Clojure,我会尝试使用定义明确的 Java API 将您的 Clojure 代码开发和打包为 jar。 Java 开发人员会很高兴,因为它只是另一个 java 库,而您会很高兴,因为您将编写正确的 Clojure 代码。

【讨论】:

    【解决方案2】:

    我会尝试从 .clj 生成 .class 文件,然后使用反编译器将其反编译为 .java,例如贾德。

    【讨论】:

    • 另外请记住,反编译的代码将依赖于 Clojures 类。所以你不会得到“纯”的Java代码。不过,这可能是最好的解决方案。
    【解决方案3】:

    Clojure 调试工具包是挖掘已编译 Clojure 代码的出色工具,它展示了 Clojure 的类与从 java 源代码生成的类的一些不同之处。 例如,很难编写 java 代码来表示 Clojures 闭包(尽管有可能)

    Clojure 产生的字节码是编译任何java程序都无法产生的,所以不可能有一个通用的解决方案。具体来说,Clojure 在进行递归调用之前会清空参数(在调用框架中)。由于您是从源代码而不是 .class 文件开始的,因此您应该能够足够接近,只要您不尝试保证 java 代码会产生完全相同的行为。 Clojure 防止了递归中的一些内存泄漏,这在等效的 java 代码中很难避免。

    “这段代码的目的是在递归函数调用的情况下将参数清空,以防止'保持头部'。”来自 George Jahad 关于反编译 clojure 类的演讲。 http://georgejahad.com/clojure/clojureDecompiled.html

    【讨论】:

      【解决方案4】:

      我对 Clojure 不是很熟悉,但请注意,您通常可以读取 Lisp 程序并将其视为数据结构,这很可能比处理已编译的 Clojure 代码更好,因为这在很大程度上取决于 Clojure 运行时。

      如果这是针对您自己的程序,那么您可能可以使用完整 Clojure 的一个非常小的子集,并且您可能可以使用一个小程序生成器来处理自己。

      【讨论】:

        猜你喜欢
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        • 2013-02-24
        • 1970-01-01
        • 2011-01-29
        • 2021-10-22
        相关资源
        最近更新 更多