Google Closure是真正的编译器吗?


19

这个问题的灵感来自对此Stack Overflow问题的评论中的辩论。在谷歌关闭编译文档指出以下(强调):

Closure Compiler是使JavaScript下载和运行速度更快的工具。这是一个真正的JavaScript编译器。它不是从源语言编译为机器代码,而是从JavaScript编译为更好的JavaScript。

但是,维基百科给出了“编译器”的以下定义:

编译器是一种计算机程序(或一组程序),可以将以编程语言(源语言)编写的源代码转换为另一种计算机语言。语言。

基于此,我想说Google Closure不是编译器。但是Google明确声明它实际上是一个“真正的编译器”,这一事实使我想知道是否还有更多功能。Google Closure真的是JavaScript编译器吗?


2
我敢打赌它输出的JS是所有合法JS的适当子集;从这个意义上讲,它的输出语言 “另一种”语言。
AakashM 2012年

Answers:


23

Closure Compiler是一个合并,一个优化器和一个验证器。这种类型将其放在自己的类别中,因为您是正确的,编译器至少应采用不会以其当前形式运行的内容,并将其转换为可以使用的内容(以TypeScript为例,基于ECMAScript的示例)。

但是,您是否责怪Google扩展了术语?他们还会怎么称呼它?Google Minifier?不,不仅仅如此,还有数百个。Google优化工具?不仅如此。Google验证程序?不,不仅如此。

所以选择是

  • 将其称为Google Closure Foogle,并将一个全新的,本来毫无意义的词引入词典。
  • 将其称为Google Closure Minoptivalidator,其意图更清晰但更难记。
  • 将其称为Google Closure Compiler,这非常接近事实。

它完成了您希望编译器完成的所有工作,而只是语义上有所不同。最后,在一定程度上,所有单词都由其用法定义。因此,如果Google可以说服人们称其为编译器,则编译器的定义会稍有变化。当然不会以任何方式引起问题。

或者,回到前面的示例,您是否能找到有关TypeScript的重要信息,可以将其称为“真正的编译器”,而Google Closure编译器应限于“几乎是编译器”?


问题的重点只是要真正看到人们认为“编译器”是什么。正如0A0D所说的,这只是语义,但我只是想知道为什么Google认为有必要澄清它是“真正的编译器”。为“ Minoptivalidator” +1!
James Allardice 2012年

@JamesAllardice:再次,因为如果您可以说服人们它是一个编译器,那么编译器的定义会扩展到包括它。在这种情况下,应该这样做是非常公平的。如果您定义了一个新单词,并用语义行将其与编译器分隔开,则您的产品将被归类为“差不多,但不是完全一样”。
pdr 2012年

1
我不知道,我有点喜欢“ Google Foogle” :-)
GrandmasterB

9
我投赞成票Minoptival。听起来像是恐龙。每个人都喜欢恐龙,对吗?
Izkata 2012年

2
@Izkata:如果进化史告诉了我们一件事,那就是不会包含Javascript。Javascript可以自由释放,它可以扩展到新的领域,并会痛苦地甚至可能是危险地冲破障碍。
pdr 2012年

9

基于此,我想说Google Closure不是编译器。

好吧……但是,前提是维基百科在这一点上是权威的。

并且与Wikipedia定义相反,请考虑一些字典定义(来自http://www.thefreedictionary.com/compiler):

2)(计算机科学) -一种程序,它将用高级语言编写的另一个程序转换为机器语言,以便可以执行该程序。

2)(电子与计算机科学/计算机科学)一种计算机程序,通过该程序,高级编程语言(例如COBOL或FORTRAN)被转换为计算机可以使用的机器语言。

与某些编程语言关联的计算机程序,可以将用这些语言编写的指令转换为机器代码,以后可以直接由计算机执行。

当然,这些定义都有些过时,但是它确实说明没有“一个真正的意义”……而且确实,诸如“编译器”之类的术语的意义会随着时间而改变。(而且,IMO很好,因为在这种情况下我们实际上不需要精确的定义。)

