WebAssemblyのEmbedderからのインターフェース一覧

f:id:ironoir:20210227164137p:plain

WebAssemblyは単体で完結するよりは、ホスト環境に埋め込まれて使う用途が想定されているようです(ただし、最近はそれだけでもない)。例えば、JavaScriptが典型的なホスト環境だと言えます。specには、それらのEmbedderとWebAssemblyのインターフェースが規定されていて、整理のために以下、概略とともに一覧をRustコードで示します。詳細、気になる点もありますが別途。

なお、これらを実装していることがEmbedderの必須条件ではない、と書かれている点は注意です。

mod store;
pub use store::store_init;  // storeを初期化する

mod module;
pub use module::{
    module_decode,  // バイト列を読み込んでmoduleを返す
    module_parse,  // utf-8文字列を読み込んでmoduleを返す
    module_validate,  // moduleを検査する
    module_instanciate,  // moduleを初期化してinstanceを生成する(要素をstoreに入れる)
    module_imports,  // 指定したmoduleのimport情報を全て返す
    module_exports,  // 指定したmoduleのexport情報を全て返す
};

mod instance;
pub use instance::instance_export;  // 特定のinstanceから指定したexport要素の値を返す

mod func;
pub use func::{
    func_alloc,  // 指定したhostfuncをstoreに割り当てる
    func_type,  // 指定したfuncaddrの型を返す
    func_invoke,  // 指定したfuncaddrにひもづく関数を指定した引数で呼び出し、結果を返す
};

mod table;
pub use table::{
    table_alloc,  // 指定したtabletypeからtableを生成し、storeに割り当てる
    table_type,  // 指定したtableaddrのtabletypeを返す
    table_read,  // table内の指定した場所にあるfuncaddrを返す
    table_write,  // table内の指定した場所にfuncaddrを書き込む
    table_size,  // tableの長さを返す
    table_grow,  // 指定した長さだけtableを伸ばす
};

mod mem;
pub use mem::{ 
    mem_alloc,  // 指定したmemtypeからmemを生成し、storeに割り当てる
    mem_type,  // 指定したmemaddrのmemtypeを返す
    mem_read,  // mem内の指定した場所にあるbyteを返す
    mem_write,  // mem内の指定した場所にbyteを書き込む
    mem_size,  // memの長さを返す
    mem_grow,  // 指定した長さだけmemを伸ばす
};

mod global;
pub use global::{
    global_alloc,  // 指定したglobaltypeからglobalを生成し、storeに割り当てる
    global_type,  // 指定したglobaladdrのglobaltypeを返す
    global_read,  // global内の指定した場所にある値を返す
    global_write,  // global内の指定した場所に値を書き込む
};

PlantUMLコード

@startuml rectangle hostenv { rectangle embedder interface funcs as funcs rectangle wasm { } wasm -up-( funcs embedder -down- funcs } @endum