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

8505 次点击
所在节点    程序员
46 条回复
phoenixlzx
2015-08-14 09:19:54 +08:00
说白了就是一帮家伙只会自以为是的瞎搞。

如果 ES7 继续反人类下去的话就真的要退坑了。
LINEX
2015-08-14 09:20:15 +08:00
完全看不懂你的逻辑。。
yakczh
2015-08-14 09:23:10 +08:00
简单和极简主义 => php是最好的语言就是这么来的
jadecoder
2015-08-14 09:24:57 +08:00
@phoenixlzx 咋退坑?不做前端了?
anubiskong
2015-08-14 09:31:21 +08:00
java的学院派害人匪浅, 受害者包括js作者本人, ES6已经很过分了.
clino
2015-08-14 09:32:46 +08:00
c++能换 javascript很难换啊,所以再难用也会继续用下去
archsocks
2015-08-14 09:35:07 +08:00
js只不过是把缺少的补回来而已,即使ES7加上也只不过和python差不多的特性集。极简可以但不能简陋。
FrankFang128
2015-08-14 09:36:09 +08:00
JS 加个毛的 class
anubiskong
2015-08-14 09:41:14 +08:00
@archsocks 一个语言为啥要以别的语言为标准来改进
caisai
2015-08-14 09:44:19 +08:00
火了之后就开始过度设计了,所以啊人怕出名猪怕壮。
phoenixlzx
2015-08-14 09:44:39 +08:00
@jadecoder 本来也不是前端啊... 开始写 js 的时候就是 Node.js 写后端和 cli 程序的

大概会换个语言吧。Go 啊 或者是 rust 或者是其他什么的。虽然我承认 js 是目前用过的最方便的语言了
learnshare
2015-08-14 09:49:03 +08:00
这都是企图在早期的累赘下添加更多累赘的后果
MrEggNoodle
2015-08-14 09:55:36 +08:00
@anubiskong 相互吸收各种语言的优势嘛,这不都是为了更好的进化。苹果的swift不也吸收了python和js的优点。无可厚非。
yakczh
2015-08-14 10:25:21 +08:00
js不需要class, 因为class需要提前把一切定好,实际上在现实需求中这是不现实,除非码农个个都是先知, js需要的是象golang那样的channel或者类似的模块之间的通信机制,只要定好数据格式,然后码农各自负责自己的模块,剩下的就不用管了,不象async把本来简单的代码写得跟天书一样
notcome
2015-08-14 10:27:58 +08:00
WebAssembly is essentially what Brendan Eich told us we didn’t really want or need: a bytecode format for the web. A somewhat more neutral platform for all compilers to target. As a compiler implementer, it still seems to me like it’s a bit of an unfortunate compromise: a way to retrofit a web-bytecode into JavaScript VMs. It’s going to take programs encoded as Abstract Syntax Trees (ASTs) as input, whereas GCC, clang, and other real-world compilers usually generate Control Flow Graphs (CFGs) at the output stage, not ASTs. Forcing compilers to convert CFGs back into ASTs seems like a decision made to simplify the job of WebAssembly VM implementers, at the expense of everyone else.

这是看不懂就不翻了还是觉得 ourjs 的读者只需要看看吐槽就好呢?

不对,这翻译的还有问题哈哈哈:
WebAssembly 基本上就是 Brendan Eich 所说的我们不想要也不需要的东西:Web 界的字节码——一个更加中性的平台,所有编辑器的目标。作为一个编译器实现者,我觉得将 Web 字节码重新塞回 JS VM 是一个愚蠢的妥协。VM 把 AST[1] 化的程序作为输入,而 GCC、Clang、和其他实用的编译器通常输出 CFG[2],而不是 AST。强迫编译器把 CFG 转回 AST 看起来像是一个方便 WebAssembly VM 的实现者的决定,不过坑了其它所有人。

[1]: AST, Abstract Syntax Tree,抽象语法树
[2]: CFG, Control Flow Graphs

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


天哪,这都什么狗屁玩意,无法想象剩下的翻译里错了多少。我建议各位直接看原文好了:
http://pointersgonewild.com/2015/08/02/javascript-is-the-c-of-the-web/?utm_source=ourjs.com

HackerNews 的讨论,比这里的讨论有意义的多:
https://news.ycombinator.com/item?id=9995788

然后我再慢慢吐槽……不过我扫了一眼(还没有细看)HN 的讨论,似乎已经把我想吐槽的说出来了。
notcome
2015-08-14 10:28:53 +08:00
上面那个我给的翻译里的「编辑器」是打错了,应该是「编译器」。
DarkDucky
2015-08-14 10:34:34 +08:00
我有无敌技能:禁用客户端脚本
fuxiaohei
2015-08-14 10:37:17 +08:00
翻译的很乱
zzxworld
2015-08-14 10:41:10 +08:00
MVC 都跑前端去了,现在做后端搞搞 API 就行了,有点感觉前端在逆袭呀。
notcome
2015-08-14 10:47:19 +08:00
这个我很喜欢,摘抄一下:

>> Personally, I’m a big fan of simplicity and minimalism in programming language design. I think that smaller languages have the potential to be easier to implement, optimize, teach, debug and understand.

> After reading hundreds of blogs and articles about this or that programming language being supposedly "simple", sentences like the above have come to mean nothing.
> I wish a had a succinct meme to describe what actually happens in the real world around "simple" languages but the concepts are:
> If there's a "small" or "simple" FORMAL language specification, it means there's a "large" INFORMAL language out in the wild. The "informal" will include things like idioms, patterns, macros, code generators, industry practices, "utility" javascript libraries, etc.

原文的翻译:
>> 就个人而言,我比较崇尚简单和极简主义编程。我认为,较小的语言比较容易实现、优化、学习、调试和理解。

评论的翻译:
> 阅读了数百篇关于各式各样所谓简洁的语言的博客和文章(估计指论文)之后,上述的话对我来说毫无意义。
> 很可惜我不能找一个简明的俗语来描述现实中关于简洁的故事,其概念如下:
> 如果有一个「小」或者「简单」的正式的语言规范,也就代表着还有一个很大的非正式的语言在现实中存在。所谓「非正式」包括了设计模式(Java 躺枪)、宏(C 躺枪,Lisp 躺枪)、代码生成器(Haskell 躺枪[1]),工业实践,JavaScript 工具库(C++ 标准库躺枪),等等。

[1]:部分 Haskeller 表示 Template Haskell 是个不安全的扩展,不安全的扩展,能算 Haskell 吗?

我觉得这个总结的就很好了:你们是指望团队成员进行所谓学习,通过代码规范、代码审核、结对编程什么的来保证代码质量呢,还是相信微软的团队和 Anders Hejlsberg 帮你挑选完、集成在 C# 里的特性呢?至于什么 CoffeeScript,TypeScript,无非就是让一个 preprocesser 完成一个编译器本来就要完成的任务——自动化测试确保代码质量——而已。

不过我感觉 V2EX 主流的态度是宁可相信人的「主观能动性」,也不愿意用靠谱的语言及其编译器、相信业界的大牛,嗯,这个很有道理的。毕竟王垠曾经说过,不要迷信所谓大牛嘛!

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

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

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

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

© 2021 V2EX