WebAssembly 的未来:成长技能树 已翻译 100%

oschina 投递于 2018/10/29 17:13 (共 49 段, 翻译完成于 12-07)
阅读 2709
收藏 36
2
加载中

人们对WebAssembly有些误解。他们认为在2017年登陆浏览器的WebAssembly - 我们称之为WebAssembly的最小可行产品(或MVP) - 是WebAssembly的最终版本。

我可以理解这类误解来自何处。WebAssembly社区组实际上致力于后向兼容。这意味着你今天所创建的WebAssembly将继续在未来的某版浏览器上工作。

但这并不意味着WebAssembly是功能完整的。事实上,它远非如此。WebAssembly将会有许多功能,它们将从根本上改变你使用WebAssembly所能做的事情。

我认为这些未来的功能有点像电子游戏中的技能树。我们已经完全掌握了这些技能中的前几项,但我们还需要完善下面的整个技能树来解锁所有应用程序。

Skill tree showing WebAssembly skills which will be filled in through the course of the post.

那么让我们看看已经存在的概念,然后我们就可以看到未来的将会有哪些新的东西。

Tocy
Tocy
翻译于 2018/11/06 14:10
0

Minimum Viable Product (MVP) 最小可行产品

WebAssembly故事的最开始于Emscripten,它可以通过将C ++代码转译为JavaScript实现了在Web上运行C++代码。这使得有可能将大量现有的C++代码库(如游戏和桌面应用程序)带入到Web中。

但它自动生成的JS仍然比作为对比的原生代码慢得多。但Mozilla工程师发现了一个隐藏在所生成的JavaScript中的类型系统,并给出了如何使JavaScript运行得飞快的方法。这个JavaScript子集被命名为asm.js

其他浏览器供应商看到asm.js的速度有多快之后,他们也开始向他们自己的引擎中添加同样的优化处理。

但这并不是故事的结束。这只是一个开始。引擎自身可以做些事情使其运行更快。

但他们无法在JavaScript本身中做到这一点。因此,他们需要一种新的语言 - 专门为编译而设计的语言。这就是WebAssembly。

那么第一版WebAssembly需要哪些技能呢?我们需要什么才能实现可以在网络上有效运行C和C++的最小可行产品呢?

Tocy
Tocy
翻译于 2018/11/06 15:49
0

技能: 编译目标

使用WebAssembly的人知道他们不想仅支持C和C++。他们希望能够将许多不同的语言编译为WebAssembly。所以他们需要一个与语言无关的编译目标。

他们需要类似汇编语言这样的东西,像桌面应用程序可被编译成x86一样。但这种汇编语言不适用于实际的物理机。这将是一个概念机。

Tocy
Tocy
翻译于 2018/10/30 09:28
0

技能: 快速执行

编译目标必须被设计,以便它可以非常快地运行。否则,在Web上运行的WebAssembly应用程序将无法满足用户对平滑交互和游戏的期望。

Tocy
Tocy
翻译于 2018/10/30 09:30
0

技巧: 紧凑

除了执行时间,加载时间也需要快。 用户对某些内容的加载速度有一定的期望。 对于桌面应用程序,由于应用程序已安装在您的计算机上,因此它们会快速加载。 对于 Web 应用程序,因为 Web 应用程序通常不必加载与桌面应用程序一样多的代码,用户也期望加载很快。

但是,当你将这两件事结合起来时,它会变得棘手。 桌面应用程序通常是相当大的代码库。 因此,如果它们在网络上,当用户第一次访问 URL 时,需要下载和编译很多内容。

为了满足这些期望,我们需要我们的编译器目标是紧凑的。 这样,它可以快速通过网络传输。

溪边九节
溪边九节
翻译于 2018/11/06 09:37
0

技能:线性内存

除了执行时间,加载时间也需要快速。用户对某些内容的加载速度有一定的期望。对于桌面应用程序来说,由于应用程序已安装在你的计算机上,因此对它们的期望是快速加载。对于 Web 应用程序,期望也是加载时间能够尽可能短,因为 Web 应用程序通常不必加载与桌面应用程序一样多的代码。

