人们对WebAssembly有些误解。他们认为在2017年登陆浏览器的WebAssembly - 我们称之为WebAssembly的最小可行产品(或MVP) - 是WebAssembly的最终版本。
我可以理解这类误解来自何处。WebAssembly社区组实际上致力于后向兼容。这意味着你今天所创建的WebAssembly将继续在未来的某版浏览器上工作。
但这并不意味着WebAssembly是功能完整的。事实上,它远非如此。WebAssembly将会有许多功能,它们将从根本上改变你使用WebAssembly所能做的事情。
我认为这些未来的功能有点像电子游戏中的技能树。我们已经完全掌握了这些技能中的前几项,但我们还需要完善下面的整个技能树来解锁所有应用程序。
那么让我们看看已经存在的概念,然后我们就可以看到未来的将会有哪些新的东西。
WebAssembly故事的最开始于Emscripten,它可以通过将C ++代码转译为JavaScript实现了在Web上运行C++代码。这使得有可能将大量现有的C++代码库(如游戏和桌面应用程序)带入到Web中。
但它自动生成的JS仍然比作为对比的原生代码慢得多。但Mozilla工程师发现了一个隐藏在所生成的JavaScript中的类型系统,并给出了如何使JavaScript运行得飞快的方法。这个JavaScript子集被命名为asm.js。
其他浏览器供应商看到asm.js的速度有多快之后,他们也开始向他们自己的引擎中添加同样的优化处理。
但这并不是故事的结束。这只是一个开始。引擎自身可以做些事情使其运行更快。
但他们无法在JavaScript本身中做到这一点。因此,他们需要一种新的语言 - 专门为编译而设计的语言。这就是WebAssembly。
那么第一版WebAssembly需要哪些技能呢?我们需要什么才能实现可以在网络上有效运行C和C++的最小可行产品呢?
使用WebAssembly的人知道他们不想仅支持C和C++。他们希望能够将许多不同的语言编译为WebAssembly。所以他们需要一个与语言无关的编译目标。
他们需要类似汇编语言这样的东西,像桌面应用程序可被编译成x86一样。但这种汇编语言不适用于实际的物理机。这将是一个概念机。
编译目标必须被设计,以便它可以非常快地运行。否则,在Web上运行的WebAssembly应用程序将无法满足用户对平滑交互和游戏的期望。
除了执行时间,加载时间也需要快。 用户对某些内容的加载速度有一定的期望。 对于桌面应用程序,由于应用程序已安装在您的计算机上,因此它们会快速加载。 对于 Web 应用程序,因为 Web 应用程序通常不必加载与桌面应用程序一样多的代码,用户也期望加载很快。
但是,当你将这两件事结合起来时,它会变得棘手。 桌面应用程序通常是相当大的代码库。 因此,如果它们在网络上,当用户第一次访问 URL 时,需要下载和编译很多内容。
为了满足这些期望,我们需要我们的编译器目标是紧凑的。 这样,它可以快速通过网络传输。
除了执行时间,加载时间也需要快速。用户对某些内容的加载速度有一定的期望。对于桌面应用程序来说,由于应用程序已安装在你的计算机上,因此对它们的期望是快速加载。对于 Web 应用程序,期望也是加载时间能够尽可能短,因为 Web 应用程序通常不必加载与桌面应用程序一样多的代码。
但是,当你将这两件事结合起来时,它会变得很棘手。桌面应用程序通常是相当庞大的代码库。因此,如果它们位于网络上,当用户第一次访问此 URL 时,需要下载和编译很多内容。
为了满足这些预期,我们需要我们的编译器目标是紧凑的。这样,它可以快速通过网络进行传输。
这些语言还需要能够以不同于 JavaScript 使用内存的方式使用内存。他们需要能够直接管理他们的内存 —— 能区分出哪些字节一起使用。
这是因为像 C 和 C++ 这样的语言有一个叫做指针的底层特性。你可以拥有一个没有值的,但具有该值的内存地址的变量。因此,如果你要支持指针,程序需要能够从特定地址进行写入和读取。
但是,你无法实现从网上下载的程序可无限访问内存中的字节,任意访问它们想访问的地址。因此,为了创建一种对内存访问的安全方式,就像使用原生程序做法一样,我们必须创建一些可以对特定区域内存访问的东西,并且别无它法。
为此,WebAssembly 使用线性内存模型。这是使用 TypedArrays 实现的。它基本上就像一个 JavaScript 数组,除了这个数组是仅包含字节的内存。当你访问其中的数据时,你只需使用数组索引,你可以将其视为内存地址。这意味着你可以假装这个数组是 C++ 中的内存。
因此,使用所有这些技能,人们可以在浏览器中运行桌面应用程序和游戏,就好像他们在其计算机上本机运行一样。
这几乎就是 WebAssembly 作为 MVP 发布时的大致技能。它确实是MVP——最小可行产品。
它还支持某些类型的应用程序正常工作,但仍有许多其他技能可解锁。
下一个解锁的成就是更重量级的桌面应用程序。
你能设想像 Photoshop 这样的应用程序在你的浏览器中运行的场景吗? 如果你可以像使用 Gmail 一样在任何设备上即时加载它呢?
我们已经开始见证这样的事情。例如,Autodesk 的 AutoCAD 团队已使其 CAD 软件在浏览器中可用。Adobe 已经使用 WebAssembly 通过浏览器提供了 Lightroom。
但这也有一些我们还需要增加的功能,以确保所有这些应用程序 —— 即使是最最重量级的应用在浏览器中也能运行良好。
首先,我们需要支持多线程。现代计算机拥有多核。这些基本上是多个可并行处理问题的大脑。这可以使事情完成更快,但是为了使用这些核,你需要支持线程。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务