V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ibloging
V2EX  ›  程序员

JavaScript 正在变成 Web 界的 C++

  •  1
     
  •   ibloging · 2015-08-14 09:00:59 +08:00 · 8486 次点击
    这是一个创建于 3170 天前的主题,其中的信息可能已经有所发展或是发生改变。

    早在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

    46 条回复    2021-11-03 17:37:27 +08:00
    phoenixlzx
        1
    phoenixlzx  
       2015-08-14 09:19:54 +08:00
    说白了就是一帮家伙只会自以为是的瞎搞。

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

    大概会换个语言吧。Go 啊 或者是 rust 或者是其他什么的。虽然我承认 js 是目前用过的最方便的语言了
    learnshare
        12
    learnshare  
       2015-08-14 09:49:03 +08:00
    这都是企图在早期的累赘下添加更多累赘的后果
    MrEggNoodle
        13
    MrEggNoodle  
       2015-08-14 09:55:36 +08:00
    @anubiskong 相互吸收各种语言的优势嘛,这不都是为了更好的进化。苹果的swift不也吸收了python和js的优点。无可厚非。
    yakczh
        14
    yakczh  
       2015-08-14 10:25:21 +08:00
    js不需要class, 因为class需要提前把一切定好,实际上在现实需求中这是不现实,除非码农个个都是先知, js需要的是象golang那样的channel或者类似的模块之间的通信机制,只要定好数据格式,然后码农各自负责自己的模块,剩下的就不用管了,不象async把本来简单的代码写得跟天书一样
    notcome
        15
    notcome  
       2015-08-14 10:27:58 +08:00   ❤️ 1
    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
        16
    notcome  
       2015-08-14 10:28:53 +08:00
    上面那个我给的翻译里的「编辑器」是打错了,应该是「编译器」。
    DarkDucky
        17
    DarkDucky  
       2015-08-14 10:34:34 +08:00   ❤️ 1
    我有无敌技能:禁用客户端脚本
    fuxiaohei
        18
    fuxiaohei  
       2015-08-14 10:37:17 +08:00
    翻译的很乱
    zzxworld
        19
    zzxworld  
       2015-08-14 10:41:10 +08:00   ❤️ 1
    MVC 都跑前端去了,现在做后端搞搞 API 就行了,有点感觉前端在逆袭呀。
    notcome
        20
    notcome  
       2015-08-14 10:47:19 +08:00   ❤️ 2
    这个我很喜欢,摘抄一下:

    >> 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 主流的态度是宁可相信人的「主观能动性」,也不愿意用靠谱的语言及其编译器、相信业界的大牛,嗯,这个很有道理的。毕竟王垠曾经说过,不要迷信所谓大牛嘛!
    yibuyisheng
        21
    yibuyisheng  
       2015-08-14 10:51:44 +08:00
    如果用js做过多人大型项目,就会觉得添加的这些功能,是很有必要的。
    ibloging
        22
    ibloging  
    OP
       2015-08-14 10:54:29 +08:00
    @notcome

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

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

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

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

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

    語言是沒有選擇的。

    除非分裂。
    Kabie
        42
    Kabie  
       2015-08-15 08:25:53 +08:00
    WebAssembly。。。总算有机会真正不用JS了。。。
    mudkip
        43
    mudkip  
       2015-08-15 10:06:35 +08:00   ❤️ 1
    如果尝试用 ES6/7 写一点东西,就会知道 ES6/7 有多好了。
    let/const只是本来就应该有的块作用域,残念的只是为了要向下兼容没办法和Swift一样用var/let;
    Arrow function拯救了var that = this的地狱;
    class只不过是给原本的原型继承提供一种语法糖;
    async/await、generators把代码变得更漂亮了;
    Promise是业界普遍使用多年的东西,放到JavaScript引擎里并没有不妥...
    lvfujun
        44
    lvfujun  
       2015-08-15 13:37:09 +08:00
    楼主用的百度翻译吗?
    bramblex
        45
    bramblex  
       2015-08-15 22:24:33 +08:00 via Smartisan T1
    诚心默念大法好,Js大法保平安
    SoulClinic
        46
    SoulClinic  
       2021-11-03 17:37:27 +08:00
    喂, ES8 什么时候出来呀?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4745 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:36 · PVG 13:36 · LAX 22:36 · JFK 01:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.