强化WebAssembly与Javascript互通性 Rust向网页语言再进一步

Rust社区目标要让Javascript与Rust能够互相调用函数,Rust可以调用主机的函数,而Rust函数库(Crate)能够依赖NPM套件,Javascript与Rust也都能互相使用主动的方式传递对象。


Mozilla强化了WebAssembly与Javascript的互通性,不只简化之间传值的程序,还简化了将其打包成NPM套件的工作,并让Javascript可以更主动的使用WebAssembly套件功能。

2018年Rust社区就是想让Rust成为网页语言,而Rust是个系统开发语言,因此在网页应用程序上,需要先把Rust编译为WebAssembly,因此他们通过改进WebAssembly,来让Rust能像Javasacript执行的一样好,而开发人员也能够像Javasacript一样使用WebAssembly。

强化Rust与Javascript的互通性,让Rust可以融入Javascript生态系统中,与其说要强化Rust与Javascript的互通性,倒不如说强化的是WebAssembly与Javascript的互通性,与此同时也惠及了C/ C++这类可以编译为WebAssembly的语言与Javascript的互通性。

Rust社区目标要让Javascript与Rust能够互相调用函数,Rust也可以调用主机的函数,而Rust函数库(Crate)能够依赖NPM套件,Javascript与Rust也都能使用主动的方式传递对象。 (来源:Mozilla)

而第一个要解决便是WebAssembly与Javascript互相传递对象的问题,这是最困难的部分之一,因为目前WebAssembly只支持整数以及浮点数两种形态,因此光是Javascript要发送字符串给WebAssembly函数,就够开发者忙的了。

开发者需要将英文本母编码成数字代码,再将第一个字母的索引传递给WebAssembly端,WebAssembly再由索引取得数字后对应回字母。传递字符串就如此大费功夫,就别论传递其他更复杂的对象了。

而Mozilla为这个复杂的过程制作了一个黑盒子,开发者不再需要理解传递对象的逻辑。只要在Rust代码中添加一些注释,Wasm-bindgen便能自动创建WebAssembly与Javascript两端需要的代码。而且基于Wasm-bindgen语言独立特性,未来也能在其他语言,诸如C/C++中使用。

使用Wasm-bindgen功能会产生一些文件,而这些文件需要被打包成一个NPM套件,并由Package.json描述相依性。 Mozilla为此打造了一站式打包功能,帮开发者把WebAssembly文件编译为NPM套件。 (来源:Mozilla)

该功能会为用户先执行Wasm-bindgen,接着把产生的文件打包一起,从Rust代码中产生Package.json详述相依性,而用户需要做的就只是发布NPM套件。

把WebAssembly打包成NPM后,下一步就是要让Javascript能够取用。 Mozilla开发者关系团队工程师Lin Clark表示,这是一件苦差事,从提取文件到准备相依性,每一个步骤都必须撰写代码来完成,而现在新提供的ES模块就能完成这件事,目标让使用WebAssembly模块就跟导入一样简单。不过,这件功能目前还不够完善,Mozilla正与TC39及WebAssembly社区规划标准化事宜。

Rust距离成为网页语言还有一段路,首要工作就是能与Javascript生态系统有良好的协作,但Lin Clark表示,Mozilla并没有想要让Rust取代Javascript,只不过有一些工作的确比较适合适Rust来进行,像是解析地图或是找出DOM的改变等。