但是,当你将这两件事结合起来时,它会变得很棘手。桌面应用程序通常是相当庞大的代码库。因此,如果它们位于网络上,当用户第一次访问此 URL 时,需要下载和编译很多内容。

为了满足这些预期,我们需要我们的编译器目标是紧凑的。这样,它可以快速通过网络进行传输。

Tocy
Tocy
翻译于 2018/11/07 18:43
0

技能:线性内存

这些语言还需要能够以不同于 JavaScript 使用内存的方式使用内存。他们需要能够直接管理他们的内存 —— 能区分出哪些字节一起使用。

这是因为像 C 和 C++ 这样的语言有一个叫做指针的底层特性。你可以拥有一个没有值的,但具有该值的内存地址的变量。因此,如果你要支持指针,程序需要能够从特定地址进行写入和读取。

但是,你无法实现从网上下载的程序可无限访问内存中的字节,任意访问它们想访问的地址。因此,为了创建一种对内存访问的安全方式,就像使用原生程序做法一样,我们必须创建一些可以对特定区域内存访问的东西,并且别无它法。

为此,WebAssembly 使用线性内存模型。这是使用 TypedArrays 实现的。它基本上就像一个 JavaScript 数组,除了这个数组是仅包含字节的内存。当你访问其中的数据时,你只需使用数组索引,你可以将其视为内存地址。这意味着你可以假装这个数组是 C++ 中的内存。

Tocy
Tocy
翻译于 2018/11/08 12:11
0

已解锁成就

因此,使用所有这些技能,人们可以在浏览器中运行桌面应用程序和游戏,就好像他们在其计算机上本机运行一样。

这几乎就是 WebAssembly 作为 MVP 发布时的大致技能。它确实是MVP——最小可行产品。

它还支持某些类型的应用程序正常工作,但仍有许多其他技能可解锁。

Tocy
Tocy
翻译于 2018/11/08 12:20
0

重量级桌面应用程序

下一个解锁的成就是更重量级的桌面应用程序。

你能设想像 Photoshop 这样的应用程序在你的浏览器中运行的场景吗? 如果你可以像使用 Gmail 一样在任何设备上即时加载它呢?

我们已经开始见证这样的事情。例如,Autodesk 的 AutoCAD 团队已使其 CAD 软件在浏览器中可用。Adobe 已经使用 WebAssembly 通过浏览器提供了 Lightroom。

但这也有一些我们还需要增加的功能,以确保所有这些应用程序 —— 即使是最最重量级的应用在浏览器中也能运行良好。

Tocy
Tocy
翻译于 2018/11/13 18:29
0

技能: 线程化

首先,我们需要支持多线程。现代计算机拥有多核。这些基本上是多个可并行处理问题的大脑。这可以使事情完成更快,但是为了使用这些核,你需要支持线程。

Tocy
Tocy
翻译于 2018/10/30 09:32
0
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(8)

久永
久永
专业经典,永久收藏!
s
shifeng1983
c/c++写出来的wams,跟python写出来的执行效率一样吗?
全体人员
全体人员
我在想,是否可以给typescript加上更精确的类型(uint32/int16等),然后(类型精确的部分)直接编译生成wasm……
野薯
野薯

引用来自“helloclia”的评论

任何能够用Rust实现的应用系统,最终都必将用Rust实现。

引用来自“Jason909”的评论

任何能够用带GC的语言实现的程序,最终都必将用带GC的语言实现,其余的才考虑用Rust。
js能完成的事情,绝不用其他语言去完成!
J
Jason909

引用来自“helloclia”的评论

任何能够用Rust实现的应用系统,最终都必将用Rust实现。
任何能够用带GC的语言实现的程序,最终都必将用带GC的语言实现,其余的才考虑用Rust。
helloclia
helloclia
任何能够用Rust实现的应用系统,最终都必将用Rust实现。
冰力
冰力
支持 Mozilla Firefox,这些年 web 标准推进的很快
chai2010
chai2010
WebAssembly资料精选:
https://github.com/chai2010/awesome-wasm-zh

欢迎关注《C/C++面向wasm编程》开源图书
https://github.com/3dgen/cppwasm-book
返回顶部
顶部