WebAssembly核心編程[2]:類型系統

對於絕大多數編程語言來說,類型都是編程的基礎,WebAssembly自然也不例外。總的來說,WebAssembly涉及的類型不多,很好掌握,接下來我們就來介紹一下WebAssembly編程涉及到的幾種類型。本篇內容參考WebAssembly Spec

一、Value Type
二、Function
三、Memory
四、Table
五、Global
六、External

一、Value Type

值類型(Value Type)在WebAssembly中主要分爲三種,它們分別是數字(Number )、向量(Vector)和引用(Reference)。

image

1. Number

WebAssembly涉及數字只包含整數和浮點數,具體又有32位(4字節)和64位(8字節),所以WebAssembly支持的數字類型只包括i32、i64、f32、f64四種。

image

2. Vector

WebAssembly對單指令多數據(SIMD)提供了原生的支持,這進一步提升了它的性能。SIMD指令將一個128位的向量作爲操作數,我們可以將多個整數或者浮點數組合成一個向量。比如某個支持i32的指令,採用SIMD方式進行執行理論上可以獲得4倍的性能。

image

3. Reference

顧名思義,一個引用類型的變量代表一個指向某個目標對象的指針。目前WebAssembly設計的引用類型只有兩種,一種是引用來源於宿主應用的JavaScript對象。由於對於wasm模塊來說,這是一種外部引用,所以被定義成externref。另一種被命名位funcref的則是對自身Native函數的引用。

image

二、Function

函數本質上一組輸入參數與一組輸出結果的映射。雖然WebAssembly的函數目前還不支持返回多個結果,但是後續版本肯定會支持。輸入參數列表和輸出結果列表可以統一表示爲“結果類型(resulttype)”,具體來說就是一組值類型(數字、向量和引用)的有序組合,所以函數類型自然就表示成一個resulttype對象到另一個resulttype的映射。

image

image

三、Memory

Memory和Table都是一組連續的、限定長度的“區間”,所以WebAssembly專門定義了limits這樣一個類型來表示“長度限制”。一個limits必需使指定最小邊界(min),可缺省的最長邊界如果沒有指定,意味着可以無限“擴容”。

image

Memory以單純的二進制字節的形式來存儲一組數據。由於數據類型確定,我們只需要指定“長度限制”,所以Memory可以通過limits來表示。

image

四、Table

Memory和Table的不同指出在於它們存儲的元素類型,前者爲單純的二進制字節,後者則是指定類型的對象。具體來說,Table的元素爲“引用”,要麼是指向宿主應用提供的JavaScript對象(externref),要麼是自身定義的函數(funcref)。

image

五、Global

用來表示“全局變量”的Global存儲值類型(數字、向量和引用),mut(Mutable)用來表示對應的全局變量是否允許修改。

image

六、External

這裏External表示可以導出的,作爲宿主程序的“外部”對象。宿主應用可以從加載的wasm模塊導出的對象類型包括:函數、Table、Memory和Global。

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章