iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 4
2
Modern Web

謙虛,踏實的Web Assembly練習系列 第 4

[練習 03] 了解Web Assembly的語言要素

  • 分享至 

  • xImage
  •  

程式結構

每個Web Assembly程式,都是由一個module構成,module底下可以有幾種區塊

  1. import:輸入外部的函數、global 變數、以及memory(可以透過索引存取的線性記憶體,以外部來看就是幾種TypedArray)等
  2. export:輸出函數給外部使用
  3. start:定義在所有func被呼叫前,會先執行的程式
  4. global:定義global變數,可以在func中透過取用global的運算子來使用
  5. memory:定義一個線性的記憶體
  6. data:提供memory初始的資料
  7. table:用索引來存取的表格,目前可使用的元素類型只有anyfunc,就是未定義在type區段中的函數,通常是外部import進來的函數,必須使用call_indirect指令來呼叫,呼叫時不會檢查函數特徵
  8. elements:提供table初始的資料
  9. function and code:就是寫在Web Assembly中的函數以及當中的指令
  10. type:函數的特徵,包含參數、參數型別與返回值型別

同時,透過幾種索引空間來管理

  1. function:所有在Web Assembly程式中撰寫的func,實際上都會變成索引,透過索引來存取
  2. global:所有在Web Assembly程式中定義的global變數,也都會變成索引,透過索引來存取
  3. memory:所有memory,都會用索引來存取
  4. table:一樣意思啦

舉一個簡單例子,做兩個整數的平方和:

(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只提供四種型別:

  1. i32:32位元整數
  2. i64:64位元整數
  3. f32:32位元浮點數
  4. f64:64位元浮點數

複雜的操作,都是透過memory。memory可以在Web Assembly中先定義好,然後在Javascript透過API把一個TypedArray傳給他處理。

指令集

Web Assembly提供了幾種類別的指令集,分別有:

  • 程式邏輯及流程控制:block, if, loop, br(branch), return, end等等
  • 函數呼叫:call, call_indirect
  • 處理區域變數:get_local, set_local, tee_local
  • 處理global變數:get_global, set_global
  • 常數:i32.const, i64.const, f32.const, f64.const
  • 處理線性記憶體:i32.load, i32.store...
  • 整數、浮點數運算:i32.add, f32.mul...
  • 型別轉換:i64.extend_u/i32(將32位元無號整數擴展為64位元整數)...

東西很多,我就不詳細介紹,指令也是之後用到時在來看。文件可以參考:Semantics


明天先來看Javascript端用來載入Web Assembly的API,這樣才能初步開始使用。


上一篇
[練習 02] 編譯工具以及文字格式
下一篇
[練習 04] 使用Web Assembly的Javascript API
系列文
謙虛,踏實的Web Assembly練習20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
海綿寶寶
iT邦大神 1 級 ‧ 2017-12-25 17:24:51

Web Assembly只提供四種型別:
i32:32位元整數
i64:64位元整數
f32:32位元浮點數
f64:64位元浮點數

這點我喜歡
搞那麼多變數型態有什麼意思
/images/emoticon/emoticon03.gif

我要留言

立即登入留言