文章目录

  • 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运行相关推荐

  1. VC 运行时库 /MD、/MDd 和 /MT、/MTd

    这里总结下他们的区别,后面的那个'd'是代表DEBUG版本,没有'd'的就是RELEASE版本了. 首先说/MT /MT是 "multithread, static version &quo ...

  2. /MD, /MDD, /ML, /MT,/MTD(使用运行时库)

    1. VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd) 2. C 运行时库                              ...

  3. /MD, /MDD, /ML, /MT,/MTD(使用运行时库) .

    1. VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd) 2. C 运行时库                              ...

  4. VC C运行时库(CRTL)的几个版本及选用

    VC C运行时库(CRTL)的几个版本及选用Michael 2006年7月27日于突尼斯 VC++ C运行时库(以下简称CRTL)是指LIBC.LIB/LIBCMT.LIB/MSVCRT.LIB以及他 ...

  5. Ubuntu 20.04桌面版 安装antlr4的C++ runtime library(运行时库)

    之前写过安装antlr4,我希望能用它生成以C++为源码语言的语法分析器.这里并不是说生成的Parser是用在C++身上的,而是Parser本身的源码是C++. 这个操作还是很简单的,直接生成就行. ...

  6. VC运行时库(/MD、/MT等)

    VC项目属性→配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT).多线程调试(/MTd).多线程DLL(/MD).多线程调试DLL(/MDd).单线程(/ML).单线程调试( ...

  7. C运行时库和标准C++库

    先理解运行时库,就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数.VC提供的 C run-time libra ...

  8. 一文带你弄懂Visual Studio:运行时库及MT/MTD、MD/MDD

    一文带你弄懂Visual Studio:运行时库及MT/MTD.MD/MDD 引子 什么是Runtime Library? Runtime Library和运行库 MT MTD MD MDD的关系 静 ...

  9. GCC编译、链接、运行时库查找顺序(最真实可信)

    参考了不少资料,其中最靠谱是这个:http://www.mingw.org/wiki/librarypathhowto 和http://www.kaizou.org/2015/01/linux-lib ...

最新文章

  1. 移动端点击事件延迟300毫秒
  2. java中finally与return的测试方法
  3. 我的天!史上最烂的项目:苦撑12年,600多万行代码...
  4. 什么行业需要java_java开发可以从事什么行业
  5. Java IO - Reader
  6. HDU - 1796——容斥原理+二进制枚举
  7. 复权就是对股价和成交量进行权息修
  8. scrapy 分布式 mysql_Scrapy基于scrapy_redis实现分布式爬虫部署的示例
  9. ubuntu20.04自带python版本_替换 ubuntu 自带的python版本
  10. esxi 6.7 update 3 3b_污水站运维系统,3大要点让你吃透运维本质
  11. 详细讲解深层神经网络DNN
  12. 2019-05-22 SQL注入;啊D注入工具;
  13. 百度邓凯鹏:飞桨视觉技术解析与应用
  14. matlab多项式除法 分式展开,多项式除法有一种处理假分式的方法叫多项式除 – 手机爱问...
  15. kinect沙池游戏
  16. springboot基于微信小程序的在线办公系统+java+uinapp+Mysql
  17. HTML实现图片360度循环旋转
  18. 川土微|国产数字隔离器兼容ISO7762用于新能源汽车热管理系统
  19. ASP.NET企业HR人力资源管理系统源码(带使用手册和操作说明)
  20. 怎么在html显示已登录状态,登录成功后,返回时不再显示登录等已经没用的页面...

热门文章

  1. 不用写软件,纯JS 实现QQ空间自动点赞
  2. 图书管理系统 利用文件txt进行读写操作 文件操作
  3. 生命数字密码测试软件,生命数字密码
  4. Linux 系统 pptpd+radius+mysql 安装攻略
  5. 轻量级过程改进之绩效管理
  6. IE8下载的文件放在哪
  7. DVWA-Reflected XSS
  8. 什么是permit-inside功能
  9. ayo开发笔记2016-5-3
  10. r语言 怎么把字调大_R语言 如何为图片添加文字说明(转载)