使用 WebAssembly 开发有很多不同的方向，这取决于你已经知道的东西和你想建立的东西。在过去的几十年里，Web 浏览器作为最流行的跨平台应用经久不衰。从另一个角度看浏览器，它是最受欢迎的应用交付平台之一。想想你使用的所有网站，它们取代了你过去用桌面上运行的软件进行的活动。你仍然在使用软件，但你是通过浏览器来访问它，而且是在别人的 Linux 服务器上运行。在优化我们所有人使用的软件的永恒努力中，软件开发世界早在 2019 年就引入了 WebAssembly，作为通过 Web 浏览器运行编译代码的一种方式。应用的性能比以往任何时候都要好，而且可以生成 WebAssembly 编码的语言远不只是通常的 PHP、Python 和 JavaScript。一个目标和一种语言关于 WebAssembly 的一个强大但也最令人困惑的地方是，“WebAssembly” 这个词既指一种语言，也指一个目标。WebAssembly 是一种汇编语言，但没有多少人选择直接用汇编写代码。即使是汇编语言，最终也会被转换为二进制格式，这也是计算机运行代码的要求。这种二进制格式也被称为 WebAssembly。不过这很好，因为这意味着你可以用你选择的语言来写一些最终以 WebAssembly 交付的东西，包括 C、C++、Rust、Javascript 和其他许多语言。进入 WebAssembly 的途径是 Emscripten，这是一个 LLVM 编译器工具链，可以从你的代码中产生 WebAssembly。安装 Emscripten要在你的 Linux 或 macOS 电脑上安装 Emscripten，请使用 Git：$ git clone https://github.com/emscripten-core/emsdk.git 改变目录进入 emsdk 目录并运行安装命令:$ ./emsdk install latest $ ./emsdk activate latest Emscripten 工具链中的所有内容都安装在 emsdk 目录下，对系统的其他部分没有影响。由于这个原因，在使用 emsdk 之前，你必须 源引 source 它的环境：$ source ./emsdk_env.sh 如果你打算经常使用 emsdk，你也可以在 .bashrc 中加入环境设置脚本。要在 Windows 上安装 Emscripten，你可以在 WSL 环境下运行 Linux。请访问 Emscripten 网站 了解更多安装信息。Hello World下面是一个用 C++ 编写的简单的 “Hello World” 应用。#include <iostream> using namespace std; int main() { cout << "Hello world"; return 0; } 先把它作为你的系统的标准二进制文件来测试：$ g++ hello.cpp -o world $ ./world Hello world 看到它像预期的那样工作，用 emcc 把它构建为 WebAssembly：$ emcc hello.cpp -o world.html 最后，用 emrun 运行它：$ emrun ./world.html emrun 工具是一个用于本地测试的方便命令。当你在服务器上托管你的应用时，emrun 就没有必要了。学习更多关于 WebAssembly 的知识使用 WebAssembly 开发可以有很多不同的方向，这取决于你已经知道的东西和你想建立的东西。如果你了解 C 或 C++，那么你可以用这些来写你的项目。如果你正在学习 Rust，那么你可以使用 Rust。甚至 Python 代码也可以使用 Pyodide 模块来作为 WebAssembly 运行。你有很多选择，而且没有错误的开始方式（甚至有 COBOL 到 WebAssembly 的编译器）。如果你渴望开始使用 WebAssembly，请下载我们免费的电子书via: https://opensource.com/article/23/2/webassembly-guide作者：Seth Kenlon 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
简介正如我们 最近解释的，WebAssembly 是一种用于以任何语言编写的二进制格式的软件，旨在最终无需更改就能在任意平台运行。WebAssembly 的第一个应用是在 Web 浏览器中，以使网站更快、更具交互性。WebAssembly 有计划推向 Web 之外，从各种服务器到物联网（IoT），其创造了很多机会，但也存在很多安全问题。这篇文章是对这些问题和 WebAssembly 安全模型的一篇介绍性概述。WebAssembly 跟 JavaScript 很像在 Web 浏览器内部，WebAssembly 模块由执行 JavaScript 代码的同一 虚拟机 VM 管理。因此，WebAssembly 和 JavaScript 一样，造成的危害也是相同的，只是效率更高，更不易被察觉。由于 JavaScript 是纯文本，运行前需要浏览器编译，而 WebAssembly 是一种可立即运行的二进制格式，运行速度更快，也更难被扫描出（即使使用杀毒软件）其中的恶意指令。WebAssembly 的这种 “代码混淆” 效果已经被用来弹出不请自来的广告，或打开假的 “技术支持” 窗口，要求提供敏感数据。另一个把戏则是自动将浏览器重定向到包含真正危险的恶意软件的 “落地” 页。最后，就像 JavaScript 一样，WebAssembly 可能被用来 “窃取” 处理能力而不是数据。2019 年，对 150 个不同的 WASM 模块的分析 发现，其中约 32% 被用于加密货币挖掘。WebAssembly 沙盒和接口WebAssembly 代码在一个由虚拟机（而不是操作系统）管理的 沙盒 中封闭运行。这使它无法看到主机，也无法直接与主机交互。对系统资源（文件、硬件或互联网连接）的访问只能通过该虚拟机提供的 WebAssembly 系统接口 WebAssembly System Interface （WASI） 进行。WASI 不同于大多数其他应用程序编程接口（API），它具有独特的安全特性，真正推动了 WASM 在传统服务器和 边缘 Edge 计算场景中的采用，这将是下一篇文章的主题。在这里，可以说，当从 Web 迁移到其他环境时，它的安全影响会有很大的不同。现代 Web 浏览器是极其复杂的软件，但它是建立在数十年的经验和数十亿人的日常测试之上的。与浏览器相比，服务器或物联网（IoT）设备几乎是未知领域。这些平台的虚拟机将需要扩展 WASI，因此，肯定会带来新的安全挑战。WebAssembly 中的内存和代码管理与普通的编译程序相比，WebAssembly 应用程序对内存的访问非常受限，对它们自己也是如此。WebAssembly 代码不能直接访问尚未调用的函数或变量，不能跳转到任意地址，也不能将内存中的数据作为字节码指令执行。在浏览器内部，WASM 模块只能获得一个连续字节的全局数组（ 线性内存 linear memory ）进行操作。WebAssembly 可以直接读写该区域中的任意位置，或者请求增加其大小，但仅此而已。这个 线性内存 linear memory 也与包含其实际代码、执行堆栈、当然还有运行 WebAssembly 的虚拟机的区域分离。对于浏览器来说，所有这些数据结构都是普通的 JavaScript 对象，使用标准过程与所有其他对象隔离。结果还好，但不完美所有这些限制使得 WebAssembly 模块很难做出不当行为，但也并非不可能。沙盒化的内存使 WebAssembly 几乎不可能接触到 外部 的东西，也使操作系统更难防止 内部 发生不好的事情。传统的内存监测机制，比如 堆栈金丝雀 Stack Canaries 能注意到是否有代码试图扰乱它不应该接触的对象，但在这里没用。事实上，WebAssembly 只能访问自己的 线性内存 linear memory ，但可以直接访问，这也可能为攻击者的行为 提供便利。有了这些约束和对模块源代码的访问，就更容易猜测覆盖哪些内存位置可能造成最大的破坏。破坏局部变量似乎也是 可能的，因为它们停留在 线性内存 linear memory 中的无监督堆栈中。2020 年的一篇关于 WebAssembly 的二进制安全性 的论文指出，WebAssembly 代码仍然可以在设定的常量内存中覆盖字符串文字。同一篇论文描述了在三个不同的平台（浏览器、Node.JS 上的服务端应用程序，和独立 WebAssembly 虚拟机的应用程序）上，WebAssembly 可能比编译为原生二进制文件时更不安全的其他方式。建议进一步阅读此主题。通常，认为 WebAssembly 只能破坏其自身沙盒中的内容的想法可能会产生误导。WebAssembly 模块为调用它们的 JavaScript 代码做繁重的工作，每次都会交换变量。如果模块在这些变量中的任意一处写入不安全的调用 WebAssembly 的 JavaScript 代码，就 会 导致崩溃或数据泄露。未来的方向WebAssembly 的两个新出现的特性：并发 和内部垃圾收集，肯定会影响其安全性（如何影响以及影响多少，现在下结论还为时过早）。并发允许多个 WebAssembly 模块在同一个虚拟机中并行。目前，只有通过 JavaScript web workers 才能实现这一点，但更好的机制正在开发中。安全方面，他们可能会带来 以前不需要的大量的代码，也就是更多出错的方法。为了提高性能和安全性，我们需要一个 本地的垃圾收集器，但最重要的是，要在经过良好测试的浏览器的 Java 虚拟机之外使用 WebAssembly，因为这些虚拟机无论如何都会在自己内部收集所有的垃圾。当然，甚至这个新代码也可能成为漏洞和攻击的另一个入口。往好处想，使 WebAssembly 比现在更安全的通用策略也是存在的。再次引用 这篇文章，这些策略包括：编译器改进、栈/堆和常量数据的 分离 的线性存储机制，以及避免使用 不安全的语言（如 C）编译 WebAssembly 模块代码。本文 WebAssembly 安全的现在和未来 首次发表在 Linux 基金会 - 培训。via: https://www.linux.com/news/webassembly-security-now-and-in-the-future/作者：Dan Brown 选题：lujun9972 译者：hanszhao80 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
硬核观察 #612 谷歌正式推出“切换到安卓”应用
谷歌正式推出“切换到安卓”应用据消息，传闻已久的针对 iOS 用户的“切换到安卓”应用开始在苹果应用商店面向公众逐步推出。该应用帮助用户将重要数据，如联系人、日历、照片和视频等从 iPhone 迁移到新的安卓设备。除了移动数据，该应用还提供了关于传输过程的其他说明，比如如何取消 iMessage 的注册，以便在新的安卓设备上继续收到短信。老王点评：虽然看起来像是互相抢用户，但是其实这对于用户来说可以打破供应商锁定。谷歌在 2021 年发现 58 个已被黑客利用的零日漏洞据消息，谷歌 Project Zero 团队发布公告称，去年创历史记录地发现了 58 个零日漏洞。自 2014 年成立以来，Project Zero 检测和披露的零日漏洞的最高数量出现在 2015 年，共有 28 个。这可能代表着网络攻击数量上升，但 Project Zero 表示，更可能是因为他们改进了对零日漏洞的检测和报告。因此，尽管检测到的零日漏洞大幅增加，你的在线安全似乎并不比前几年更危险，至少在涉及零日漏洞时是这样。老王点评：希望是检测技术的提高，而不是恶意攻击者更猖獗。WebAssembly 2.0 工作草案发布据消息，W3C 公布了 WebAssembly 2.0 公共工作草案。WebAssembly 是 W3C 的标准，是一种用于网络和其他地方的可执行程序的可移植二进制代码格式。本次草案带来了 WebAssembly 2.0 的核心规范、JavaScript 接口和 Web API 的公共工作草案。老王点评：我觉得 WebAssembly 叫好不叫座，我似乎从未在哪个网站见过它。
雅虎可能又要被卖了据消息人士透露，美国移动运营商 Verizon 正考虑出售旗下媒体业务，该业务包括多个互联网早期的知名品牌，如雅虎和 AOL。Verizon 目前正逐步剥离媒体资产，放弃了向在线广告业务的进军，进一步专注于移动通信业务，去年，Verizon 已经将互联网媒体赫芬顿邮报出售给 BuzzFeed，并于 2019 年出售了轻博客平台 Tumblr。2017 年，Verizon 以约 45 亿美元的价格收购了雅虎的互联网资产，此前还于 2015 年以约 44 亿美元的价格收购了 AOL。当年的互联网一代巨头，一时传奇，如今只能算作资产卖来卖去。奇虎 360 发现一个潜伏多年的 Linux 后门该后门 3 月 25 日首次被发现，虽然早在 2018 年就已经发现了样本。该后门有 12 项功能，包括渗出和窃取数据、文件和插件管理和报告设备信息等。但是大多数病毒检测引擎尚不能发现该后门。该 Linux 恶意软件改变了它对加密的使用，这包括 ZLIB 压缩和 AES、异或和密钥轮转的组合，因而很难被发现。360 表示，他们不知道该恶意软件的“真正目的”，除了专注于破坏 Linux 系统。专门潜伏在 Linux 上的后门，但是 Linux 上往往没有任何反病毒和木马的软件。微软加入推进 WebAssembly 的字节码联盟字节码联盟旨在将 WebAssembly 从浏览器和 JavaScript 扩展到桌面和移动平台的本地应用程序。它是由英特尔、Mozilla、RedHat 于 2019 年组建的，谷歌和 ARM 也是其成员。字节码联盟得到了四个主要浏览器供应商中三个的支持，只缺 Safari 背后的苹果了。WebAssembly 也承诺可以让开发者编写一个应用程序，在浏览器之外的多个操作系统上运行。微软的加入，使 C# 和 .NET 开发人员可以使用 WebAssembly 构建在浏览器中运行的应用程序，以及可以构建原生的 iOS 和 Android 应用。这种中间字节码的方式其实并不是什么新发明，不知道 WebAssembly 和以前的方案有什么突破，能否取得成功？
通过这个分步教程，开始用人类可读的文本编写 WebAssembly。WebAssembly 是一种字节码格式，几乎所有的浏览器 都可以将它编译成其宿主操作系统的机器代码。除了 JavaScript 和 WebGL 之外，WebAssembly 还满足了将应用移植到浏览器中以实现平台独立的需求。作为 C++ 和 Rust 的编译目标，WebAssembly 使 Web 浏览器能够以接近原生的速度执行代码。当谈论 WebAssembly 应用时，你必须区分三种状态：源码（如 C++ 或 Rust）： 你有一个用兼容语言编写的应用，你想把它在浏览器中执行。WebAssembly 字节码： 你选择 WebAssembly 字节码作为编译目标。最后，你得到一个 .wasm 文件。机器码（opcode）： 浏览器加载 .wasm 文件，并将其编译成主机系统的相应机器码。WebAssembly 还有一种文本格式，用人类可读的文本表示二进制格式。为了简单起见，我将其称为 WASM-text。WASM-text 可以比作高级汇编语言。当然，你不会基于 WASM-text 来编写一个完整的应用，但了解它的底层工作原理是很好的（特别是对于调试和性能优化）。本文将指导你在 WASM-text 中创建经典的 “Hello World” 程序。创建 .wat 文件WASM-text 文件通常以 .wat 结尾。第一步创建一个名为 helloworld.wat 的空文本文件，用你最喜欢的文本编辑器打开它，然后粘贴进去：(module ;; 从 JavaScript 命名空间导入 (import "console" "log" (func $log (param i32 i32))) ;; 导入 log 函数 (import "js" "mem" (memory 1)) ;; 导入 1 页 内存（64kb） ;; 我们的模块的数据段 (data (i32.const 0) "Hello World from WebAssembly!") ;; 函数声明：导出 helloWorld()，无参数 (func (export "helloWorld") i32.const 0 ;; 传递偏移 0 到 log i32.const 29 ;; 传递长度 29 到 log（示例文本的字符串长度） call $log ) ) WASM-text 格式是基于 S 表达式的。为了实现交互，JavaScript 函数用 import 语句导入，WebAssembly 函数用 export 语句导出。在这个例子中，从 console 模块中导入 log 函数，它需要两个类型为 i32 的参数作为输入，以及一页内存（64KB）来存储字符串。字符串将被写入偏移量 为 0 的数据段。数据段是你的内存的 叠加投影 overlay ，内存是在 JavaScript 部分分配的。函数用关键字 func 标记。当进入函数时，栈是空的。在调用另一个函数之前，函数参数会被压入栈中（这里是偏移量和长度）（见 call $log）。当一个函数返回一个 f32 类型时（例如），当离开函数时，一个 f32 变量必须保留在栈中（但在本例中不是这样）。创建 .wasm 文件WASM-text 和 WebAssembly 字节码是 1:1 对应的，这意味着你可以将 WASM-text 转换成字节码（反之亦然）。你已经有了 WASM-text，现在将创建字节码。转换可以通过 WebAssembly Binary Toolkit（WABT）来完成。从该链接克隆仓库，并按照安装说明进行安装。建立工具链后，打开控制台并输入以下内容，将 WASM-text 转换为字节码：wat2wasm helloworld.wat -o helloworld.wasm 你也可以用以下方法将字节码转换为 WASM-text：wasm2wat helloworld.wasm -o helloworld_reverse.wat 一个从 .wasm 文件创建的 .wat 文件不包括任何函数或参数名称。默认情况下，WebAssembly 用它们的索引来识别函数和参数。编译 .wasm 文件目前，WebAssembly 只与 JavaScript 共存，所以你必须编写一个简短的脚本来加载和编译 .wasm 文件并进行函数调用。你还需要在 WebAssembly 模块中定义你要导入的函数。创建一个空的文本文件，并将其命名为 helloworld.html，然后打开你喜欢的文本编辑器并粘贴进去： Simple template WebAssembly.Memory(...) 方法返回一个大小为 64KB 的内存页。函数 consoleLogString 根据长度和偏移量从该内存页读取一个字符串。这两个对象作为 importObject 的一部分传递给你的 WebAssembly 模块。在你运行这个例子之前，你可能必须允许 Firefox 从这个目录中访问文件，在地址栏输入 about:config，并将 privacy.file_unique_origin 设置为 true：注意： 这样做会使你容易受到 CVE-2019-11730 安全问题的影响。现在，在 Firefox 中打开 helloworld.html，按下 Ctrl+K 打开开发者控制台。了解更多这个 Hello World 的例子只是 MDN 的 了解 WebAssembly 文本格式 文档中的教程之一。如果你想了解更多关于 WebAssembly 的知识以及它的工作原理，可以看看这些文档。via: https://opensource.com/article/21/3/hello-world-webassembly作者：Stephan Avenwedde 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
了解在 Firefox 上运行 WebAssembly 的机会和局限性。WebAssembly 是一种可移植的执行格式，由于它能够以近乎原生的速度在浏览器中执行应用而引起了人们的极大兴趣。WebAssembly 本质上有一些特殊的属性和局限性。但是，通过将其与其他技术结合，将出现全新的可能性，尤其是与浏览器中的游戏有关的可能性。本文介绍了在 Firefox 上运行 WebAssembly 的概念、可能性和局限性。沙盒WebAssembly 有 严格的安全策略。 WebAssembly 中的程序或功能单元称为模块。每个模块实例都运行在自己的隔离内存空间中。因此，即使同一个网页加载了多个模块，它们也无法访问另一个模块的虚拟地址空间。设计上，WebAssembly 还考虑了内存安全性和控制流完整性，这使得（几乎）确定性的执行成为可能。Web API通过 JavaScript Web API 可以访问多种输入和输出设备。根据这个 提案，将来可以不用绕道到 JavaScript 来访问 Web API。C++ 程序员可以在 Emscripten.org 上找到有关访问 Web API 的信息。Rust 程序员可以使用 rustwasm.github.io 中写的 wasm-bindgen 库。文件输入/输出因为 WebAssembly 是在沙盒环境中执行的，所以当它在浏览器中执行时，它无法访问主机的文件系统。但是，Emscripten 提供了虚拟文件系统形式的解决方案。Emscripten 使在编译时将文件预加载到内存文件系统成为可能。然后可以像在普通文件系统上一样从 WebAssembly 应用中读取这些文件。这个 教程 提供了更多信息。持久化数据如果你需要在客户端存储持久化数据，那么必须通过 JavaScript Web API 来完成。请参考 Mozilla 开发者网络（MDN）关于 浏览器存储限制和过期标准 的文档，了解不同方法的详细信息。内存管理WebAssembly 模块作为 堆栈机 在线性内存上运行。这意味着堆内存分配等概念是没有的。然而，如果你在 C++ 中使用 new 或者在 Rust 中使用 Box::new，你会期望它会进行堆内存分配。将堆内存分配请求转换成 WebAssembly 的方式在很大程度上依赖于工具链。你可以在 Frank Rehberger 关于 WebAssembly 和动态内存 的文章中找到关于不同工具链如何处理堆内存分配的详细分析。游戏！与 WebGL 结合使用时，WebAssembly 的执行速度很高，因此可以在浏览器中运行原生游戏。大型专有游戏引擎 Unity 和虚幻 4 展示了 WebGL 可以实现的功能。也有使用 WebAssembly 和 WebGL 接口的开源游戏引擎。这里有些例子：自 2011 年 11 月起，id Tech 4 引擎（更常称之为 Doom 3 引擎）可在 GitHub 上以 GPL 许可的形式获得。此外，还有一个 Doom 3 的 WebAssembly 移植版。Urho3D 引擎提供了一些 令人印象深刻的例子，它们可以在浏览器中运行。如果你喜欢复古游戏，可以试试这个 Game Boy 模拟器。Godot 引擎也能生成 WebAssembly。我找不到演示，但 Godot 编辑器 已经被移植到 WebAssembly 上。有关 WebAssembly 的更多信息WebAssembly 是一项很有前途的技术，我相信我们将来会越来越多地看到它。除了在浏览器中执行之外，WebAssembly 还可以用作可移植的执行格式。Wasmer 容器主机使你可以在各种平台上执行 WebAssembly 代码。如果你需要更多的演示、示例和教程，请看一下这个 WebAssembly 主题集合。Mozilla 的 游戏和示例合集 并非全是 WebAssembly，但仍然值得一看。via: https://opensource.com/article/21/3/webassembly-firefox作者：Stephan Avenwedde 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
到底什么是 WebAssembly？WebAssembly，也叫 Wasm，是一种为 Web 优化的代码格式和 API（应用编程接口），它可以大大提高网站的性能和能力。WebAssembly 的 1.0 版本于 2017 年发布，并于 2019 年成为 W3C 官方标准。该标准得到了所有主流浏览器供应商的积极支持，原因显而易见：官方列出的 “浏览器内部”用例 中提到了，其中包括视频编辑、3D 游戏、虚拟和增强现实、p2p 服务和科学模拟。除了让浏览器的功能比JavaScript 强大得多，该标准甚至可以延长网站的寿命：例如，正是 WebAssembly 为 互联网档案馆的 Flash 动画和游戏 提供了持续的支持。不过，WebAssembly 并不只用于浏览器，目前它还被用于移动和基于边缘环境的 Cloudflare Workers 等产品中。WebAssembly 如何工作？.wasm 格式的文件包含低级二进制指令（字节码），可由使用通用栈的虚拟机以“接近 CPU 原生速度”执行。这些代码被打包成模块（可以被浏览器直接执行的对象），每个模块可以被一个网页多次实例化。模块内部定义的函数被列在一个专用数组中，或称为 表 Table ，相应的数据被包含在另一个结构中，称为 缓存数组 arraybuffer 。开发者可以通过 Javascript WebAssembly.memory() 的调用，为 .wasm 代码显式分配内存。.wasm 格式也有纯文本版本，它可以大大简化学习和调试。然而，WebAssembly 并不是真的要供人直接使用。从技术上讲，.wasm 只是一个与浏览器兼容的编译目标：一种用高级编程语言编写的软件编译器可以自动翻译的代码格式。这种选择正是使开发人员能够使用数十亿人熟悉的语言（C/C++、Python、Go、Rust 等）直接为用户界面进行编程的方式，但以前浏览器无法对其进行有效利用。更妙的是，至少在理论上程序员可以利用它们，无需直接查看 WebAssembly 代码，也无需担心物理 CPU 实际运行他们的代码（因为目标是一个虚拟机）。但是我们已经有了 JavaScript，我们真的需要 WebAssembly 吗？是的，有几个原因。首先，作为二进制指令，.wasm 文件比同等功能的 JavaScript 文件小得多，下载速度也快得多。最重要的是，Javascript 文件必须在浏览器将其转换为其内部虚拟机可用的字节码之前进行完全解析和验证。而 .wasm 文件则可以一次性验证和编译，从而使“流式编译”成为可能：浏览器在开始下载它们的那一刻就可以开始编译和执行它们，就像串流电影一样。这就是说，并不是所有可以想到的 WebAssembly 应用都肯定会比由专业程序员手动优化的等效 JavaScript 应用更快或更小。例如，如果一些 .wasm 需要包含 JavaScript 不需要的库，这种情况可能会发生。WebAssembly 是否会让 JavaScript 过时？一句话：不会。暂时不会，至少在浏览器内不会。WebAssembly 模块仍然需要 JavaScript，因为在设计上它们不能访问文档对象模型 （DOM）—— 主要用于修改网页的 API。此外，.wasm 代码不能进行系统调用或读取浏览器的内存。WebAssembly 只能在沙箱中运行，一般来说，它能与外界的交互甚至比 JavaScript 更少，而且只能通过 JavaScript 接口进行。因此，至少在不久的将来 .wasm 模块将只是通过 JavaScript 提供那些如果用 JavaScript 语言编写会消耗更多带宽、内存或 CPU 时间的部分。Web 浏览器如何运行 WebAssembly？一般来说，浏览器至少需要两块来处理动态应用：运行应用代码的虚拟机（VM），以及可以同时修改浏览器行为和网页显示的 API。现代浏览器内部的虚拟机通过以下方式同时支持 JavaScript 和 WebAssembly：浏览器下载一个用 HTML 标记语言编写的网页，然后进行渲染如果该 HTML 调用 JavaScript 代码，浏览器的虚拟机就会执行该代码。但是...如果 JavaScript 代码中包含了 WebAssembly 模块的实例，那么就按照上面的描述获取该实例，然后根据需要通过 JavaScript 的 WebAssembly API 来使用该实例当 WebAssembly 代码产生的东西将修改 DOM（即“宿主”网页）的结构，JavaScript 代码就会接收到，并继续进行实际的修改。我如何才能创建可用的 WebAssembly 代码？越来越多的编程语言社区支持直接编译到 Wasm，我们建议从 webassembly.org 的 入门指南 开始，这取决于你使用什么语言。请注意，并不是所有的编程语言都有相同水平的 Wasm 支持，因此你的工作量可能会有所不同。我们计划在未来几个月内发布一系列文章，提供更多关于 WebAssembly 的信息。要自己开始使用它，你可以报名参加 Linux 基金会的免费 WebAssembly 介绍在线培训课程。这篇WebAssembly 介绍首次发布在 Linux Foundation – Training。via: https://www.linux.com/news/an-introduction-to-webassembly/作者：Dan Brown 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
了解有关在 Web 浏览器中运行任何代码的最新方法的更多信息。如果你还没有听说过 WebAssembly，那么你很快就会知道。这是业界最保密的秘密之一，但它无处不在。所有主流的浏览器都支持它，并且它也将在服务器端使用。它很快，它能用于游戏编程。这是主要的国际网络标准组织万维网联盟（W3C）的一个开放标准。你可能会说：“哇，这听起来像是我应该学习编程的东西！”你可能是对的，但也是错的。你不需要用 WebAssembly 编程。让我们花一些时间来学习这种通常被缩写为“Wasm”的技术。它从哪里来？大约十年前，人们越来越认识到，广泛使用的 JavaScript 不够快速，无法满足许多目的。JavaScript 无疑是成功和方便的。它可以在任何浏览器中运行，并启用了今天我们认为理所当然的动态网页类型。但这是一种高级语言，在设计时并没有考虑到计算密集型工作负载。然而，尽管负责主流 web 浏览器的工程师们对性能问题的看法大体一致，但他们对如何解决这个问题却意见不一。出现了两个阵营，谷歌开始了它的 原生客户端 Native Client 项目，后来又推出了 可移植原生客户端 Portable Native Client 变体，着重于允许用 C/C++ 编写的游戏和其它软件在 Chrome 的一个安全隔间中运行。与此同时，Mozilla 赢得了微软对 asm.js 的支持。该方法更新了浏览器，因此它可以非常快速地运行 JavaScript 指令的低级子集（有另一个项目可以将 C/C++ 代码转换为这些指令）。由于这两个阵营都没有得到广泛采用，各方在 2015 年同意围绕一种称为 WebAssembly 的新标准，以 asm.js 所采用的基本方法为基础，联合起来。如 CNET 的 Stephen Shankland 当时所写，“在当今的 Web 上，浏览器的 JavaScript 将这些指令转换为机器代码。但是，通过 WebAssembly，程序员可以在此过程的早期阶段完成很多工作，从而生成介于两种状态之间的程序。这使浏览器摆脱了创建机器代码的繁琐工作，但也实现了 Web 的承诺 —— 该软件将在具有浏览器的任何设备上运行，而无需考虑基础硬件的细节。”在 2017 年，Mozilla 宣布了它的最小可行的产品（MVP），并使其脱离预览版阶段。到该年年底，所有主流的浏览器都采用了它。2019 年 12 月，WebAssembly 工作组发布了三个 W3C 推荐的 WebAssembly 规范。WebAssembly 定义了一种可执行程序的可移植二进制代码格式、相应的文本汇编语言以及用于促进此类程序与其宿主环境之间的交互接口。WebAssembly 代码在低级虚拟机中运行，这个可运行于许多微处理器之上的虚拟机可模仿这些处理器的功能。通过即时（JIT）编译或解释，WebAssembly 引擎可以以近乎原生平台编译代码的速度执行。为什么现在感兴趣？当然，最近对 WebAssembly 感兴趣的部分原因是最初希望在浏览器中运行更多计算密集型代码。尤其是笔记本电脑用户，越来越多的时间都花在浏览器上（或者，对于 Chromebook 用户来说，基本上是所有时间）。这种趋势已经迫切需要消除在浏览器中运行各种应用程序的障碍。这些障碍之一通常是性能的某些方面，这正是 WebAssembly 及其前身最初旨在解决的问题。但是，WebAssembly 并不仅仅适用于浏览器。在 2019 年，Mozilla 宣布了一个名为 WASI（ WebAssembly 系统接口 WebAssembly System Interface ）的项目，以标准化 WebAssembly 代码如何与浏览器上下文之外的操作系统进行交互。通过将浏览器对 WebAssembly 和 WASI 的支持结合在一起，编译后的二进制文件将能够以接近原生的速度，跨不同的设备和操作系统在浏览器内外运行。WebAssembly 的低开销立即使它可以在浏览器之外使用，但这无疑是赌注；显然，还有其它不会引入性能瓶颈的运行应用程序的方法。为什么要专门使用 WebAssembly？一个重要的原因是它的可移植性。如今，像 C++ 和 Rust 这样的广泛使用的编译语言可能是与 WebAssembly 关联最紧密的语言。但是，各种各样的其他语言可以编译为 WebAssembly 或拥有它们的 WebAssembly 虚拟机。此外，尽管 WebAssembly 为其执行环境假定了某些先决条件，但它被设计为在各种操作系统和指令集体系结构上有效执行。因此，WebAssembly 代码可以使用多种语言编写，并可以在多种操作系统和处理器类型上运行。另一个 WebAssembly 优势源于这样一个事实：代码在虚拟机中运行。因此，每个 WebAssembly 模块都在沙盒环境中执行，并使用故障隔离技术将其与宿主机运行时环境分开。这意味着，对于其它部分而言，应用程序独立于其宿主机环境的其余部分执行，如果不调用适当的 API，就无法摆脱沙箱。WebAssembly 现状这一切在实践中意味着什么？如今在运作中的 WebAssembly 的一个例子是 Enarx。Enarx 是一个提供硬件独立性的项目，可使用 受信任的执行环境 Trusted Execution Environments （TEE）保护应用程序的安全。Enarx 使你可以安全地将编译为 WebAssembly 的应用程序始终交付到云服务商，并远程执行它。正如 Red Hat 安全工程师 Nathaniel McCallum 指出的那样：“我们这样做的方式是，我们将你的应用程序作为输入，并使用远程硬件执行认证过程。我们使用加密技术验证了远程硬件实际上是它声称的硬件。最终的结果不仅是我们对硬件的信任度提高了；它也是一个会话密钥，我们可以使用它将加密的代码和数据传递到我们刚刚要求加密验证的环境中。”另一个例子是 OPA， 开放策略代理 Open Policy Agent ，它发布于 2019 年 11 月，你可以编译他们的策略定义语言 Rego 为 WebAssembly。Rego 允许你编写逻辑来搜索和组合来自不同来源的 JSON/YAML 数据，以询问诸如“是否允许使用此 API？”之类的问题。OPA 已被用于支持策略的软件，包括但不限于 Kubernetes。使用 OPA 之类的工具来简化策略被认为是在各种不同环境中正确保护 Kubernetes 部署的重要步骤。WebAssembly 的可移植性和内置的安全功能非常适合这些工具。我们的最后一个例子是 Unity。还记得我们在文章开头提到过 WebAssembly 可用于游戏吗？好吧，跨平台游戏引擎 Unity 是 WebAssembly 的较早采用者，它提供了在浏览器中运行的 Wasm 的首个演示品，并且自 2018 年 8 月以来，已将 WebAssembly用作 Unity WebGL 构建目标的输出目标。这些只是 WebAssembly 已经开始产生影响的几种方式。你可以在 https://webassembly.org/ 上查找更多信息并了解 Wasm 的所有最新信息。via: https://opensource.com/article/20/1/webassembly作者：Mike Bursell 选题：lujun9972 译者：laingke 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出