我们在下面的博客中看到:http://blog.fogus.me/2011/07/21/compiling-clojure-to-javascript-pt1/一些令人难以置信的语法转换,对javascript编程语言所做的简化,由谷歌闭包编译器完成。
我的问题是-有什么东西可以为Java提供这种语法转换吗?
发布于 2011-07-31 10:49:59
作为一般规则,Java编译器可以/执行一些通常有用的优化来生成JVM代码。然后,JVM中的JIT编译器在生成本机代码时进行更多的优化。因为这两个都是自动的并且对您来说是不可见的,所以您不会注意到,但您不需要显式地执行它们。
Java编译器和JIT编译器不知道如何在您的程序上下文中进行转换。对于这些,理想情况下您需要某种源代码到源代码的program transformation系统,它可以读取源代码,将其解析为某种工具内部结构(通常是AST),应用您在该内部结构上定义的“令人难以置信的语法转换”,然后用您的语言重新生成源代码。
我们的DMS Software Reengineering Toolkit (商业版)就是这样一个引擎;它可以处理多种语言。DMS有一个Java 1.6 front end,它构建完整的符号表,并提供控制和数据流分析,这是实现更复杂的转换所必需的。
免费的(大学研究)替代方案是Stratego和TXL,它们都有某种(我不知道)成熟度的Java解析器,但绝对不提供符号表或任何类型的流分析,这意味着您必须自己构建这些解析器或糟糕的近似解析器。有些人可能会建议ANTLR,它也有Java前端,可能构建AST,很可能不构建符号表,也不提供典型转换系统所做的其余机制(源到源的转换,源文本的重新生成等)。
如果您对Java编译器所做的事情感到满意,那么您就不需要这些了。如果它做的还不够,那么你想要这样的东西。您问了这个问题,这表明您对Java编译器不能完成的事情有了一些想法。介意详细解释一下吗?
发布于 2011-07-31 10:39:00
闭包编译器的工作方式是因为JavaScript与Java不同,它通常是以源代码形式分发的。因此,重命名变量和消除空格等操作不适用于Java,因为Java应用程序通常是以字节码(通常打包在JAR文件中)的形式分发的。
至于其余的优化,Java编译器和Hotspot JVM本身结合了许多非常擅长优化应用程序和提高性能的技术:其中许多技术在您不知道它们存在的情况下就发生了。
发布于 2011-07-31 12:20:04
我的问题是-有什么东西可以为
提供这种语法转换吗?
国际海事组织,不完全是。
这使得JIT编译器更难做Google Closure编译器可以做的那种优化。
那么为什么没有一个等同于Google Closure for Java的工具呢?有两个可能的原因:
我想这主要是第二个原因。Javascript和典型Javascript程序的动态特性意味着有更多的机会通过AST转换进行优化,并且AST级别的优化器将为正常代码实现更显著的加速。
现在,Clojure编译器生成的Java源代码很可能会提供更多的AST级优化机会。回顾一下以前对Java进行AST级优化的尝试(假设它们存在)可能是一个好主意。
我上面提到的“技术原因”包括:
https://stackoverflow.com/questions/6887180
复制相似问题