WebAssembly 教程

🌙
手机阅读
本文目录结构

写在前面

如果您已经了解并且使用过 WebAssembly ,推荐你查看 JS WebAssembly 的API文档,这里有JS的全面用法

WebAssembly 是什么

WebAssembly(缩写为 Wasm)是基于堆栈的虚拟机的二进制指令格式。Wasm 被设计为可移植目标,用于编译高级语言(如 C / C ++ / Rust),从而可以在 Web 上为客户端和服务器应用程序进行部署。

WebAssembly 的开放标准是在 W3C 社区组(包括来自所有主要浏览器的代表)和 W3C 工作组中开发的。

WebAssembly 或称 wasm 是一个实验性的低端编程语言,应用于浏览器内的客户端。WebAssembly 是便携式的抽象语法树,被设计来提供比 JavaScript 更快速的编译及运行。WebAssembly 将让开发者能运用自己熟悉的编程语言(最初以 C/C++ 作为实现目标)编译,再藉虚拟机引擎在浏览器内运行。

WebAssembly 的开发团队分别来自 Mozilla、Google、Microsoft、Apple,代表着四大网络浏览器 Firefox、Chrome、Microsoft Edge、Safari。

2017 年 11 月,以上四个浏览器都开始实验性的支持 WebAssembly。

WebAssembly 于 2019 年 12 月 5 日成为万维网联盟(W3C)的推荐,与 HTML,CSS 和 JavaScript 一起,成为 Web 的第四种语言。

WebAssembly 是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如 C / C ++ 等语言提供一个编译目标,以便它们可以在 Web 上运行。它也被设计为可以与 JavaScript 共存,允许两者一起工作。

WebAssembly 特点

高效快捷

Wasm 堆栈机设计为以节省大小和加载时间的二进制格式进行编码。WebAssembly 旨在通过利用广泛平台上可用的通用硬件功能,以本机速度执行。

安全

WebAssembly 描述了一种内存安全的沙盒执行环境,该环境甚至可以在现有 JavaScript 虚拟机内部实现。当嵌入 Web 时,WebAssembly 将强制执行浏览器的同源和权限安全策略。

开放且可调试

WebAssembly 旨在以文本格式漂亮地打印,以便手工调试,测试,实验,优化,学习,教学和编写程序。在 Web 上查看 Wasm 模块的来源时,将使用文本格式。

开放式网络平台的一部分

WebAssembly 旨在维护 Web 的无版本,经过功能测试和向后兼容的性质。WebAssembly 模块将能够调用和退出 JavaScript 上下文,并通过可从 JavaScript 访问的相同 Web API 访问浏览器功能。WebAssembly 还支持非 Web 嵌入。

对于网络平台的意义

对于网络平台而言,WebAssembly 具有巨大的意义——它提供了一条途径,以使得以各种语言编写的代码都可以以接近原生的速度在 Web 中运行。

在这种情况下,以前无法以此方式运行的客户端软件都将可以运行在 Web 中。

WebAssembly 被设计为可以和 JavaScript 一起协同工作——通过使用 WebAssembly 的 JavaScript API,你可以把 WebAssembly 模块加载到一个 JavaScript 应用中并且在两者之间共享功能。

这允许你在同一个应用中利用 WebAssembly 的性能和威力以及 JavaScript 的表达力和灵活性,即使你可能并不知道如何编写 WebAssembly 代码。

而且,更棒的是,这是通过 W3C WebAssembly Community Group 开发的一项网络标准,并得到了来自各大主要浏览器厂商的积极参与。

对安全方面的意义

传统从 JS 代码,在浏览器端运行,是有被拿到源代码的可能(即使你加密了);

WebAssembly 使用二进制 (.wasm文件)的形式,在这方面跨出一步(Flash 已经基本算凉了,后面还是要看 WebAssembly 的表演)

实现原则

  • 定义一个可移植,具有大小与加载高效率的二进制格式,作为编译标的。这个编译标的必须可以被编译至常见的平台,包含移动端与物联网,并且可以善用硬件资源、有原生运行码的运行速度。
  • 规格与实现:
    • 最初的 MVP(Minimum Viable Product) 与 Asm.js 有大略相等的功能,并以 C/C++ 语言为优先;
    • 其他额外的特性最初集中在线程,零消耗的异常,和 SIMD。这些额外的特性先以反馈和实验为主,包含 C/C++ 以外其他语言的支持。
  • 设计可以运行在现有的网络平台之内以及与之集成:
    • 保持无版本问题、特色测试、向后兼容的网络平台
    • 在与 Javascript 相同的环境中运行
    • 允许从 Javascript 中同步调用
    • 强化同源 (Same-origin) 和安全性权限政策
    • 允许浏览器访问相同功能的 Javascript API
    • 定义一个可人工读取,能和二进制格式互换的纯文字格式,以支持查看源代码
  • 设计也可以用于非浏览器的嵌入式系统
  • 制作大平台
    • 为 WebAssembly 建置新的 LLVM 后端与伴随的 Clang 接口
    • 推动其他 WebAssembly 的编译器与工具
    • 激活更多有用的工具

实现的特色

  • 制定规格
  • 线程
  • 固定长度的 SIMD
  • 异常处理
  • 垃圾回收
  • 存储器区块操作
  • 网页内容安全性政策
  • ECMAScript 模块集成
  • 尾端调用
  • Non-trapping 浮点数 - 整数转换
  • 多值函数
  • Host bindings

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了