当 WebAssembly 遇上 Serverless

栏目: 后端 · 发布时间: 7年前

内容简介:Lucet是Fastly开源的WebAssembly编译器和运行时。WebAssembly旨在使Web浏览器能够以接近本机的速度安全地执行程序。自2017年初以来,WebAssembly已经得到4大浏览器支持。lucetc 是lucet的编译器。用于将WebAssembly模块(.wasmor .wat文件)编译为本地代码 (.oor .so文件)。

导读:WebAssembly 是一种新的适合于编译到Web的,可移植的,大小和加载时间高效的格式 ,边缘计算是方兴未艾的人们技术领域。本文介绍了如何使用 WebAssembly作为边缘计算容器,对于提高边缘计算效率,降低运行开销有很大意义,十分值得架构师一读。

Lucet是Fastly开源的WebAssembly编译器和运行时。WebAssembly旨在使Web浏览器能够以接近本机的速度安全地执行程序。自2017年初以来,WebAssembly已经得到4大浏览器支持。
Lucet旨在将WebAssembly置于浏览器之外,并构建一个平台,以便在Fastly的边缘云上实现更快,更安全的执行。 很多语言已经支持WebAssembly,包括Rust,TypeScript,C和C++ ,其他语言的支持也在开发中。Fastly 计划在其边缘云上提供基于Lucet的WebAssembly支持。
Lucet的一个主要设计要求是能够为Fastly每个请求启动单独的实例。 这意味着在单个进程中为每秒创建数万个WebAssembly实例,与使用浏览器JavaScript引擎相比,这需要大大降低运行时占用空间。 Lucet可以在50微秒内实例化WebAssembly模块,只需几KB的内存开销。 相比之下,Chromium的V8引擎需要大约5毫秒和几十MB的内存开销来实例化JavaScript或WebAssembly程序。
使用Lucet,Fastly的边缘云可以在同一进程中执行数万个WebAssembly程序,而不会影响安全性。 Lucet编译器和运行时协同工作以确保每个WebAssembly程序仅允许访问其自己的资源。 这意味着开发者可以使用通用语言编写程序,不会影响始安全性。
Lucet将执行WebAssembly的拆分为两个组件:编译器,它将WebAssembly模块编译为本机代码,运行时,管理资源和捕获运行时故障。 Lucet是为WebAssembly AOT编译而设计,与浏览器引擎中使用的JIT策略相比,它大大简化了运行时的设计和开销。
Lucet构建于Cranelift代码生成器之上。 Cranelift项目由Mozilla创建,是用于Firefox的WebAssembly和JavaScript JIT引擎。Lucet支持WebAssembly系统接口(WASI),这是一种新的标准,用于将低级接口(比如文件系统,网络和其他系统设施)安全地暴露给WebAssembly程序。 Lucet团队与Mozilla及其他人就该系统接口的设计,实现和标准化进行了合作。Lucet早期版本使用C实现,现在的版本使用Rust实现。

组件介绍

lucetc

lucetc 是lucet的编译器。用于将WebAssembly模块(.wasmor .wat文件)编译为本地代码 (.oor .so文件)。

lucet-runtime

lucet-runtime是lucetc编译后的WebAssembly模块的运行时。 它是一个Rust crate,它实现了从共享对象文件加载模块,实例化它们以及调用导出的WebAssembly函数的功能。 lucet-runtime提供管理WebAssembly实例使用的资源和检测非法操作并从中恢复的异常机制这两大功能。
大部分功能是在lucet-runtime-internals中定义的。 公共API在lucet-runtime中。 测试套件在lucet-runtime-tests中定义。 其中许多测试都会调用lucetc和wasi-sdk工具。
lucet-runtime可用作Rust crate或C库。 可以在lucet-runtime/include/lucet.h中找到 C语言 接口。

lucet-wasi

lucet-wasi为WebAssembly提供系统接口(WASI)运行时支持。 它可以用作库来支持另一个应用程序中的WASI,或者作为可执行文件lucet-wasi来执行通过lucetc编译的WASI程序。
关于其他组件,可以参考Lucet项目的官方文档。

Demo

首先,从GitHub克隆Lucet 代码仓库:

git clone --recurse-submodules https://github.com/fastly/lucet

README 包含有关使用 Docker 设置开发环境的说明。 如果您已安装Docker,则只需一步就能搞定。


 

$ cd lucet

$ source devenv_setenv.sh

现在,让我们创建一个C程序,并使用Clang将其编译为WebAssembly:


 

$ mkdir demo

$ cd demo

$ cat > hello.c <<EOT


 

#include <stdio.h>

int main(int argc, char* argv[])

{

if (argc > 1) {

printf("Hello from Lucet, %s!\n", argv[1]);

} else {

puts("Hello, world!");

}

return 0;

}

EOT

$ wasm32-unknown-wasi-clang hello.c -o hello.wasm

使用的Lucet编译器将WebAssembly编译为local代码:

$ lucetc-wasi hello.wasm -o hello.so

使用的Lucet运行时执行本机代码:


 

$ lucet-wasi hello.so Hello, world!

$ lucet-wasi hello.so world Hello from Lucet, world!

Lucet代码库中也提供了文档和其他示例。
开源Lucet,使得WebAssembly在Web浏览器和边缘云之外的有更多的场景。 Lucet对WASI的支持是向WebAssembly计划迈出的一大步,这些程序可以在用户想要的任何平台上运行 ,也许在云端,也许在边缘节点,浏览器或自己的笔记本电脑或智能手机上 - 同时保持同样强大保证安全性。 Lucet希望使WebAssembly能够在任何允许编写脚本或扩展的程序中茁壮成长,同时比基于动态语言,解释器和JIT编译器等的解决方案可以消耗更少的资源。

原文地址:https://www.fastly.com/blog/announcing-lucet-fastly-native-webassembly-compiler-runtime

https://github.com/fastly/lucet

参考阅读:

本文综合两篇英文文章编译, 由方圆翻译。转载本文请注明出处,欢迎更多小伙伴加入翻译及投稿文章的行列,详情请戳公众号菜单「联系我们」。

GIAC全球互联网架构大会深圳站将于2019年6月举行,届时有 WebAssembly和边缘计算相关 演讲。参加 2019年GIAC深圳站,可以了解业界动态,和业界专家近距离接触。

当 WebAssembly 遇上 Serverless

当 WebAssembly 遇上 Serverless

当 WebAssembly 遇上 Serverless

参加 GIAC,盘点2019年最新技术,目前 购买8折优惠  ,多人购买有更多优惠。识别二维码 了解大会更多详情。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Code

Code

Charles Petzold / Microsoft Press / 2000-10-21 / USD 29.99

Paperback Edition What do flashlights, the British invasion, black cats, and seesaws have to do with computers? In CODE, they show us the ingenious ways we manipulate language and invent new means of ......一起来看看 《Code》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试