【译】为何 WebAssembly 这么重要?

本文做者:Michael van der Gulik

原文连接:《Why WebAssembly is a big deal》html

译者与来源:敖小剑,敖小剑的博客git

本文已得到译者转载受权程序员

编者按:Michael van der Gulik 在《Why WebAssembly is big deal》一文中,详尽探索了 WebAssembly 在浏览器的实际用处,好比能够直接从网络获取应用,无需下载。但更为重要的是,Michael van der Gulik 在本文中还探索了 WebAssembly 在硬件与云计算的巨大潜力。github

如下为正文:web

WebAssembly 是每一个程序员都应该关注的技术。WebAssembly 会变得更流行。WebAssembly 将取代 JavaScript。WebAssembly 将取代 HTML 和 CSS。WebAssembly 将取代手机应用。WebAssembly 将取代桌面应用。在 10 年内,我保证每一个程序员至少须要知道如何使用工具来操做 WebAssembly 并理解它是如何工做的。编程

你可能会说,“太离谱了!” 好吧,请继续阅读。浏览器

什么是 WebAssembly

当前形式的 WebAssembly 是 Web 浏览器的新扩展,能够运行预编译代码…快速地。在 C ++ 中编写了一些小代码,而后使用 Emscripten 编译器将该代码编译为 WebAssembly。经过一些 Javascript 粘合,就能够在 Web 浏览器中调用这一小段代码,例如,运行粒子模拟缓存

WebAssembly 文件,扩展名为.wasm,自己是包含可执行指令的二进制格式。要使用该文件,必须编写一个运行某些 Javascript 的 HTML 文件来获取、编译和执行 WebAssembly 文件。WebAssembly 文件在基于堆栈的虚拟机上执行,并使用共享内存与其 JavaScript 包装器进行通讯。安全

到目前为止,这彷佛并不有趣。它看起来只不过是 JavaScript 的加速器。可是,聪明的读者会对 WebAssembly 可能成为何有所了解。服务器

WebAssembly 将成为何?

第一个重要发现是 WebAssembly 是一个安全的沙盒虚拟机。能够从 Internet 运行喜欢的 WebAssembly 代码,而确保它不会接管 PC 或服务器。四个主流 Web 浏览器对它的安全性很是有信心,它已经默认实现并启用了。它的真正安全性还有待观察,但安全性是 WebAssembly 的核心设计目标。

第二个重要发现是 WebAssembly 是一个通用的编译目标。它的原始编译器是一个 C 编译器,这个编译器很好地指示了 WebAssembly 虚拟机的低级和可重定向性。许多编程语言都使用 C 语言编写虚拟机,其余一些语言甚至使用 C 自己做为编译目标。

此时,有人整理了一个能够编译为 WebAssembly 的编程语言列表。这份名单将在将来不少年中继续增加。

WebAssembly 容许使用任何编程语言编写代码,而后让其余人在任何平台上安全地运行该代码,无需安装任何内容。朋友们,这是美美梦想的开始。

部署问题

咱们来谈谈如何将软件提供给用户。

为新项目选择编程语言的一个重要因素是如何将项目部署到客户。您的程序员喜欢用 Haskell,Python,Visual Basic 或其余语言编写应用程序,具体取决于他们的喜爱。要使用喜欢的语言,他们须要编译应用,制做一些可安装的软件包,并以某种方式将其安装在客户端的计算机上。有许多方法能够提供软件 - 包管理器,可执行安装程序或安装服务,如 Steam,Apple App Store,Google Play 或 Microsoft store。

每个安装机制都意味着痛苦,从应用商店安装时的轻微疼痛,到管理员要求在他的 PC 上运行一些旧的 COBOL 代码时的集群头痛。

部署是一个问题。对于开发人员和系统管理员来讲,部署一直是一个痛点。咱们使用的编程语言与咱们所针对的平台密切相关。若是大量用户在 PC 或移动设备上,咱们使用 HTML 和 Javascript。若是用户是 Apple 移动设备用户,咱们使用……呃…… Swift?(我实际上不知道)。若是用户在 Android 设备上,咱们使用 Java 或 Kotlin。若是用户在真实计算机上而且愿意处理掉他们的部署问题,那么咱们开发人员才能在咱们使用的编程语言中有更多选择。

WebAssembly 有可能解决部署问题。

有了 WebAssembly,您可使用任何编程语言编写应用,只要这些编程语言能够支持 WebAssembly,而应用能够在任何设备和任何具备现代 Web 浏览器的操做系统上运行。

硬件垄断

想购买台式机或笔记本电脑。有什么选择?好吧,有英特尔,有 AMD。多年来一直是双寡头垄断。保持这种双寡头垄断的一个缘由是 x86 架构只在这两家公司之间交叉许可,并且一般预编译的代码须要 x86 或 x86-64(也就是 AMD-64)架构。还有其余因素,例如设计世界上最快的 CPU 是一件很艰难但也很昂贵的事情。

