每個Web Assembly程式,都是由一個module構成,module底下可以有幾種區塊
同時,透過幾種索引空間來管理
舉一個簡單例子,做兩個整數的平方和:
(module
(func $square (param $a i32) (result i32)
(i32.mul (get_local $a) (get_local $a))
)
(func (export "sqrtadd") (param $a i32) (param $b i32) (result i32)
(i32.add (call $square (get_local $a)) (call $square (get_local $b)))
)
)
Web Assembly是一個Stack Machine,有時候程式寫起來會混亂,不過似乎也可以用S-Express的方式使用前序式來寫,這樣邏輯比較清楚,雖然這是一個語法糖啦。
用wat-desugar處理一下,會變成:
(module
(func $square (param $a i32) (result i32)
get_local $a
get_local $a
i32.mul)
(func (;1;) (param $a i32) (param $b i32) (result i32)
get_local $a
call $square
get_local $b
call $square
i32.add)
(export "sqrtadd" (func 1))
(type (;0;) (func (param i32) (result i32)))
(type (;1;) (func (param i32 i32) (result i32))))
$square這個函數的索引就是0
,而輸出成sqrtadd的這個函數,索引是1
。
Web Assembly只提供四種型別:
複雜的操作,都是透過memory。memory可以在Web Assembly中先定義好,然後在Javascript透過API把一個TypedArray傳給他處理。
Web Assembly提供了幾種類別的指令集,分別有:
東西很多,我就不詳細介紹,指令也是之後用到時在來看。文件可以參考:Semantics
明天先來看Javascript端用來載入Web Assembly的API,這樣才能初步開始使用。
Web Assembly只提供四種型別:
i32:32位元整數
i64:64位元整數
f32:32位元浮點數
f64:64位元浮點數
這點我喜歡
搞那麼多變數型態有什麼意思