是否有一个与谷歌闭包(googleclosure';s针对javascript和Java的优化?

是否有一个与谷歌闭包(googleclosure';s针对javascript和Java的优化?,java,optimization,refactoring,compiler-optimization,google-closure-compiler,Java,Optimization,Refactoring,Compiler Optimization,Google Closure Compiler,我们在下面的博客中看到:一些令人难以置信的语法转换,对javascript编程语言的简化,由Google闭包编译器完成 我的问题是-有什么东西可以为Java提供这种语法转换吗?闭包编译器的工作方式是这样的,因为JavaScript与Java不同,通常是以源代码形式分发的。因此,重命名变量和消除空白等操作不适用于Java,因为Java应用程序通常以字节码的形式分发(通常打包在JAR文件中) 至于其余的优化,Java编译器和Hotspot JVM本身包含了许多技术,这些技术非常擅长于优化应用程序和提

我们在下面的博客中看到:一些令人难以置信的语法转换,对javascript编程语言的简化,由Google闭包编译器完成


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

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


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

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

Java编译器和JIT编译器不知道如何在程序上下文中进行转换。对于这些,理想情况下您需要某种源到源系统,它可以读取源代码,将其解析为某种工具内部结构(通常是ASTs),应用您在该内部结构上定义的“难以置信的语法转换”,然后用您的语言重新生成源代码

我们的(商业)就是这样一个引擎;它可以处理多种语言。DMS具有构建完整符号表并提供控制和数据流分析的功能,这是实现更复杂转换所必需的

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

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

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

在我看来,不是真的

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

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

这使得JIT编译器很难像Google闭包编译器那样进行优化

那么,为什么没有一个类似于Google闭包的Java呢?可能有两个原因:

  • 因为没有人做过。(我想不起任何具体的例子……)

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

  • 技术原因(见下文)

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

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

我上面提到的“技术原因”包括:

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

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


动态程序比静态程序更难推理;优化JavaScript(以“eval”为例)应该比优化Java更难。工具无法读取Java源代码,或者无法读取大量Java编译单元,这并不是先天原因。这些工具确实存在;请看我的答案(我们的工具实际上将读取大量Java文件并在集合上执行转换)。@Ira Baxter-通用的再工程工具包不是Java源代码优化器。假设这些技术是相关的,您可以使用前者构建后者。但总得有人这么做。如果您确实完成了这项工作,并且基准测试显示它在广泛的普通Java输入中提供了良好的结果。。。闭包编译器的目标之一是使JavaScript程序“更小”,以实现更高效的web交付。