WebAssembly 是一种可以让您在任何平台上运行代码的技术(之一)。若是它成为下一个风口,硬件市场将变得商品化。应用编译为 WebAssembly,就能够在任何东西上运行 - x86,ARM,RISC-V,SPARC。即使是操做系统市场也会商品化;您所须要的只是一个支持 WebAssembly 的浏览器,以便在硬件能够运行时运行最苛刻的应用程序。

编者注:Second State 研发的专为服务端优化的 WebAssembly 引擎 SSVM 已经能够运行在高通骁龙芯片上。Github 连接:https://github.com/second-sta...

云计算

但等等,还有更多。云计算成为IT经理办公室的流行词已有一段时间,WebAssembly 能够直接迎合它。

WebAssembly 在安全沙箱中执行。能够制做一个容器,它能够在服务器上接受和执行 WebAssembly 模块,而资源开销很小。对于提供的每一个服务,无需在虚拟机上运行完整的操做系统。托管提供商只提供对能够上传代码的WebAssembly 容器的访问权限。它能够是一个原始容器,接收 socket 并解析本身的 HTTP 链接,也能够是一个完整的 Web 服务容器,其中 WebAssembly 模块只须要处理预解析的HTTP请求。

这还不存在。若是有人想变得富有,那么能够考虑这个想法。

编者注:目前已经有人正在实现这个想法,Byte Alliance 计划将WebAssembly 带到浏览器以外,Second State 已经发布了为服务端设计的WebAssembly 引擎开发者预览版

不是云计算

WebAssembly 足以取代 PC 上本地安装的大多数应用程序。咱们已经使用 WebGL(又名OpenGL ES 2.0)移植了游戏。我预测不久以后,受益于WebAssembly,像 LibreOffice 这样的大型应用能够直接从网站上得到,而无需安装。

在这种状况下,在本地安装应用没什么意义。本地安装的应用和 WebAssembly 应用之间几乎没有区别。WebAssembly 应用已经可使用屏幕,键盘和鼠标进行交互。它能够在 2D 或 OpenGL 中进行图形处理,并使用硬件对视频流进行解码。能够播放和录制声音。能够访问网络摄像头。可使用 WebSockets。可使用 IndexedDB 存储大量数据在本地磁盘上。这些已是 Web 浏览器中的标准功能,而且均可以使用 JavaScript 向 WebAssembly 暴露。

目前惟一困难的地方是 WebAssembly 没法访问本地文件系统。好吧,能够经过 HTML 使用文件上传对话,但这不算。最终,总会有人为此建立 API,并可能称之为 “WASI”。

“从互联网上运行应用程序!?胡说八道!“,你说。好吧,这是使用 Qt 和 WebAssembly 实现的文本编辑器 (以及更多)。

这是一个简单的例子。复杂的例子是在 WebBrowser 中运行的 Adobe Premier Pro 或 Blender。或者考虑像 Steam 游戏同样能够直接从网络上运行。这听起来像小说,但从技术上说这并不是不能发生。

它会来的。

让咱们裸奔!

目前,WebAssembly 在包含 HTML 和 Javascript 包装器的环境中执行。为何不脱掉这些?有了 WebAssembly,为何还要在浏览器中包含 HTML 渲染器和 JavaScript 引擎?

经过为全部服务提供标准化 API,这些服务一般是 Web 浏览器提供的,能够建立裸 WebAssembly。就是没有 HTML和 Javascript 包装来管理的 WebAssembly。访问的网页是 .wasm 文件,浏览器会抓取并运行该文件。浏览器为WebAssembly 模块提供画布,事件处理程序以及对浏览器提供的全部服务的访问。

这目前还不存在。若是如今使用 Web 浏览器直接访问 .wasm 文件,它会询问是否要下载它。我假设将设计所需的 API 并使其工做。

结果是 Web 能够发展。网站再也不局限于 HTML,CSS 和 Javascript。能够建立全新的文档描述语言。能够发明全新的布局引擎。并且,对于像我这样的 polyglots 最相关,咱们能够选择任何编程语言来实如今线服务。

可访问性

但我听到了强烈抗议!可访问性怎么样??搜索引擎怎么办?

好吧,我尚未一个好的答案。但我能够想象几种技术解决方案。

一个解决方案是咱们保留内容和表现的分离。内容以标准化格式编写,例如 HTML。演示文稿由 WebAssembly 应用管理,该应用能够获取并显示内容。这容许网页设计师使用想要的任何技术进行任意演示 - 不须要 CSS,而搜索引擎和须要不一样类型的可访问性的用户仍然能够访问内容。

请记住,许多 WebAssembly 应用并非能够经过文本访问的,例如游戏和许多应用。盲人不会从图像编辑器中得到太多好处。

另外一个解决方案是发明一个 API,它能够做为 WebAssembly 模块,来提供想在屏幕上呈现的 DOM,供屏幕阅读器或搜索引擎使用。基本上会有两种表示形式:一种是在图形画布上,另外一种是产生结构化文本输出。

