Rust wasm介绍

Deno介绍

Deno 是一个简单、现代、安全的 JavaScriptTypeScriptWebassembly 运行时环境。

Deno项目终于发布了1.0版本!Deno 是由 Node.js 的创始人 Ryan Dahl 创建的,旨在解决他所说的“我为Node.js感到遗憾的十件事”。

Deno 抛弃了 NPM 和臭名昭著的 node_modules。它是单个二进制可执行文件,可运行以 TypeScript 和 JavaScript 编写的应用程序。

建立在:

  • Rust(Deno 的底层是用 Rust 开发,而 Node 是用 C++)

  • Tokio(Deno 的事件机制是基于 Tokio,而 Node 是基于 libuv)

这个Deno入门项目模板。按照说明操作,只需 5 分钟你就能在 Deno 中运行第一个 WebAssembly 函数(由 Rust 编写)。

Node.js:JavaScript 的易用性(尤其是编写基于事件的异步应用程序时)以及 C/C++的高性能。Node.js 应用程序是用 JavaScript 编写的,但会在基于 C/C++的原生运行时上执行,这些运行时包括谷歌 V8 JavaScript 引擎和许多原生库模块。Deno 希望能复制这种成功路径,但在这个过程中它使用了 TypeScript 和 Rust 支持的现代技术栈。

  • Deno 是单个二进制可执行文件。

  • 应用程序是使用 TypeScript 或 JavaScript 编写的,在代码中将依赖项明确声明为 import 语句,并带有完整的 URL,链接到依赖项的源代码。

  • Deno 与 Node.js 模块不兼容。

在毫秒级别执行复杂神经网络模型运算的 AI 即服务应用程序?在 Deno 和 Node.js 中,许多函数都是通过 TypeScript 或 JavaScript API 调用,但以 Rust 或 C 语言编写的原生代码执行。

Deno 内部使用谷歌 V8 引擎。V8 不仅是一个 JavaScript 运行时,还是一个 WebAssembly 虚拟机。Deno 对 WebAssembly 提供了开箱即用的支持。Deno 为你的 TypeScript 应用程序提供了一个 API,以调用 WebAssembly 中的函数。

实际上,WebAssembly 中已经实现了一些流行的 Deno 组件。例如,Deno 中的sqlite module是使用 Emscripten 将 sqlite 的 C 源代码编译到 WebAssembly 中的成果。Deno WASI组件使 WebAssembly 应用程序可以访问操作系统的底层资源,例如文件系统。

配置

安装Deno

curl -fsSL https://deno.land/x/install/install.sh | sh

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

ssvmup工具可以自动执行构建过程并生成所有工件,以使你的 Deno 应用程序轻松调用 Rust 函数。

curl https://raw.githubusercontent.com/second-state/ssvmup/master/installer/init.sh -sSf | sh

安装后配置export环境

hello world源代码和应用程序模板

rustwasmc build --target deno --no-wasi

deno run --allow-read --allow-env --unstable deno/test.ts

deno run --allow-read --allow-net --allow-env --unstable deno/server.ts

curl http://localhost:8000/

Wasm demo - wasm-pack

cargo install wasm-pack

cargo new --lib mywasm

  • toml文件新增

[lib]

crate-type = ["cdylib"]

[dependencies]

wasm-bindgen = "0.2"

  • lib.rs文件新增

use wasm_bindgen::prelude::*;                                                                                                                      |  .Cargo.toml.swp      12                                                                                                                                                    |~
 13 #[wasm_bindgen]                                                                                                                                    |~
 14 extern {                                                                                                                                           |~                      15     pub fn alert(s:&str);                                                                                                                          |~
 16 }                                                                                                                                                  |~
 17                                                                                                                                                    |~
 18 #[wasm_bindgen]                                                                                                                                    |~
 19 pub fn greet(name:&str) {                                                                                                                          |~
 20     alert(&format!("Hello, {}!",name));                                                                                                            |~
 21 }

然后执行 wasm-pack build --target web

  • 在项目目录线新建index.html

  1 <!DOCTYPE html>                                                                                                                                    |</mywasm/
  2 <html>                                                                                                                                             |▸ .git/
  3   <head>                                                                                                                                           |▸ pkg/
  4     <meta charset="utf-8">                                                                                                                         |▾ src/
  5     <title>hello-wasm example</title>                                                                                                              |    lib.rs
  6   </head>                                                                                                                                          |▸ target/
  7   <body>                                                                                                                                           |  .gitignore
  8     <script type="module">                                                                                                                         |  Cargo.lock
  9       import init, {greet} from "./pkg/mywasm.js";                                                                                                 |  Cargo.toml
 10       init()                                                                                                                                       |  index.html           11         .then(() => {                                                                                                                              |  .Cargo.toml.swp      12           greet("WebAssembly")                                                                                                                     |~
 13         });                                                                                                                                        |~
 14       </script>                                                                                                                                    |~                      15   </body>                                                                                                                                          |~
 15   </body>                                                                                                                                          |~
 16 </html>

最后在项目目录下执行 python -m http.server

127.0.0.1:8000

参考

聊聊Deno的那些事

Last updated