

通用WebAssembly运行时--Wasmer 1.0 GA
source link: https://segmentfault.com/a/1190000038841308
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Wasmer是第一个能够在服务器端运行 Nginx 的WebAssembly(Wasm)运行时。
利用Wasm进行软件容器化,我们创建了通用二进制文件,无需修改即可在任何地方运行,包括Linux,macOS,Windows以及Web浏览器等操作系统。 Wasm默认情况下会自动沙盒化应用程序以安全执行,从而保护主机环境免受运行中软件中的恶意代码,错误和漏洞的侵害。 Wasm还提供了一个精益执行环境,使Wasmer容器可以在Docker容器过重而无法工作的地方运行。相信WebAssembly将是未来软件运行和容器化的关键组件。
经过两年多的开发,Wasmer 1.0 GA,包括如下 Future:
- 生产就绪性能
- 可插拔基础架构
- 原生对象引擎
- Headless Wasmer — 物联网的理想选择
- 交叉编译
- 超级易用且可扩展的API
- Wasm-C-API支持
- 错误处理和调试
接下来我们深度阐述一下各个Future!
性能基准测试
Wasmer 1.0性能基准测试需要独立发布。将Wasmer与其他Wasm运行时进行完整的分析,以便您比较并选择最适合您的项目的技术!
Wasmer 1.0的编译速度提高了9倍
现在,我们所有的编译器都可以并行编译函数。借助这一新策略,我们在所有编译器中的编译速度均提高了9倍。
通过实际示例比较,这些数字更容易理解。在这里,我们可以看到Wasmer 0.17.1与Wasmer 1.0中clang.wasm的编译时间:
- Singlepass: from 18s to 2s (9x speedup)
- Cranelift: from 27s to 9s (3x speedup)
- LLVM: from 1140s to 117s (9x speedup)
可插拔基础架构
可扩展性是任何基础架构产品中最关键的功能之一。我们最重要的功能之一就是支持多个编译器。 Wasmer 1.0附带了以下方面的支持:
- Singlepass: 适用于不受JIT bombs 影响的超快速编译时间(区块链)
- Cranelift: 在需要最少优化的情况下实现快速编译(理想的开发方式)
- LLVM: 当必须具有最佳性能时(理想的生产方式),生成最佳的机器代码
除了编译器,我们还引入了对可插入引擎的支持。 WebAssembly引擎是一种抽象,它决定编译器如何管理所生成的汇编代码,包括如何对其进行加载和序列化。 Wasmer 1.0支持以下编译器引擎:
- JIT engine: 它将生成的代码直接推送到内存中
- Native engine: 它生成可以作为共享对象加载的原生代码。另外,原生引擎共享的对象和模块在短短几微秒内的执行和启动性能令人难以置信!
原生对下引擎
Wasmer 1.0引入了“ wasmer compile”,这是一个用于预编译Wasm文件的新命令。我们的客户和开发人员使用“ wasmer compile --native”将WebAssembly模块预编译为原生对象文件,例如.so
,.dylib
和.dll
。预编译的对象和模块与Wasmer CLI兼容,或与Wasmer嵌入(Rust,Python,Go等)一起使用。
预编译原生对象的核心优势在于,它们只需要最少的运行时间即可运行已编译模块,同时仍提供完整的沙盒环境。消除了编译时间,可以在极快的启动时间直接执行工件。
首先运行:
wasmer compile --native python.wasm -o python.so
对于独立执行,请运行:
wasmer run python.so
或运行嵌入式程序(Rust示例……支持许多其他示例):
let module = Module::deserialize_from_file(“python.so”);
let instance = Instance::new(module, &wasi_imports);
Headless Wasmer
边缘运行的物联网设备正在推动计算的未来,这已不是什么秘密。但是,许多设备缺少最佳的计算硬件或其他资源,例如电源,网络和存储。过去,用户在Wasm应用程序中附带了Wasmer和所有编译器。这种做法不是最理想的,尤其是对于物联网和边缘计算用例。
在Wasmer 1.0中,我们看到Wasm和Wasmer在提供尽可能轻量级的执行环境方面处于领先地位,这对于在边缘的IoT设备上高效运行Wasm至关重要。借助我们对AOT编译的新增支持,您可以运行“headless”版本的Wasmer,其重量仅为数百KB,并且可以在任何设备上运行任何预编译的Wasm二进制文件。
Wasmer 1.0现在具有交叉编译功能。在以前的Wasmer版本中,以原生编译的Wasm应用程序为目标并在同一体系结构上运行。使用Wasmer 1.0,您可以从x86_64
机器为aarch64
体系结构预编译Wasm,反之亦然。
在任何x86_64
机器上运行:
wasmer compile python.wasm -o python-arm.so --native --target=aarch64-linux-gnu
然后在您的ARM机器上本地运行编译结果:
wasmer run python-arm.so
非常易于使用的API
Wasmer 1.0的主要目标是使对高级WebAssembly概念或WebAssembly生态系统知识有限的开发人员可以轻松使用API。 Wasmer 1.0进一步改进了我们的API,通过根据标准Wasm-C-API所具有的相似结构对其进行调整,使其具有未来的弹性。
use wasmer::{Store, Module, Instance, Value, imports};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let module_wat = r#"
(module
(type $t0 (func (param i32) (result i32)))
(func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32)
get_local $p0
i32.const 1
i32.add))
"#;
let store = Store::default();
let module = Module::new(&store, &module_wat);
let import_object = imports! {};
let instance = Instance::new(module, &import_object)?;
let add_one = instance.exports.get_function("add_one")?;
let result = add_one.call([Value::I32(42)])?;
assert_eq!(result[0], Value::I32(43));
Ok(())
}
Wasm-C-API
随着WebAssembly生态系统的成熟,业界将正确地推动和统一与WebAssembly交互的API。Wasm-C-API比较新,因此我们决定构建一个与内部结构紧密匹配的API。
但是,随着行业朝着通用API迈进,我们决定将其作为Wasmer 1.0的一部分并做出贡献,以便每个人都能从中受益。
注意:我们将继续支持Wasmer-C-API。但是,我们建议当前用户切换到标准Wasm-C-API。
错误处理和调试
Wasmer 1.0完全重新定义并提供了新的改进的错误处理功能,使开发人员可以放心地与Wasmer集成。大大缩短了构建可投入生产的Wasm应用程序所需的时间。例如,每次发生错误时,都要准确知道错误的来源:它是虚拟机的吗?是因为没有足够的可用资源吗?还是仅仅是某些原生功能触发的预期错误? Wasmer 1.0为将来进行更高级的错误检测和报告奠定了基础。
支持 Apple Silicon
就在几周前,苹果公司推出了其新系列的计算机,该计算机系列具有基于ARM的全新芯片组:Apple Silicon。
服务器端工作负载中的ARM有着光明的未来,它巩固了跨芯片组通用二进制文件的需求。我们非常高兴地宣布Wasmer是第一个在Apple Silicon中支持Wasm的服务。
如果您想尝试Wasmer,则可以从wasmer.io安装CLI,以独立运行Wasmer或将Wasmer嵌入您喜欢的编程语言中。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK