给定Java中的任何编译程序,是否可以在Clojure中编写一个字节码等效版本?

时间:2011-02-28 16:16:16

标签: java clojure bytecode

Clojure在JVM上运行,理论上应该能够做Java可以做的任何事情,因为Java互操作,但这在字节码级别是否真的如此?我使用字节码等效来限制性能,我假设您可能不得不跳过编写惯用代码。如果可以,这是否需要使用字节码生成库?

更具体地说,我感兴趣的是存在奇怪的角落情况,其中Java提供了以完全不同的方式构建字节码的构造。我对纯语言层面的表达不感兴趣,而是对clojure在clojure或任何新原语中编写clojure的能力的进展感兴趣。

4 个答案:

答案 0 :(得分:3)

没有。举个例子,我认为有一种方法可以在clojure中创建一个if语句,该语句生成与Java程序相同的字节码。

答案 1 :(得分:3)

Clojure程序总是会有额外的运行时间负担,这可能使它们不适合极低资源情况(如Android)。但是如果你不介意花费额外的几兆字节,那么你总是可以通过抛出窗口来实现Java级别的性能。

Alex Osborne有一个优化Clojure程序的好例子,直到它将Java竞争对手吹走:http://meshy.org/2009/12/13/widefinder-2-with-clojure.html(当然,同样的注意力也可以加速Java版本。)

答案 2 :(得分:3)

近乎完整的1.3版本的目的是让重要部分(核心库和集合)能够生成字节码等效类。这是正在进行的clojure-in-clojure目标的一部分。

最终Clojure应该为java中具有等价物的所有东西生成等效但不相同的字节码。 Clojure可以代表java所不具备的东西(比如闭包),当然这些东西不会等同于#34;。

答案 3 :(得分:1)

否:在Clojure中创建的Java程序往往会更大(就最终字节码大小而言),因此无法创建与字节码相同的文件 - 这并不重要。

在功能方面,Clojure java interop非常好,因此与任何Java代码相比,您可以创建功能等效的代码,具有渐近等效的性能特征。 (可能有一些极其模糊的Java功能在Clojure中不可用,但我相信在这一点上,java interop in clojure的覆盖率几乎达到100%。)