3

我们在以下博客条目中看到:http: //blog.fogus.me/2011/07/21/compiling-clojure-to-javascript-pt1/一些非常令人难以置信的语法转换,对 javascript 编程语言的简化,由谷歌闭包编译器。

我的问题是 - 有没有什么东西可以为 Java 提供这些语法转换?

4

3 回答 3

5

Closure 编译器以它的方式工作,因为 JavaScript 与 Java 不同,通常以源代码形式分发。因此,重命名变量和消除空格等操作不适用于 Java,因为 Java 应用程序通常以字节码的形式分发(通常打包在 JAR 文件中)。

至于其余的优化,Java 编译器和 Hotspot JVM 本身结合了许多非常擅长优化应用程序和提高性能的技术:其中许多只是在您不知道它们存在的情况下发生。

于 2011-07-31T02:39:00.020 回答
3

作为一般规则,Java 编译器可以/执行一些通常有用的优化来生成 JVM 代码。然后,JVM 中的 JIT 编译器会在生成本机机器代码时进行更多优化。由于这两个对您来说都是自动且不可见的,因此您不会注意到,但您不需要明确地执行它们。

在您的程序上下文中,总有一些 Java 编译器和 JIT 编译器无法知道的转换。对于这些,您理想地想要某种源到源程序转换系统,它可以读取源代码,将其解析为某种工具内部结构(通常是 AST),应用您在此定义的“令人难以置信的语法转换”内部结构,然后用您的语言重新生成源代码。

我们的DMS Software Reengineering Toolkit (commercial) 就是这样一个引擎;它处理多种语言。DMS 有一个Java 1.6 前端,它构建完整的符号表并提供控制和数据流分析,这是实现更复杂转换所必需的。

免费(大学研究)的替代品是StrategoTXL,它们都有一些(我不知道的)成熟的 Java 解析器,但绝对不提供符号表或任何类型的流分析,这意味着你必须构建这些或不好的近似值你自己。有些人可能会建议ANTLR,它也有一个 Java 前端,可能构建 AST,很可能不构建符号表,并且不提供典型转换系统所做的其余机制(源到源转换,源文本的再生等)

如果您对 Java 编译器的功能感到满意,那么您不需要任何这些。如果它做得不够,那么你想要这样的东西。[您提出这个问题的事实表明您对 Java 编译器不做的事情有所了解。需要详细说明吗?]

于 2011-07-31T02:49:59.240 回答
0

我的问题是 - 有没有什么东西可以为 Java 提供这些语法转换?

海事组织,不是真的。

  • Google Closure 编译器将 Javascript 作为输入并执行(相对语义丰富的)Javascript AST 的高级转换。

  • Java 字节码编译器可以做,但显然在 Java AST 级别的优化方面做得不多。相反,他们将大部分优化留给了 JIT 编译器……它从(相对语义较差的)类文件开始进行优化;即字节码。

这使得 JIT 编译器更难进行 Google Closure 编译器可以进行的优化。

那么为什么没有与 Google Closure for Java 相当的东西呢?有两个可能的原因:

  • 因为没有人做过。(我不记得任何具体的例子......)

  • 因为没有优化的机会,对于普通的手写 Java 输入。

  • 技术原因(见下文)。

IMO 这主要是第二个原因。Javascript 和典型 Javascript 程序的动态特性意味着有更多通过 AST 转换进行优化的机会,并且 AST 级优化器将为普通代码实现更显着的加速。

现在,很可能生成 Clojure 编译器的 Java 源代码将为AST 级优化提供更多机会。重新审视以前对 Java 的 AST 级优化的尝试可能是一个好主意(假设它们存在)。

我上面提到的“技术原因”包括以下内容:

  • Java 中某些反射和自省工具的存在实际上是优化的障碍。例如,Java 编译器不能进行尾调用优化的原因是它破坏了无法查看调用堆栈的 Java 代码。一个例子是安全经理。

  • Java 字节码编译器主要在单个编译单元的级别上运行;即单个类/接口/等。Google Closure 编译器执行的高级优化涉及包含许多类的输入文件。

于 2011-07-31T04:20:03.500 回答