第三种解决方案是使用屏幕阅读器或搜索引擎可使用的元数据来加强画布。执行 WebAssembly 并在画布上呈现内容,其中包含描述渲染内容的额外元数据。例如,该元数据将包括屏幕上的区域是不是菜单以及存在哪些选项,或者区域是否想要文本输入,以及屏幕上的区域的天然排序(也称为标签顺序)是什么。基本上,曾经在 HTML 中描述的内容如今被描述为具备元数据的画布区域。一样,这只是一个想法,它可能在实践中很糟糕。

多是什么

1995年,Sun Microsystems 发布了 Java,带有 Java applets 和大量的宣传。有史以来第一次,网页能够作一些比<marquee>和 GIF 动画更有趣的事情。开发人员可使应用彻底在用户的 Web 浏览器中运行。它们没有集成到浏览器中,而是实现为繁重的插件,须要安装整个 JVM。1995年,这不是一个小的安装。applets 也须要一段时间来加载并使用大量内存。咱们如今凭借大量内存,这再也不是一个问题,但在 Java 生命的第一个十年里,它让体验变得使人厌烦。

applets 也不可靠。没法保证它们会运行,尤为是在用户使用 Microsoft 的实现时。他们也不安全,这是棺材里的最后一颗钉子。

以 JVM 为荣,其余语言最终演变为在 JVM 上运行。但如今,那艘船航行了。

FutureSplash / Macromedia / Adobe Flash 也是一个竞争者,可是是专有的,具备专有工具集和专有语言的专有格式。我读到他们确实在2009年开启了文件格式。最终从浏览器中删除了支持,由于它存在安全风险。

这里的结论是,若是但愿您的技术存在于每一个人的机器上,那么安全性就须要正视。我真诚地但愿 WebAssembly 做为标准对安全问题作出很好的反应。

须要什么?

WebAssembly 仍处于初期阶段。它目前能很好的运行代码,而规范版本是 1.0,二进制格式定型。目前正在开展SIMD 指令支持。经过 Web Workers 进行多线程处理也正在进行中。

工具可用,并将在将来几年不断改进。浏览器已经让你窥视 WebAssembly 文件。至少 Firefox 容许查看WebAssembly 字节码,设置断点并查看调用堆栈。我据说浏览器也有 profiling 支持。

语言支持包括一套不错的语言集合–C,C++和Rust是一流的公民。C#,Go和Lua显然有稳定的支持。Python,Scala,Ruby,Java和Typescript都有实验性支持。这多是一个傲慢的陈述,但我真的相信任何想要在21世纪存在的语言都须要可以在 WebAssembly 上编译或运行。

在访问外部设备的 API 支持方面,我所知道的惟一可用于裸 WebAssembly 的 API 是 WASI,它容许文件和流访问等核心功能,容许 WebAssembly 在浏览器外运行。不然,任何访问外部世界的 API 都须要在浏览器中的 Javascript 中实现。除了本地机器上的文件访问,打印机访问和其余新颖的硬件访问(例如非标准蓝牙或USB设备)以外,应用所需的一切几乎均可以知足。“裸WebAssembly”并非它成功的必要条件; 它只是一个小的优化,不须要浏览器包含对 HTML,CSS 或 Javascript 的支持。

我不肯定在桌面环境中让 WebAssembly 成为一等公民须要什么。须要良好的复制和粘贴支持,拖放支持,本地化和国际化,窗口管理事件以及建立通知的功能。也许这些已经能够从网络浏览器中得到; 我常常惊讶与已经可能的事情。

引起爆炸的火花是建立容许现有应用移植的环境。若是创造了“用于 WebAssembly 的 Linux 子系统”,那么能够将大量现有的开源软件移植到 WebAssembly 上。它须要模拟一个文件系统 - 能够经过将文件系统的全部只读部分都缓存为 HTTP 请求来完成,而且全部可写部分均可以在内存中,远程存储或使用浏览器能够提供的任何文件访问。图形支持能够经过移植 X11 或 Wayland 的实现来使用 WebGL(我理解已经做为 AIGLX 存在?)。

一些 SDL 游戏已经被移植到 WebAssembly - 最着名的是官方演示。

一旦 JVM 在 WebAssembly 中运行,就能够在浏览器中运行大量的 Java 软件。一样适用于其余虚拟机和使用它们的语言。

与 Windows 软件的巨大世界同样,我没有答案。WINE 和 ReactOS 都须要底层的 x86 或 x86-64 机器,因此惟一的选择是获取源代码并移植它,或者使用 x86 模拟器。

尾声

WebAssembly 即将到来。
它来得很慢,但如今全部的部分均可以在你正在使用的浏览器上使用。如今咱们等待构建用于从各类编程语言中定位 WebAssembly 的基础设施。一旦构建完成,咱们将摆脱 HTML,CSS 和 Javascript 的束缚。

相关阅读

相关文章
相关标签/搜索