JavaScript 正在变成 Web 界的 C++

2015-08-14 09:00:59 +08:00
 ibloging

早在2009年当我开始读博的时侯,我告诉导师,我想选择优化动态编程语言的方向。我的论文很大的一部分将涉及一些动态JIT语言编译器的实现,最后我们的讨论集中在应该选择哪种语言。最后,我们最终选择了JavaScript。这是一个很好的方案:被广泛使用的“现实世界”中的编程语言,还有一点,这种语言足够轻量,一个人就可以实现编译器。 ECMAScript 5的规范大概250页长,我把它从头读到尾,然后开始设计Higg。

从那以后,我觉得我一直在看着JavaScript慢慢变成C++,它成为了“kitchen sink”式的语言(注*来自二战时期的成语"everything but the kitchen sink", 指除了洗碗槽外各式各样的炮弹齐发,现在指有太多的东西)。因此,许多新的功能被添到ES6的新规范上。从字面上统计这个规范已经是ES5规范长度的两倍。更糟糕的是,在ES6规范完成之前,已经有人预定了一箩筐的新功能要集成到ES7。他们都还没有完成ES6,就已经开始计划ES7了。有一些JavaScript语义不一致的地方需要修复,但新加入的ES6和ES7的新特性无助于解决这些问题,他们仅仅是增加了新功能(或者说:复杂性)到这个语言。

就个人而言,我比较崇尚简单和极简主义编程。我认为,较小的语言比较容易实现、优化、学习、调试和理解。你的语言越大越复杂,更多的语义不一致性就会在更多的虚拟机之间跳出来。如果JavaScript真的是“Web界的汇编语言” ,那么它为什么非得要实现这些高层次的功能特性?合乎逻辑的做法是应该尽可能多的固化JS的底层语义,并专注于改善和优化支持JS的编译器。我相信JS的复杂性一直在持续增长的原因是出于它是由学院派设计驱动的。

我当然有偏见。实际上我实现了自己的JavaScript JIT编译器,我太忙了,而且跟不上这增加这些新功能。在我看来,在当今的网络世界里,没有人会暂停片刻,呼吸和思考一下。案例分析: Mozilla 做了一个很大的噪音asm.js,编译标准的本地代码到JS,而且据称比谷歌的Native Client 更好。我觉得asm.js仍然是比较新的,还没有足够多的开发商采用和通过它,它只有在技术演示中使用过,但Mozilla和谷歌已经开始着手WebAssembly ,它独立于asm.js,二者没有什么关系。第二:asm.js仍然是很新的(2013年开始,它只有两岁),有没有足够多的采纳的情况下,它的影响微乎其微。

从本质上讲Brendan Eich告诉我们的WebAssembly,是希望将所有的编译器设立一个中立的编辑目标,我们真的不希望或需要为Web创建一种新的字节码格式或编译器实现,在我看来,这是一个有点不幸的妥协。

译文: http://ourjs.com/detail/55cd3c89fbd23139de9e3558

8723 次点击
所在节点    程序员
46 条回复
yibuyisheng
2015-08-14 10:51:44 +08:00
如果用js做过多人大型项目,就会觉得添加的这些功能,是很有必要的。
ibloging
2015-08-14 10:54:29 +08:00
@notcome

感谢指正,最后一段过于深奥,不好翻,能给个最终版不? 我可以更新一下。
magnusby
2015-08-14 11:02:49 +08:00
同意 @yibuyisheng
就像class,无非是一种语法糖,让你的代码更具模块性
其次,针对语言快速演化很重要,尤其现在语言竞争这么激烈,当然这也是由市场决定的,所以ES7的进程自然会加快。就好比现在C++11/14还在玩的起劲,17就已经在准备了~
amery2010
2015-08-14 11:02:49 +08:00
我觉得这是一种心态问题...

虽说有了ES6,但各大浏览器厂商并未强制要求使用ES6。
如今ES5已经定稿6年多了,但浏览器平台有强制要求使用ES5么?
喜欢用ES3的可以一直用ES3,喜欢ES6的可以提前用ES6,这并没有强制用户使用最新版本的说法。
我觉得抱怨ES6新特性的那类朋友,你大可一直使用ES5甚至ES3没人会反对,但请不要批判一种语言向前发展趋势。

