Rust Hello World

$ rustup update
$ cargo init
$ cargo install cargo-wasi
$ cargo wasi build
$ wasmtime ./target/wasm32-wasi/debug/wasi-demo.wasi.wasm
  • https://bytecodealliance.github.io/cargo-wasi/install.html

WAT Hello World

(module
    ;; Import the required fd_write WASI function which will write the given io vectors to stdout
    ;; The function signature for fd_write is:
    ;; (File Descriptor, *iovs, iovs_len, *nwritten) -> Returns 0 on success, nonzero on error
    (import "wasi_snapshot_preview1" "fd_write" (func $fd_write (param i32 i32 i32 i32) (result i32)))

    (memory 1)
    (export "memory" (memory 0))

    ;; Write 'hello world\n' to memory at an offset of 8 bytes
    ;; Note the trailing newline which is required for the text to appear
    (data (i32.const 8) "hello world\n")

    (func $main (export "_start")
        ;; Creating a new io vector within linear memory
        (i32.store (i32.const 0) (i32.const 8))  ;; iov.iov_base - This is a pointer to the start of the 'hello world\n' string
        (i32.store (i32.const 4) (i32.const 12))  ;; iov.iov_len - The length of the 'hello world\n' string

        (call $fd_write
            (i32.const 1) ;; file_descriptor - 1 for stdout
            (i32.const 0) ;; *iovs - The pointer to the iov array, which is stored at memory location 0
            (i32.const 1) ;; iovs_len - We're printing 1 string stored in an iov - so one.
            (i32.const 20) ;; nwritten - A place in memory to store the number of bytes written
        )
        drop ;; Discard the number of bytes written from the top of the stack
    )
)
$ wasmtime demo.wat

# or this
$ wat2wasm demo.wat
$ wasmtime demo.wasm
  • https://github.com/bytecodealliance/wasmtime/blob/main/docs/WASI-tutorial.md

target

https://doc.rust-lang.org/rustc/platform-support/wasm32-wasip2.html

$ rustup target add wasm32-wasip2
$ rustc ./src/main.rs --target wasm32-wasip2

Interface

References