讨论Closure编译器是否为“真正的编译器”(IMO)并非卓有成效。了解Google员工在这种情况下“真正的编译器”的含义会更有用。


2
+1,具有讽刺意味的是,JS既是网络的“机器语言”又是“高级编程语言”。
K.Steff

3
+1,再加上“假设Wikipedia在这一点上具有权威性”。太多的人盲目接受那里写的任何东西。
Marjan Venema 2012年

6

我认为可以将其称为“真正的编译器”的原因是,它可以从程序中构建完整的AST(抽象语义树),并使用它来生成新文本。

原始文本和结果文本都是有效的JavaScript的事实仅仅是巧合。

这很重要,因为有许多工具只能执行代码的文本操作(缩小符,修饰符等),却不执行任何AST处理,减少了代码的重新生成。即使这些工具越来越强大,它们也不是同一类软件,并且局限性也不同。


1
谢谢,这是一个有趣的答案。我认为您的解释可能比Wikipedia和其他人引用的各种词典对“编译器”的定义更好。
James Allardice

好吧,我喜欢这个答案,并在某个时候投了赞成票,但我要指出,完全无需构建AST就可以进行编译(以传统的高级语言到机器语言的感觉)。例如,请参阅“ 让我们构建一个编译器 ”。现在可以肯定的是,Crenshaw的教程中的编译器非常粗糙,但是我不相信任何人都指责它不是编译器。
dmckee 2014年

我还没有阅读该参考书,但是我同意明确的AST并非严格用于编译。但是,在大多数情况下,还是有一个等效的结构,要么在数据中显式表示,要么在执行中隐式表示(也许调用堆栈(或其时间演变)反映了语法分析)。我的主要观点是,编译不是文本操作,而是从对某些源代码的分析中生成代码。
哈维尔

4

我认为这是语义。从传统意义上讲,它不是编译器。但是,在同一Wikipedia链接中,它表示

编译器可能会执行以下许多操作或所有操作:词法分析,预处理,解析,语义分析(语法定向翻译),代码生成和代码优化。

闭包执行其中的部分或全部操作。

维基百科的文章稍远一些

但是,在实践中,尽管可以设计在运行时依赖于重新解释的语言,但很少有语言需要专门编译或专门解释。

话虽如此,我的猜测是将其称为“ Closure Compiler ”比“ Closure Optimizer” 更容易,因为实际上它只是针对浏览器优化JavaScript,而不必将其翻译成另一种语言或字节码。

Closure Compiler作为名词是不存在的


这只是语义,您是对的。问题的重点实际上只是看人们如何看待“编译器”。我仍然认为Closure Compiler不是“真正的编译器”,但是它确实执行许多类似的操作。
James Allardice 2012年

3

首先,让我们摆脱源代码到源代码编译器存在的方式。您不能说某些东西不是编译器,因为最终结果不是较低级别的代码。

尽管Closure Compiler生成AST并具有代码生成短语是正确的,但许多Javascript最小化器已经做到了这一点,我可能也不会将它们称为编译器。

真正使Closure Compiler与众不同的是它在错误检测和优化中应用了许多众所周知的编译器技术。这里有些例子:

类型系统:

Closure Compiler定义了带注释的类型系统。它利用了许多编译器用来检查程序错误的类型推断技术。

过程间优化

Closure Compiler构建调用图以在整个程序级别重命名和删除无效代码。

程序内优化

Closure Compiler通过应用不同的控制流分析以及数据流分析来优化Javascript。经典的编译器技术(例如:内联,寄存器分配,实时变量分析等)都被用来从输出Javascript中挤出最后一个字节。

模块系统

Closure Compiler的一个鲜为人知的部分,可用于将您的代码分成单独的下载,以加快启动时间。它也利用了许多图形算法。在“传统”编译器中也很常见。

所有这些编译器和静态分析技术使Closure Compiler与其他Javascript最小化器区别开来。从目标输入和输出语言相同的事实出发,我不明白为什么它没有被归类为“真正的编译器”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.