WebAssembly运行时库(WASM runtime:wasmer 或 wasmtime)\将rust官方demo猜数字编译为WASI目标并使用Wasmer运行
文章目录
- WebAssembly运行时库(wasmer 或 wasmtime、wasmer-go)
- 一、引子
- 1. 什么是WASI
- 2. 有哪些优秀的 WebAssembly 运行时?
- 二、wasmer
- 1. 什么是wasmer
- 2. wasmer特性
- 3. 对比wasmtime
- 4. Wasmer 快速开始
- 安装遇到问题
- /root/.wasmer/bin/wasmer: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
- 5. wasmer命令使用
- 在你的Rust应用程序中使用Wasmer
- 三、将rust官方demo猜数字编译为WASI目标并使用Wasmer运行
- 1. 设置一个新项目
- 1) 获取用户猜测并打印
- 2) 生成一个随机数字
- Cargo.lock 文件
- 更新 crate 到一个新版本
- 3) 生成一个随机数
- 4) 比较数字
- 5) 使用循环来实现多次猜测
- 6) 猜测正确后退出
- 7) 处理无效输入
- 2. 最终完整代码
- 3. 是时候编译成WASI目标了
- 四、wasmtime
- 参考
WebAssembly运行时库(wasmer 或 wasmtime、wasmer-go)
一、引子
陈天 · Rust 编程第一课
https://time.geekbang.org/column/article/468066
插件(微内核)结构
插件(微内核)结构插件结构(Plugin Architecture)也被称为微内核结构(Microkernel Architecture),它可以让你的系统拥有一个足够小的核心,然后围绕着这个核心以插件的方式注入新的功能。我们平时使用的 VS Code 就是典型的插件结构。它的核心功能就是文本的编辑,但通过各种插件,它可以支持代码的语法高亮、错误检查、格式化等等功能。在构建插件结构时,我们需要设计一套足够稳定的接口,保证插件和核心之间的交互;还需要设计一套注册机制,让插件可以被注册进系统,或者从系统中删除。在 Rust 下,除了正常使用 trait 和 trait object 来构建插件机制,在系统内部使用插件结构外,还可以通过 WebAssembly(通过 wasmer 或 wasmtime) 或者 rhai 这样的嵌入式脚本来允许第三方通过插件来扩展系统的能力:
通过 WebAssembly(通过 wasmer 或 wasmtime) 或者 rhai 这样的嵌入式脚本来允许第三方通过插件来扩展系统的能力!
WebAssembly 简称 Wasm,承诺带来闪电般的启动速度以及极低的占用空间,这也使其成为无服务器架构与物联网边缘设备的理想选择。
1. 什么是WASI
WebAssembly 的 “Web” 表明了 Wasm 的出身,也就是说它发明并最早应用于 Web 浏览器中, “Assembly” 则表明了 Wasm 的本质,这个词翻译过来的意思是 “汇编”,也就是指代它的 V-ISA 属性。
鉴于 Wasm 所拥有“可移植”、“安全”及“高效”等特性,Wasm 也被逐渐应用在 Web 领域之外的一些其他场景中。今天我们将要讲解的,便是可以用于将 Wasm 应用到 out-of-web 环境中的一项新的标准 —— WASI(WebAssembly System Interface,Wasm 操作系统接口)。通过这项标准,Wasm 将可以直接与操作系统打交道。
WASM(Web Assembly)尽管是为了提高网页中性能敏感模块表现而提出的字节码标准, 但是WASM却不仅能用在浏览器(broswer)中, 也可以用在其他环境中. 在这些环境中, 我们则需要支持WASI(WebAssembly System Interface, WASM系统接口)的runtime来执行我们编译运行的wasm模块.
WASI是一个新的API体系, 由Wasmtime项目设计, 目的是为WASM设计一套引擎无关(engine-indepent),
面向非Web系统(non-Web system-oriented)的API标准. 目前, WASI核心API(WASI Core)在做覆盖文件,
网络等等模块的API,
wasmer 与 Wasmtime.这两款运行时都号称支持了WASI标准。
2. 有哪些优秀的 WebAssembly 运行时?
有哪些优秀的 WebAssembly 编译器与运行时?
参考URL: https://time.geekbang.org/column/article/292041
目前业界有哪些优秀的 Wasm 运行时。这些运行时都是 Wasm 可以在 out-of-web 领域大显身手的最基本保障。它们其中有些支持 WASI 抽象系统接口,有些支持 Wasm Post-MVP 标准中的部分提案,还有一些可以被专门用在诸如嵌入式、IOT 物联网以及甚至云,AI 和区块链等特殊的领域和场景中。
Wasm 虽然“出身”于 Web,但实际上却也可以 out-of-web,根据上节引子,我们接下来关注研究 wasmer 与 Wasmtime。
二、wasmer
1. 什么是wasmer
官网:https://wasmer.io/
github官网:https://github.com/wasmerio/wasmer
阅读有关Wasmer的更多信息
https://medium.com/wasmer/
Run any code on any client.With WebAssembly and Wasmer.
在任何客户端上运行任何代码。用webassembly和waser。
Wasmer 是支持 WASI 和 Emscripten 的 WebAssembly 运行时,提供基于 WebAssembly 的超轻量级容器,其可以在任何地方运行:从桌面端到云端、以及 IoT 设备,并且能嵌入在任何编程语言中。
Wasmer可以是说在WASI生态中响应速度仅次于Mozilla的组织,他们号称打造了
一款可以让代码“一次构建,处处运行”(Build Once, Run Anywhere.)的运行时环境,该环境可以运行ECMAScripten标准与WASI标准的wasm栈机码。并且方便为wasm代码分发,该组织开发了类似于nodejs生态中npm的包管理工具wapm,这样用户就可以很轻松地发布自己的程序,以及利用他人的程序了–这促进了WASM生态的发展,同时作为生态底层的领导者,Wasmer也将拥有更多发言权。
官方表示,不只在浏览器中,WebAssembly(Wasm)会是未来软件执行和容器化的关键组件。透过Wasm进行软件容器化,可以让二进制文件在不需要修改的前提下,於Linux、macOS、Windows以及网页浏览器等环境执行,并保护主机不受恶意程序码、错误和臭虫影响。Wasmer容器的特点之一,便是在Docker容器因过於笨重无法运作之处,执行容器化工作负载。
通过设计,WebAssembly模块运行所在的环境与基础主机系统的本机功能完全隔离(或沙盒化)。这意味着默认情况下,Wasm模块被设计为仅执行纯计算。
因此,通常无法从WASM访问“ OS”级资源,例如文件描述符,网络套接字,系统时钟和随机数。但是,在许多情况下,Wasm模块需要执行的工作不仅仅是执行纯计算。它们必须与本机“ OS”功能交互。
Wasmer旨在提供三个关键功能:
- 使程序能够以任何编程语言运行
- 可移植的二进制文件能够在Wasmer支持的任何“ OS”(例如Linux,macOS,Windows和FreeBSD)上运行,且无需修改。
- 充当Wasm模块通过诸如WASI和Emscripten之类的ABI与本机“ OS”功能交互的安全桥。
Wasmer 是用 Rust 写的。
2. wasmer特性
- 快速又安全. Wasmer在完全沙盒化的环境中以“接近本机”的速度运行 WebAssembly。
- 可插拔. Wasmer 可以根据你的需求支持不同的编译框架 (LLVM,Cranelift …).
- 通用的. 你可以在任何平台(macOS, Linux and Windows) 和芯片组运行 Wasmer.
- 符合标准. 运行时通过了官方WebAssembly测试集、支持WASI 和 Emscripten.
3. 对比wasmtime
有哪些优秀的 WebAssembly 编译器与运行时
参考URL: https://time.geekbang.org/column/article/292041
对比wasmtime,其生态更加完善。提供了 wapm 和 WebAssembly.sh。 **Wasmer 在 WebAssembly 服务器运行时领域居于领先地位,其主要优势体现在接近原生水平的执行速度。**事实上,单凭速度这一点, Wasmer 就足以技压群雄。
- wapm 是WebAssembly包管理器。
- WebAssembly shell程序是一个在线shell程序,您可以在其中拖放WebAssembly模块以进行尝试,还可以执行WAPM中可用的WASI模块的所有命令。
4. Wasmer 快速开始
Wasmer 不需要安装其他依赖. 你可以使用以下安装程序进行安装:
# curl https://get.wasmer.io -sSfL | sh
执行WebAssembly文件
安装Wasmer之后,你已经准备好执行第一个WebAssemby文件了!
注意:亲测,安装脚本有连接的一些网址,需要翻墙!
安装完成后,会默认安装到 /root/.wasmer 目录下
安装完成,通过执行wasmer命令检查一下:
wapm是webassembly包管理器
wapm is the WebAssembly Package Manager
安装wasmer会自动帮助我们安装wapm,我们执行 wapm
命令:
安装遇到问题
/root/.wasmer/bin/wasmer: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
安装 libncurses5 就可解决
sudo apt-get install libncurses5
5. wasmer命令使用
root@aaa2:~# wasmer --help
wasmer 2.1.0
Wasmer Engineering Team <engineering@wasmer.io>
WebAssembly standalone runtime.USAGE:wasmer <SUBCOMMAND>FLAGS:-h, --helpPrints help information-V, --versionPrints version informationSUBCOMMANDS:binfmt Unregister and/or register wasmer as binfmt interpretercache Wasmer cachecompile Compile a WebAssembly binaryconfig Get various configuration information needed to compile programs which use Wasmercreate-exe Compile a WebAssembly binary into a native executablehelp Prints this message or the help of the given subcommand(s)inspect Inspect a WebAssembly filerun Run a WebAssembly file. Formats accepted: wasm, watself-update Update wasmer to the latest versionvalidate Validate a WebAssembly binarywast Run spec testsuite
root@aaa2:~#
在你的Rust应用程序中使用Wasmer
如何使用 wasmer 和 rust 构建插件系统
参考URL: https://www.cnblogs.com/ishenghuo/p/12105636.html
https://docs.wasmer.io/integrations/rust
Wasmer是一个可以嵌入到Rust应用中的wasm解释器
三、将rust官方demo猜数字编译为WASI目标并使用Wasmer运行
[推荐阅读官方原版]猜数字官方demo:
https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html
Rust实例学习(猜数字游戏)
参考URL: https://blog.csdn.net/Alexhcf/article/details/107770784
WebAssembly运行时库(WASM runtime:wasmer 或 wasmtime)\将rust官方demo猜数字编译为WASI目标并使用Wasmer运行相关推荐
- VC 运行时库 /MD、/MDd 和 /MT、/MTd
这里总结下他们的区别,后面的那个'd'是代表DEBUG版本,没有'd'的就是RELEASE版本了. 首先说/MT /MT是 "multithread, static version &quo ...
- /MD, /MDD, /ML, /MT,/MTD(使用运行时库)
1. VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd) 2. C 运行时库 ...
- /MD, /MDD, /ML, /MT,/MTD(使用运行时库) .
1. VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd) 2. C 运行时库 ...
- VC C运行时库(CRTL)的几个版本及选用
VC C运行时库(CRTL)的几个版本及选用Michael 2006年7月27日于突尼斯 VC++ C运行时库(以下简称CRTL)是指LIBC.LIB/LIBCMT.LIB/MSVCRT.LIB以及他 ...
- Ubuntu 20.04桌面版 安装antlr4的C++ runtime library(运行时库)
之前写过安装antlr4,我希望能用它生成以C++为源码语言的语法分析器.这里并不是说生成的Parser是用在C++身上的,而是Parser本身的源码是C++. 这个操作还是很简单的,直接生成就行. ...
- VC运行时库(/MD、/MT等)
VC项目属性→配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT).多线程调试(/MTd).多线程DLL(/MD).多线程调试DLL(/MDd).单线程(/ML).单线程调试( ...
- C运行时库和标准C++库
先理解运行时库,就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数.VC提供的 C run-time libra ...
- 一文带你弄懂Visual Studio:运行时库及MT/MTD、MD/MDD
一文带你弄懂Visual Studio:运行时库及MT/MTD.MD/MDD 引子 什么是Runtime Library? Runtime Library和运行库 MT MTD MD MDD的关系 静 ...
- GCC编译、链接、运行时库查找顺序(最真实可信)
参考了不少资料,其中最靠谱是这个:http://www.mingw.org/wiki/librarypathhowto 和http://www.kaizou.org/2015/01/linux-lib ...
最新文章
- 移动端点击事件延迟300毫秒
- java中finally与return的测试方法
- 我的天!史上最烂的项目:苦撑12年,600多万行代码...
- 什么行业需要java_java开发可以从事什么行业
- Java IO - Reader
- HDU - 1796——容斥原理+二进制枚举
- 复权就是对股价和成交量进行权息修
- scrapy 分布式 mysql_Scrapy基于scrapy_redis实现分布式爬虫部署的示例
- ubuntu20.04自带python版本_替换 ubuntu 自带的python版本
- esxi 6.7 update 3 3b_污水站运维系统,3大要点让你吃透运维本质
- 详细讲解深层神经网络DNN
- 2019-05-22 SQL注入;啊D注入工具;
- 百度邓凯鹏:飞桨视觉技术解析与应用
- matlab多项式除法 分式展开,多项式除法有一种处理假分式的方法叫多项式除 – 手机爱问...
- kinect沙池游戏
- springboot基于微信小程序的在线办公系统+java+uinapp+Mysql
- HTML实现图片360度循环旋转
- 川土微|国产数字隔离器兼容ISO7762用于新能源汽车热管理系统
- ASP.NET企业HR人力资源管理系统源码(带使用手册和操作说明)
- 怎么在html显示已登录状态,登录成功后,返回时不再显示登录等已经没用的页面...