谁能取代 JavaScript 似乎是一个老生常谈的话题,很多人都提出过不同看法。最近,InfoQ 编译了微软技术专家麦克唐纳(Matthew MacDonald)的文章,他认为 JavaScript 风头正劲,但 WebAssembly 可能已经敲响了它的丧钟。以下是重点内容,希望对你有所帮助。
在 JavaScript 征服世界的同时,有人播下了一颗小小的种子,这颗种子可能在将来的某一天成长为参天大树,敲响 JavaScript 的丧钟——这就是名为 asm.js 的实验性技术。
不过展开这个故事之前,我们先了解下现状。
自从我们有了 JavaScript,开发人员就一直在设法绕开它。早期的一种方法是使用插件把代码从浏览器中剥离,结果失败了;另一个想法是开发出可以转换代码的开发工具,换句话说就是采用另一种更受欢迎的语言编写代码,然后将其转换为JavaScript。
将一种语言转换为另一种语言的过程称为转译(transpiling),其存在一些明显的缺陷。高级语言有着各自不同的功能、语法和习惯表达,你不可能把一种语言中的每一行都映射到另一种语言中的等效构造上,就算你能做到这一点也会留下许多坑。如果社区停止开发你最喜欢的转译器该怎么办?如果转译器自己就引入了许多错误该怎么办?想要插入 Angular、React 或 Vue 这样的 JavaScript 框架又要怎么解决?如果你会的语言和同事不一样,你又该如何与团队协作?
现在,转译器很常见,但它们的用途几乎只有一条,那就是处理向后兼容性。
开发人员可能会编写最前沿的 JavaScript,然后使用转译器将其代码转换为等效的老式 JavaScript 代码,以便在所有位置运行。或者更好的办法是,他们使用TypeScript,然后将其转换为 JavaScript。但不管是哪种方法,你都逃不出 JavaScript 的手掌心。
这一情况在 asm.js 出现后得到了改善,asm.js 是 Mozilla 的开发人员在 2013 年完成的一项实验,当时他们正在寻找在浏览器中运行高性能代码的方法,但 asm.js 并没有像插件那样尝试在浏览器外部运行,相反,它的目标是直接通过 JavaScript 虚拟机打出一条通道。
从本质上讲,asm.js 是简洁且优化的 JavaScript 语法。它比普通的 JavaScript 运行得更快,因为它避免了这种语言中较慢的动态部分。而且支持它的 Web 浏览器也可以应用其他优化,从而显著提升性能。换句话说,asm.js 遵循黄金法则:不要破坏 Web,同时提供了一条未来改进的途径。
asm.js 的最大意义在于,它迫使开发人员重新思考 JavaScript 扮演的角色。asm.js 代码是 JavaScript,但这些代码并不是让程序员手工读写的,而是由转译器构建,并直接提供给浏览器的。JavaScript 是媒介,但不是信息本身。
随着 WebAssembly 诞生,情况发生了改变。
WebAssembly 诞生于 2015 年,目前 Chrome、Edge、Safari 和 Firefox 四大浏览器都完全支持它。它既是 asm.js 的后继产品,又是一项截然不同的技术。这是一种紧凑的二进制代码格式,像 asm.js 一样,WebAssembly 代码也被输入到 JavaScript 执行环境中,它具有相同的沙箱和相同的运行时环境。与 asm.js 一样,WebAssembly 的转译机制也可以进一步提升效率,并且浏览器可以完全跳过 JavaScript 解析阶段,对于一段普通的逻辑来说,WebAssembly 的执行速度远远快于常规的 JavaScript,几乎与原生编译的代码一样快。
WebAssembly 最初是为了满足 C++ 和 Rust 等需求而诞生的,但在不久的将来,它会支持非 JavaScript 框架,与Angular、React 和 Vue 等基于 JavaScript 的对手同台竞技。
目前 WebAssembly 只能在一些重点场景中使用,还不是万能的 Web 开发方法,但随着不断推广,它也会不断进化。如果 WebAssembly 开始流行,它将进入一个良性循环,不断发展,很容易就能超越 JavaScript 的固有优势。
人们常说,WebAssembly 并不是用来代替 JavaScript 的。但这句话对所有革命性平台都是一样的。JavaScript 当初并不是要取代嵌入浏览器的 Java,Web 应用程序并非旨在替代桌面应用。但一旦能做到这些,它们必然会走上那条路。
以上就是麦克唐纳的思考,你是否认同呢?
点击“了解更多”查看更多内容!