ES6是给无法满足当前需求的那类人用的,不是强制那些喜欢守旧的朋友使用的。

——————————————————————————————————————————

作为一名Web前端开发,我选择拥抱变化。
notcome
2015-08-14 11:22:35 +08:00
@ibloging 我汉语很差的,算了……
tushiner
2015-08-14 11:36:49 +08:00
@amery2010 说的都很好。只不过有一点可能没有考虑到,那就是语言终究是工具,得靠不断的开发应用来提升对这门语言的掌握程度,仅仅停留在学术层次对于需要靠技术吃饭的开发者来说不现实。再通俗点讲,开发者能够开发的项目是有限的,而语言的特性提升空间是无限的,无论是实际开发做的太少,还是语言发展太迅速,最悲观的情况是,有些特性可能都没用过,或者就用过若干次,反正是没有足够多的机会来培养策略、思想、工作流,长远来看,又如何能熟练和精通这门工具?
oetet1
2015-08-14 11:56:06 +08:00
能不能一开始就注明是转载翻译的?或者在标题里体现出来?当刚看帖子开头的时候,心想:哇,搞动态编译器的,好高端!v2ex上大牛这么多!看到末尾的译文链接的时候落差感觉好大。
Feiox
2015-08-14 12:42:36 +08:00
精致、极简、优雅,这让我想起 Scheme 这门语言,那么纯粹干净,标准也不过几十页。
但,工程界追求的永远不在乎这些,更看重 规范、可控、健壮、功能强大,无论 Java Python Go 似乎都是以这个标准为目的构建的。另外,Github 为什么选择 Coffeescript | Angular2 为什么选择 Typescript 也是一个深思的原因。
sodatea
2015-08-14 12:58:54 +08:00
仅看标准我觉得 ECMAScript 并不太复杂……复杂的是向后兼容
alphonsez
2015-08-14 13:29:22 +08:00
C++也还活得好好的
herozzm
2015-08-14 13:52:07 +08:00
翻译的太水,无法看懂
quix
2015-08-14 16:42:38 +08:00
es6只有一个 generator 个人感觉是值得从 vm 级来实现的. 另外就是 promise 这东西好是好,但是目前实现很多, 原生版的功能太单薄. 其他特性大部分都可以通过 coffee 之类的方式来实现, 没必要集成进去.
plqws
2015-08-14 18:59:18 +08:00
JS 从 ES6 的确感觉开始出现了过度设计的萌芽了,比如说莫名其妙的 Map Set 非要取代 {} 与 [] 而不是在原来的基础上改进,所以多了很多冗余的语法,背离了 JS 语言精粹中的精神…… 奇怪的取代 var 的 const 和几乎用不到的 let …… Class 与 extends。还有一些比较冷门的特性比如说解构赋值什么的,实在是让人不能理解。
chengzhoukun
2015-08-14 19:13:06 +08:00
我就觉得es6很好,把残缺的地方补上去了。python 3.5不也类似么
chengzhoukun
2015-08-14 19:15:40 +08:00
@plqws 学过java和python很容易理解吧
duhastmich
2015-08-14 21:58:24 +08:00
@plqws 哈哈, destructuring 是我最喜欢编程语言的特性之一
duhastmich
2015-08-14 22:08:51 +08:00
很多特性会彻底改变写js 的方式吧,像generator,像 es7的 await, proxy 可以用来实现更漂亮的api,唯一不满意的是没有变成coffeescript
zhpooer
2015-08-14 22:38:55 +08:00
@duhastmich 赞 唯一不满意的是没有变成 coffeescirpt...
maomaomao001
2015-08-14 22:54:15 +08:00
es6又没有把你们喜欢的功能去掉吧~~~ ,多了个class多好,喜欢用class的用class 不喜欢用的不用不久好了,,微软的typescript的很好啊
xavierchow
2015-08-14 23:01:48 +08:00
正因为Coffeescript潜在地形成了分裂JS社区的威胁,学院派的人说:你们别弄了,ES6都会有的...
@duhastmich @zhpooer

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/213096

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX