ECMAScript:Harmony / ES6 到 JavaScript 编译器

43

在阅读Peter关于JavaScript的文章后,我注意到

Brendan Eich表示,Harmony的一个目标是成为更好的to-JavaScript编译器的目标。

目前有两个流行的编译器,它们有一些模糊的ES:Harmony兼容性:

虽然CoffeeScript有一些兼容性,但它并不是专门设计成ES:Harmony编译器,因此对此无用。

Tracuer似乎更严格地遵循ES:Harmony规范,但我不知道它是否打算成为完整的ES:Harmony编译器。

由于目标是将ES6编译为ES3,因此还需要支持ES5特性(可能需要切换ES5到ES3或ES6到ES3的编译方式)。

  1. 目前是否有其他项目旨在创建完整的ES:Harmony到ES3编译器?
  2. 是否明智开始编写这样的编译器,知道标准还年轻/不稳定/变化中?
  3. 目前是否有ES5 -> ES3编译器?

我在Traceur邮件列表上留了一个问题。

这样一个编译器的目标是与ES3向后兼容,而不是完全模拟ES5和ES6在ES3中的行为。


好问题。至少,谷歌员工希望Traceur成为一个几乎支持所有地方的游乐场,但是他们是否打算将其作为带有开关的编译器,我敢打赌我们必须等待团队成员确认。另外,ES6/5中有一些功能无法简单地编译回ES3,因此您永远无法获得完整的编译支持。 - Tower
@rfactor 取决于您所说的功能,我们无法保留所有新API /语法的大O复杂度,但我们可以完全模拟它们。 - Raynos
3
Brendan Eich所说的话并不是关于Harmony成为编译为ES3/5的好语言的目标。这句话是关于Harmony成为其他语言编译的更好目标的。有很多语言可以编译成JavaScript。Harmony的目标是成为基本水平更高的语言,例如Web的“汇编语言”。 - Nathan Wall
8个回答

14

(下面是不要脸但相关的推广)

Caja正在通过ES5/3重新设计其ES5支持,并将对ES Harmony进行同样的操作。因此,我们的结构将被实现为一个Harmony到ES3层,可以跳过真正的Harmony实现,然后是一个可分离的加载器,保留关于caja的安全属性。

与Traceur一样,Caja团队的成员是ES Harmony定义委员会TC39的一部分。

我不知道Coffeescript的计划,但在讨论Harmony模块时提到了它。模块加载器可能具有拦截加载的源代码(通过eval hooks)并在模块初始化之前重写它的功能,所以如果一个模块是用CoffeeScript编写的,则可以在初始化时调用运行时的CoffeeScript重写器。这将允许应用程序由使用多种语言编写的模块组成,这些语言在加载时编译为Harmony。

需要注意的是,并非Harmony中的所有内容都可以通过翻译轻松实现。例如,要正确实现弱映射,需要在JavaScript中实现自己的垃圾收集器,即使您这样做了,您可能仍会重新引入主机对象/本地对象循环问题。


1
我的兴趣在于一个只编译正确的ES5/ES:Harmony到ES3的编译器。它遵循规范,不会给你任何额外的东西。这样每个人都可以编写ES:Harmony,但仍然支持IE9/10、FF4/5、Saf5、Op11等浏览器。 - Raynos
1
@Raynos,这也是我与Caja所讨论的内容。Caja目前在其安全工作之外实现了ES5严格模式,而与ES3分离。当Harmony接近完成时,我们可能会采取同样的策略以实现向前兼容性。 - Mike Samuel
@MikeSamuel,你的ES5/3实现还额外做了一些事情,无论是出于设计还是因为浏览器支持限制。如果是前者,那么我们有不同的目标;如果是后者,你可能需要在页面上提到它 :) - Raynos
@Raynos,我们正在寻找缩小ES5/3和本地ES5之间差异的方法。有一件事情不太可能消失,那就是“仅限严格模式”的限制,因为我们没有非严格模式的客户端。一些差异,比如原始的this强制转换,是由于浏览器的限制/性能要求造成的。 - Mike Samuel
@MikeSamuel,你的目标仍然是防御;安全地暴露evalFunction是一个巨大的任务,而我提供下降编译器的目标支持evalFunction,因为有一对一的映射。此外,还有各种功能,如“严格模式”,不必在编译器中支持,因为目标是向后兼容而不是完全仿真。除此之外,我希望用JavaScript编写编译器 ;) - Raynos
显示剩余3条评论

11

看看TypeScript,这是微软基于ES6发布的新语言。


3
对于许多ES6的结构特性来说,功能非常强大,如果加入一些shim来填补缺失的ES6方法和对象(因为TypeScript几乎没有运行时存在),那么就更好了。 - Bartvds
TS 更像 ES6 而不是 CoffeeScript。cs 则更像 Ruby 而不是 ES6。 - Martin

8

Continuum 已经实现了大部分相关功能,可以在es3浏览器(如旧版IE)中运行。


4

睫毛膏可能是你正在寻找的东西。


3
虽然这很好,但它并不遵循ES6标准,只是基于它。我不想要一个“更好的JavaScript”-> JavaScript编译器。我想要一个忠实的ES: Harmony-> ES3编译器,并且它应该是开源的! - Raynos
1
“它应该是开源的” - 我不记得你在帖子里提到过这个。并不是所有好的东西都是开源的,Raynos。此外,如果你真的需要进行更改,你可以反编译 .pyc 文件。更不用说 Traceur 只是基于 ES Harmony,而不是它的实现了。 - Eli Grey
2
这是真的。但至少它是开源的,因此可以分叉以完全符合ES Harmony标准。编译器应该真正成为一个操作系统社区项目。 - Raynos
1
@Raynos:ES:Harmony/ES6 还不是一个完成的标准(就像 ES5 一样),它仍然只是一组正在考虑中的提案。因此,目前没有任何一种替代方案可以忠实地实现。 - JacquesB
1
@JacquesB 他们至少可以尝试保持忠实 ;) es:h转译器和受es:h启发的X -> JS编译器之间存在差异 - Raynos

4
截至本次打字时,我们现在有 Babel。它与许多不同的构建工具/系统集成,在转译ES6+以支持旧版浏览器方面发挥作用(它没有说明它针对哪个版本,但它确实指出它针对IE9+)。
要安装它,请键入npm install babel -g
请注意,它有相当多的依赖项,安装后大约为23.4 MB(2888个文件)。

3

Google Closure Compiler (Github)是一个很好的ES6编译工具。它是一个简单的Java jar,可从命令行使用。还有其他选项,如API服务和GUI,但我发现最好建立一个自动构建系统,连接到Java JAR。它可以将您的ES6代码转换为与ES5兼容的代码。我开始使用它来压缩和混淆代码,但它也可以进行错误检查和ES6转换,如我所提到的。

请注意,ES6功能标记为实验性。但是,由于我的测试非常稳定,我计划很快在生产中使用它们。


你好,请问有什么命令可以将 ES6 转换为 ES5 吗? - Ned
1
java -jar compiler.jar --language_in ECMASCRIPT6 --language_out ECMASCRIPT5 --js_output_file=app.min.js app.js。要查看它的所有选项,请检查java -jar compiler.jar --help - Avindra Goolcharan

1

还有https://github.com/matthewrobb/six

Six是JavaScript的语言超集,通过转译器,允许您在今天的脚本中使用ECMAScript第6版的新语法特性。

警告:仍处于非常早期的状态,请谨慎操作。


2
项目已暂停,最后一次提交是8个月前。 - Radek
我认为“更好的JavaScript”市场已经被CoffeeScript饱和了。即使微软和谷歌创建了“更好的JavaScript”(Dart / TypeScript),似乎也没有人在意。尽管我并不是CoffeeScript用户(对我来说纯js已经足够好了),但我还是这么说。 - Camilo Martin

0

我不确定在什么情况下将编译返回到ES3比ES5更有价值,因为实现更改仅限于数组和对象帮助函数,并且ES5支持如此普遍

因此,为了完整起见,Square的esnext项目是另一个ES6到ES5编译器。它是一组设计用于填充各种ES6功能的模块,提供在一个软件包中。以下是包含的模块列表:https://github.com/square/esnext#available


我能立刻想到的唯一一个地方是在Windows上,使用Windows脚本宿主运行.js文件,它使用ES3,并没有升级的计划。 - zumalifeguard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接