Web Assembly (2)

前回とは違って、コンソールでビルドしてみました。WebAssembly System Interface のTurtorial を使います。

https://github.com/bytecodealliance/wasmtime/blob/main/docs/WASI-tutorial.md

とても重要なコードなので、CとRustそれぞれ引用させていただきました。

demo.c

main.rs

Cのビルド

https://github.com/WebAssembly/wasi-sdk/releases/tag/wasi-sdk-14

よりSDKをダウンロードしてビルド

wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-14/wasi-sdk-14.0-linux.tar.gz
tar zxvf wasi-sdk-14.0-linux.tar.gz
./wasi-sdk-14.0/bin/clang –sysroot=./wasi-sdk-14.0/share/wasi-sysroot demo.c -o demo.wasm
file demo.wasm
demo.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)

cppの場合は、clang++ を使用

Rustのビルド

rustup target add wasm32-wasi
cargo build –target wasm32-wasi

target/wasm32-wasi/debug にdemo.wasmが出力される

wasmtimeインストール(sourceコマンドでパス有効化)

curl http://wasmtime.dev/install.sh -sSf | bash

実行結果

$ echo hello > hello.txt
$ wasmtime demo.wasm
usage: demo.wasm [from] [to]
$ wasmtime –dir=. –dir=. demo.wasm hello.txt out.txt
$ cat out.txt
hello

wasmtimeはWASIのランタイムで、wasmファイルを直接実行できます。一見普通のコードとWasmは区別がつかないくらいです。
Cの場合、環境がきちんと通っていないと間違えて通常のバイナリを作ってしまいます。
wasmは一つのバイナリをいろいろなところで使うことができます。下記動画が参考になります。
(しかし古いせいか作ったモジュールが不正となってしまい動作確認がとれませんでした)

“WebAssembly Interface Types: Interoperate with All The Things!”

About

Categories: 未分類 タグ: