实验进行中:.NET WebAssembly 支持

  • David Iffland
  • 张健欣

2017 年 12 月 12 日

话题:.NETJavaScript语言 & 开发

目前四大主流浏览器都默认支持 WebAssembly,而.NET 社区也在继续推动为.NET 开发者提供相关能力,来将他们的代码编译成 WebAssembly,然后在浏览器上运行。

WebAssembly 是一种二进制 web 格式,旨在以接近原生的性能运行不是用 JavaScript 语言编写的应用。目前,C、C++ 和 Rust 都可以通过基于 LLVM 的工具链来编译成 wasm 格式。这些语言编译成原生代码,然后可以在没有任何附加代码的情况下运行。当然,.NET 通常需要一个运行时平台来执行代码,因此在浏览器中使用它在理论上是可行的,只是需要一些额外的工作来让它更高效地运行。

其中一个非常可能实现.NET WebAssembly 的项目,是被 Steve Sanderson 称作Blazor的项目,虽然它还只是一个进行中的实验,远远没有生产价值。Blazor 在 Mono 运行时平台上,运行被编译成 wasdm 格式的.NET 代码。目前,这导致一个“Hello World”应用的负载比预期中要大,Sanderson 说:

自从迁移到 Mono 运行时平台,新的 Blazor 应用就变得很庞大(大约 4MB)。这是因为 Mono 上的 WASM 还没有进行任何无效代码剥离和压缩,并且打包了一个非常大的运行时库。这个运行时库包括许多桌面相关的功能,但这些功能是与 web 无关的。我期望,一个面向 web 优化过的生产应用,能够减小到接近 300KB 的大小。

这个项目的混合编译模型,已经在 2017 年 11 月 1 日合并到 Mono 项目。

另外一种可能适合.NET 的方法,类似于现有的原生代码编译方法,即静态编译组合成 wasm 的代码。这些代码包括 Mono C 运行时平台和开发者的.NET 代码。截至本文撰写时,一个使用这种方式的样本应用,会向用户计算机下载 10MB 代码。相比之下,加载一次最近的 Twitter.com 完整页面会下载超过 7MB 的内容,而访问一次最近的 Amazon.com 会下载 8.9MB 的内容。据Miguel de Icaza所说,这个大小应该会随着时间推移而减少:

一旦我们使用一种定制的概要文件,这个大小应该会明显减少。这种定制的概要文件基于移动端的概要配置文件,并且移除了许多不必要的功能。

这个项目采用“基于 LLVM 的实验性的 WebAssembly,LLVM 连接器和二进制化工具来生成最终的.wasm 代码”,但是在最近几个月还没有更新过。

在官方的CoreRT库中,也有 WebAssembly 支持原型。

查看英文原文:.NET WebAssembly Support an Ongoing Experiment


感谢冬雨对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

.NETJavaScript语言 & 开发