将Clojure源代码自动转换为Java源代码的最佳方法

19

我希望能够自动将Clojure源代码文件(.clj)转换为等效的Java源代码文件(.java)。 我想知道最好的方法是什么,或者是否有可能实现。 转换后的Java源代码需要足够可接受。


2
当然是“可能”的,因为Clojure编译成JVM字节码,而且有字节码到Java反编译器。但人们怀疑并希望有一种更直接的方法,可以产生质量显著更高的代码... - T.J. Crowder
3
请查看:http://georgejahad.com/clojure/clojureDecompiled.html - phlogratos
是的,我的意思是是否有可能生成具有可读性的Java源代码。 - mudgen
1
请注意,您最终可能仍然依赖于Clojure运行时库。 - Thorbjørn Ravn Andersen
1
可能需要付出很多努力,但我强烈建议不要这样做——自动翻译的代码通常是可怕的,人类难以维护。在Clojure->Java中会更糟糕,因为Clojure有很多在Java中不容易表达的结构(宏?eval?)。你已经被警告了! - mikera
4个回答

18

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

Clojure不只是“带有不同语法的Java”。它的语言结构与Java非常不同,因此许多以Clojure为惯用语的东西在Java中看起来很陌生。

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

如果您想在Java开发人员团队中使用Clojure,我建议将Clojure代码开发和打包为具有良好定义的Java API的Jar文件。Java开发人员会很高兴,因为它只是另一个Java库,而您会很高兴,因为您将编写适当的Clojure代码。


9
我会尝试从.clj文件生成.class文件,然后使用反编译器(如JAD)将其反编译为.java文件。

3
请注意,反编译后的代码将依赖于Clojure的类。因此,您将无法获得“纯粹”的Java代码。不过这可能是最好的解决方案。 - Andreas Holstenson

9
Clojure调试工具包是一款非常出色的工具,可用于深入挖掘编译后的Clojure代码,并展示了Clojure类与从Java源代码生成的类之间的差异。例如,要编写Java代码来表示Clojure的闭包将会很困难(虽然有可能)。
Clojure生成的字节码不能通过编译任何Java程序来生成,因此通用解决方案是不可能的。具体来说,Clojure在进行递归调用之前会将参数(在调用帧中)置空。由于您是从源代码而不是.class文件开始的,只要不尝试保证Java代码将产生完全相同的行为,您应该能够接近原始效果。Clojure可以防止递归中的某些内存泄漏,这在等效的Java代码中将非常难以避免。
“这段代码的目的是将参数置空,以防止递归函数调用时‘持有头部’。”——摘自George Jahad关于反编译Clojure类的讲座。http://georgejahad.com/clojure/clojureDecompiled.html

5

我不太熟悉Clojure,但需要注意的是,通常可以读取Lisp程序并将其视为数据结构,这比处理已编译的Clojure代码更好,因为后者强烈依赖于Clojure运行时。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接