这篇博客文章是这一系列解释如何将Rust发射到地球以外的许多星系的文章的一部分:
- 前奏
- WebAssembly 星系(当前这一集),
- ASM.js星系
- c 星系
- PHP星系,以及
- NodeJS 星系
我们的Rust解析器将探索的第一个星系是WebAssembly (WASM)星系。本文将解释什么是WebAssembly,如何将我们的解析器编译成WebAssembly,以及如何在浏览器中的Javascript或者NodeJS一起使用WebAssembly二进制文件。
什么是WebAssembly,为什么需要WebAssembly?
如果您已经了解WebAssembly,可以跳过这一部分。
WebAssembly的定义如下:
WebAssembly(缩写:Wasm)是一种基于堆栈虚拟机的二进制指令格式。Wasm被设计为是可移植的目标格式,可将高级语言(如C/ C++ /Rust)编译为Wasm,使客户端和服务器端应用程序能部署在web上。
我还需要说更多吗?也许是的…
WebAssembly是一种新的可移植二进制格式。像C、C++或Rust这样的语言已经能够编译到这个目标格式。它是ASM.js的精神的继承者。我所说的精神继承者,是指都是相同的一群试图扩展Web平台和使Web变得更快的人,他们同时使用这两种技术,他们也有一些共同的设计理念,但现在这并不重要。
在WebAssembly之前,程序必须编译成Javascript才能在Web平台上运行。这样的输出文件大部分时间都很大。因为Web是基于网络的文件必须下载,这是很耗时的。WebAssembly被设计成一种大小和加载时高效的二进制格式。
从很多方面来看,WebAssembly也比Javascript更快。尽管工程师们在Javascript虚拟机中进行了各种疯狂的优化,但Javascript是一种弱动态类型语言,需要解释运行。WebAssembly旨在利用通用的硬件功能以原始速度执行。WebAssembly的加载速度也比Javascript快,因为解析和编译是在二进制文件从网络传输时进行的。因此,一旦完成了二进制文件下载,它就可以运行了:无需在运行程序之前等待解析器和编译器。
当前我们就已经能够编写一个Rust程序,并将其编译在Web平台上运行,我们的博客系列就是一个完美的例子,为什么要这么做呢? 因为WebAssembly已经在所有主流浏览器实现,而且因为它是为Web而设计的:在Web平台上(像浏览器一样)生存和运行。但是,它的可移植性、安全性和沙箱内存设计使其成为在Web平台之外运行的理想选择(请参阅无服务器的WASM框架或为WASM构建的应用程序容器)。
我认为需要强调的时候,WebAssembly并不是用来替代Javascript的。它只是另一种技术,它解决了我们今天可能遇到的许多问题,比如加载时间、安全性或速度。
##Rust