對於絕大多數編程語言來說,類型都是編程的基礎,WebAssembly自然也不例外。總的來說,WebAssembly涉及的類型不多,很好掌握,接下來我們就來介紹一下WebAssembly編程涉及到的幾種類型。本篇內容參考WebAssembly Spec。
一、Value Type
二、Function
三、Memory
四、Table
五、Global
六、External
一、Value Type
值類型(Value Type)在WebAssembly中主要分爲三種,它們分別是數字(Number )、向量(Vector)和引用(Reference)。
1. Number
WebAssembly涉及數字只包含整數和浮點數,具體又有32位(4字節)和64位(8字節),所以WebAssembly支持的數字類型只包括i32、i64、f32、f64四種。
2. Vector
WebAssembly對單指令多數據(SIMD)提供了原生的支持,這進一步提升了它的性能。SIMD指令將一個128位的向量作爲操作數,我們可以將多個整數或者浮點數組合成一個向量。比如某個支持i32的指令,採用SIMD方式進行執行理論上可以獲得4倍的性能。
3. Reference
顧名思義,一個引用類型的變量代表一個指向某個目標對象的指針。目前WebAssembly設計的引用類型只有兩種,一種是引用來源於宿主應用的JavaScript對象。由於對於wasm模塊來說,這是一種外部引用,所以被定義成externref。另一種被命名位funcref的則是對自身Native函數的引用。
二、Function
函數本質上一組輸入參數與一組輸出結果的映射。雖然WebAssembly的函數目前還不支持返回多個結果,但是後續版本肯定會支持。輸入參數列表和輸出結果列表可以統一表示爲“結果類型(resulttype)”,具體來說就是一組值類型(數字、向量和引用)的有序組合,所以函數類型自然就表示成一個resulttype對象到另一個resulttype的映射。
三、Memory
Memory和Table都是一組連續的、限定長度的“區間”,所以WebAssembly專門定義了limits這樣一個類型來表示“長度限制”。一個limits必需使指定最小邊界(min),可缺省的最長邊界如果沒有指定,意味着可以無限“擴容”。
Memory以單純的二進制字節的形式來存儲一組數據。由於數據類型確定,我們只需要指定“長度限制”,所以Memory可以通過limits來表示。
四、Table
Memory和Table的不同指出在於它們存儲的元素類型,前者爲單純的二進制字節,後者則是指定類型的對象。具體來說,Table的元素爲“引用”,要麼是指向宿主應用提供的JavaScript對象(externref),要麼是自身定義的函數(funcref)。
五、Global
用來表示“全局變量”的Global存儲值類型(數字、向量和引用),mut(Mutable)用來表示對應的全局變量是否允許修改。
六、External
這裏External表示可以導出的,作爲宿主程序的“外部”對象。宿主應用可以從加載的wasm模塊導出的對象類型包括:函數、Table、Memory和Global。