JS之父和JSON之父:JavaScript的下一站

4,938 阅读6分钟
原文链接: mp.weixin.qq.com
作者|Dylan Schiemann 译者|覃云 7 月 11 日,FullStack 2018 在伦敦举行,JavaScript 之父 Brendan Eich 和 JSON 之父、“JavaScript:The Good Parts”的作者 Douglas Crockford 一同出席,并就 JavaScript 的未来发表了演讲。

Eich 的演讲主要是围绕语言的迭代和改进功能进行,而 Crockford 主要关注 JavaScript 是否能将软件工程引向下一个巅峰,也就是全局分布式、安全的异步编程。

Eich:不该对开发者有求必应

Eich 讲述了这些年 JS 发生的变化,以及多久之后会再更新。例如,E4X 从未被 JS 接受,但“剔除了不好的 XML 部分的 E4X”,即 JSX,受到了很多 React 用户的喜爱。

Eich 提及在创建 JavaScript 中最大遗憾,就是在 JavaScript 第一个版本发布不久,就来之不拒地满足用户的需求,而不是想着解决他们面对的问题。例如,使用相等运算符 == 进行强制类型转换,如 12 =='12',便于通过 HTTP 将数据推送到服务器。

在本次演讲中,Eich 还重点强调了 asm 和 WebAssembly 的价值。asm.js 是 JavaScript 静态类型子集,asm.js 源代码的运行速度接近原生。

这种性能上的改进来自于 asm 支持从 JIT 转换到 AOT 编译,从抽象语法树(AST)直接转换为机器代码生成。

WebAssembly 是一个加载速度更快和更通用的 asm.js 版本。WebAssembly 在一个单独的进程中运行,因此它的语法比 JavaScript 更具有表现力,但仍然是 JavaScript 虚拟机的组成部分。

即将发布的新功能

Eich 对明年即将推出的这些语言功能感到兴奋:

  • TC39 BigInt - 一种新的值类型(value type),它能处理任意精度的整数,支持 TypedArrays

  • Dynamic import() - ES 模块默认导入是静态的,动态导入支持预取

  • Array.prototype.flat / flatMap - 数组的任意展平,而且它是展平和 smooshgate 的解决方案

  • 更多解构 - 可用于任意对象和数组

  • 类中的私有方法和访问器 - Eich 认为,符号前缀“#”有些争议,不应再使用了

  • 异步迭代 - for-await-of 的语法

  • RegExp 的改进

有关这些提案的更多信息,请参阅 TC39 提案的完整列表(https://github.com/tc39/proposals)。

不会标准化 React 类似的库

在演讲的问答部分,Eich 被问及二进制抽象语法树(binary-ast)提案的进展情况,它介于 JavaScript 和 WebAssembly 之间,它为所有 JavaScript 提供了二进制语法树。

Eich 认为 binary-ast 是一种潜在的实用方法,但有待实践和后续的性能指标测试,以肯定其优势。Mozilla 正在进行初步实验。它的潜在的风险包括:它可成为另一种安全攻击载体,再者,它只是鼓励开发人员编写更大的 JavaScript 代码库,而不是依靠工具和规则来优化他们的代码库。

当被问及类型系统(如 TypeScript)时,Eich 评论说动态编程带给人们很大的便利性,并且不会产生妨碍,是一个非常好的类型系统。Eich 指出,“人们总是习惯使用不需付出任何代价的类型系统。”

TypeScript 非常出色,因为它是 JS 一个严格的超集,每个 JS 程序都是一个 TS 程序,Anders Hejlsberg 是一流的。

Eich 被问及是否会标准化类似 React 的库。他指出像 Dojo 和 Prototype 这样的早期库是如何将其概念引入 JS 的更高版本中,并指出,“我们并不会标准化像 React 那样的库”。相反,我们努力将基本原语( essential primitives)从库中提升到核心语言中。Eich 指出,过早做标准化会导致问题,尤其是对于类型系统等的解决方案。

被问及他对基于 RxJS Observables 的 Observables 提案的看法。Eich 指出,该规范已经停滞不前,要在语言中构建一个所需的功能是一个巨大的挑战。而且他也不确定是否应该将 Observable 添加到语言中。他没有提到 WHATWG specification for streams(https://github.com/whatwg/streams)是 Observables 的超集(superset),也许是这两个提案之间的竞争阻碍了 Observables 提案的进展。

最后,Eich 被问及机器学习,他认为,虽然深度学习很有用,但它并没有告诉我们关于其中的因果关系,它只是曲线拟合算法的一种高级形式。

Crockford:JavaScript 比其他语言更有优势

Crockford 指出,就目前来说,要达到上述的目标还存在很大的困难,因为包括 JavaScript 在内的所有编程语言都还停留在单机单地址空间的旧架构中。

但是,由于 JavaScript 能利用函数和对象做很多有趣的事情,所以 Crockford 认为 JavaScript 比其他语言,更容易达到上述的目标。

Crockford 认为,编程语言有一个通病,它们可能过于专注于“不良整形手术”的修复,而对未来没有一个清楚的认知。

与十年前相比,我认为语言中好的部分越来越少,但好的部分做得也越来越好了。

会上,Crockford 质疑了听众的一些臆想,并指出这些臆想对我们的进步造成很大的影响。例如,他认为我们应该从零开始计数,并解释了为什么一切都应该从零开始。

Crockford 指出,到目前为止,ES2015 最大缺憾是缺乏正确的尾调用( tail calls)或尾调用优化机制,到目前为止只有 Safari 实现了该部分规范。根据 Crockford 的说法,尾调用是 ES2015 最重要的特性,因为这个特性有助于支持尾递归( tail recursion),功能替代的迭代,以及后续传递(continuation passing)。

Crockford 认为纯函数是未来语言中最关键的东西,任何影响纯函数的都不应该被考虑用于语言上。

Crockford 不喜欢 JavaScript 中的很多的特性。例如,他不喜欢 async / await,因为它阻碍了开发人员理解异步编程,使异步编程看起来像是同步的。

Crockford 解释了他对“简单”一词的看法,“标准越简单,需要达成一致的地方也越少,并且越有可能实现互操作性。” 他以 JSON 为例,解释说 JSON 是一种语法,它没有说明行为,易于理解和使用。JSON 所有的语法在一张名片背面就可以放下。

Crockford 正在研究一种名为“neo”的新语言和编译器,它以一种新语言的形式实现 Crockford 认可的 JavaScript 特性,并源到源编译定义良好的 JavaScript 程序,更多细节他将发布在一本名为《How JavaScript Works》的书中。

Crockford 也被问及有关 TypeScript 的问题,他认为:“TypeScript 并没有解决我所遇到的问题。” 这种对 TypeScript 的误解与他先前的声明“错误通常发生在事物的接口之间”有些矛盾,因为 TypeScript 的一个最重要的优点是帮助定义接口以防止这些错误发生。

  相关链接

https://skillsmatter.com/skillscasts/10595-opening-keynote-javascript-the-next-generation

https://skillsmatter.com/skillscasts/11232-keynote-how-javascript-works-a-preview

https://www.infoq.com/news/2018/07/eich-crockford-js-future