02 | 历史篇:为什么会有 WebAssembly 这样一门技术?
JavaScript 的发展和困境
- 深入了解
- 翻译
- 解释
- 总结
WebAssembly(Wasm)作为新兴技术,旨在解决现有Web技术面临的性能和类型支持问题。文章首先回顾了JavaScript的发展历程和其在Web应用中的困境。随着Web应用规模的增长,浏览器性能优化与Web应用规模日益增大之间的“不协调”成为了一个问题。同时,JavaScript的弱类型特性也给浏览器在面对庞大Web应用时带来了性能开销。Wasm的出现正是为了解决这些问题,它可以提供更高效的性能和更好的类型支持。Wasm的前身包括NaCl、PNaCl和ASM.js,它们都是为了提供更高性能的Web应用而产生的技术。然而,它们都存在着各自的问题和局限性。Wasm的诞生是为了继承并解决这些技术的问题,从而更好地满足现代Web应用的需求。Wasm的设计目标是为了能够在JavaScript之外,提供一种高效的实现可能,为构建更高性能的Web应用提供支持。Chrome V8团队在设计和实现Wasm时参考了之前技术的优缺点,以避免重复走过的弯路。因此,Wasm以一种更好的方式展现在人们的面前,为应对Web应用的挑战提供了新的可能性。 WebAssembly(Wasm)作为新兴技术,旨在解决现有Web技术面临的性能和类型支持问题。文章首先回顾了JavaScript的发展历程和其在Web应用中的困境。随着Web应用规模的增长,浏览器性能优化与Web应用规模日益增大之间的“不协调”成为了一个问题。同时,JavaScript的弱类型特性也给浏览器在面对庞大Web应用时带来了性能开销。Wasm的出现正是为了解决这些问题,它可以提供更高效的性能和更好的类型支持。Wasm的前身包括NaCl、PNaCl和ASM.js,它们都是为了提供更高性能的Web应用而产生的技术。然而,它们都存在着各自的问题和局限性。Wasm的诞生是为了继承并解决这些技术的问题,从而更好地满足现代Web应用的需求。Wasm的设计目标是为了能够在JavaScript之外,提供一种高效的实现可能,为构建更高性能的Web应用提供支持。Chrome V8团队在设计和实现Wasm时参考了之前技术的优缺点,以避免重复走过的弯路。因此,Wasm以一种更好的方式展现在人们的面前,为应对Web应用的挑战提供了新的可能性。
《WebAssembly 入门课》,新⼈⾸单¥29
全部留言(15)
- 最新
- 精选
- CryhardES6等后续版本如果解决了浏览器兼容性问题,后续不再需要“编译”回老版脚本语言,从而获得了性能保障。这样的情况是否会成为wasm的重大阻碍呢?
作者回复: 直接运行 ES6 代码的尝试其实有很多企业很早就在尝试,但大家都相对比较保守,还是会去兼容老一代的浏览器。就性能提升来讲,就算是直接运行 ES6 的代码,JavaScript 引擎也同样还是需要经历生成 AST,Profiling,Lowering,以及 Optimization 和 De-optimization 的过程,因此相较于 Wasm 在整个引擎 Pipeline 中更加靠后的位置,性能上也还是无法比拟的。况且性能也只是 Wasm 的一方面特性,另一个“历史代码可复用性”的特征我们也同样需要关注。因此其实两者不会有太多的重叠,更不会阻碍 Wasm 的发展。
2020-09-0811 - Jupiter老师好,Typescript 可以设置参数类型,现在的项目中也经常使用,但是最后Typescript的代码也会被解释成Javascript, 所以Typescripts是不是只是规范程序员写代码,对于应用的性能其实没有什么帮助?
作者回复: 你可以参考一个名为 AssemblyScript 的项目。这个项目就是基于 TS 语法设计的,可以将以 TS 语法编写的代码编译为 Wasm 格式。通常来讲,在日常的 Web 开发中,由于 TS 需要被编译为 JS,所以对于最终的代码执行性能是没有什么影响的。但 TS 的类型信息在对于编译到 Wasm 来说,还是可以被参考的。
2020-09-089 - VfeelitJS虽然动态,在TS把持下,jit 不进行或几乎不进行反优化,性能已经相当不错了吧。wasm不也通过vm转一圈最终产生机器码?
作者回复: 实际上还是有很大差别的,借助于 TS 确实可以解决“去优化”的问题,但对于 JS 还是要通过:生成 AST、生成 IR、Lowering、优化编译器、Profiling、生成机器码这些步骤的。但对于 Wasm,仅需要“生成机器码”这一步基本就够了,大部分优化在静态编译时就已经完成了,引擎只需要对照 Wasm 的 ISA 翻译成目标机器的 ISA 就可以了,基本上只是一个汇编器的作用,而且目前也不需要静态链接。
2021-01-134 - Vfeelit实现wasm的是虚拟机,任何语言,编译为某个中间语言并不是很困难的事。类似基于jvm, 它之上除了java还有其他语言,虽然都是基于jvm,但生态各不同。wasm 相比下不过就是一套vm规范,没有那么大想象力啊
作者回复: 就本质而言的话确实是这样,类似 JVM 只是一套新的 V-ISA 标准。但目前来看其不同在于: 1、Wasm 可以用于 Web(起源); 2、WASI 提供了一套 out-of-web 的操作系统接口标准,并且基于 capability-based security 可以提供更加安全的上层应用实现(本身基于 Wasm)。无论是安全的代码复用,还是基于 VM 层的轻量级沙盒环境,都是很有价值和发挥空间的。
2021-01-131 - donglin文中说ASM.js会被编译成机器码保存,下次再次执行时便会直接使用已保存的机器码,从而提高性能。 这个不就是JIT机制嘛,但在iOS上是禁止的啊,所以ASM.js在iOS上也无法提高性能?
作者回复: 相对来说是的,或许浏览器可以利用 ASM.js 中标注的类型做一些额外优化,但整体性能提升肯定不会太明显。
2022-10-11归属地:北京 - Carpe“据相关数据统计,截止 2019 年底,全世界一共有约 16 亿个可索引网页,而其中的 95% 都在使用 JavaScript。”数据来源于哪?
作者回复: 我是直接 Google 搜 “How many websites use JavaScript.” 直接显示的结果,当然数据仅供参考哈。
2022-09-28归属地:四川 - 地球外地人老师好,感觉ts代码虽然被编译成了js,但是转换后的js代码内部也避免了很多类型转换的问题,js引擎对于这一部分没有什么正反馈吗
作者回复: 会有一部分。由于 TS 的类型信息并没有给到 JavaScript 引擎来使用,所以即便整个程序是 well-organized 的,但是 JavaScript 引擎仍然还是需要通过运行时推导来推测出变量的具体类型。但也有的好处是,JIT 在假设某个变量的类型时,基本上都可以保证是正确的。这样引擎的去优化过程就会减少很多,性能会相对提高。
2020-09-17 - 郭纯在 web vr 领域下 场景中会设计到很多模型和特效如果大规模进行平移 旋转 缩放我感觉很适合 wasm 场景.
作者回复: 嗯嗯是的,不过现在有 WebXR 这个 W3C 的草案了。如果浏览器能够 ship,就会有专门的 Native API 来用于 Web VR 应用的开发。不过目前看还为时尚早,Wasm 可以作为次级兼容的一个优秀备选方案。
2020-09-14 - 浩明啦评论里老师说AssemblyScript这个,我刚刚扫了一眼,我们现在ts的项目也能用这个来编译用到生产环境上么? 不过很多的那些react 和vue框架打包后为啥不直接编译wasm呢?
作者回复: AssemblyScript 其实只是基于 TS 的语法而已,实际在应用时需要进行一些改动以适配 Wasm 标准以及浏览器上的运行时环境,所以直接编译前端的 TS 项目应该是不行的。现代前端开发框架由于需要与 Web API 打交道,因此实际上在编译到 Wasm 后,对框架的性能提升暂时还看不到可观的收益。关于前端框架与 Wasm 之间的关系,可以关注课程后面的文章哈。
2020-09-11 - 余文郁老师,ecma标准文档和Chrome官方文档地址可以分享一下吗
作者回复: EMCA:https://www.ecma-international.org/ecma-262/ NaCl/PNaCl:https://developer.chrome.com/native-client/nacl-and-pnacl
2020-09-07