Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自动将Clojure源代码转换为Java源代码的最佳方法_Java_Clojure - Fatal编程技术网

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

自动将Clojure源代码转换为Java源代码的最佳方法,java,clojure,Java,Clojure,我想获取正在工作的Clojure源代码文件(.clj),并自动将它们转换为等效的java源代码文件(.java)。我想知道做这件事最好的方法是什么,或者是否可能。转换后的java源代码需要足够的可接受性。我会尝试从.clj生成.class文件,然后用反编译器(如JAD)将其反编译为.java。我对Clojure不太熟悉,但请注意,一般来说,您可以在Lisp程序中阅读并将其视为数据结构,这很可能比处理已编译的Clojure代码要好,因为这在很大程度上取决于Clojure运行时 如果这是针对您自己的

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

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

我对Clojure不太熟悉,但请注意,一般来说,您可以在Lisp程序中阅读并将其视为数据结构,这很可能比处理已编译的Clojure代码要好,因为这在很大程度上取决于Clojure运行时


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

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

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

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


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

Clojure调试工具包是挖掘已编译Clojure代码的优秀工具,它演示了Clojure类与从Java源代码生成的类的一些不同方式。 例如,编写java代码来表示Clojures闭包是很困难的(尽管这是可能的)

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


“这段代码的目的是消除参数,以防止在递归函数调用的情况下‘抓住头部’。”摘自George Jahad关于反编译clojure类的演讲

这绝对是可能的,因为Clojure编译成JVM字节码,Java反编译器也有字节码。但是有人怀疑并希望有一种更直接的途径可以产生更高质量的代码……看看:是的,我的意思是,有可能产生任何可读性的Java源代码。请注意,您最终可能会依赖clojure运行时库。这可能需要很多努力,但我强烈反对这种想法——自动翻译的代码通常是可怕的,人类无法维护。在Clojure->Java中情况会更糟,因为Clojure有很多不容易在Java中表达的构造(宏?eval?)。你被警告了!还要记住,反编译的代码将依赖于Clojures类。因此,您不会得到“纯”Java代码。不过,这可能是最好的解决方案。