@qinyun
2018-07-31T10:02:05.000000Z
字数 3178
阅读 1520
未分类
7月11日,FullStack 2018 在伦敦举行,JavaScript之父Brendan Eich和JSON之父、“JavaScript:The Good Parts”的作者Douglas Crockford一同出席,并就JavaScript的未来发表了演讲。
Eich的演讲主要是围绕语言的迭代和改进功能进行,而Crockford主要关注JavaScript是否能将软件工程引向下一个巅峰,也就是全局分布式、安全的异步编程。
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)。
在演讲的问答部分,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在内的所有编程语言都还停留在单机单地址空间的旧架构中。
但是,由于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