WebAssembly - 文本格式:初學者指南

你好,未來的編程超新星!今天,我們將踏上一段令人興奮的旅程,探索 WebAssembly 的文本格式,親切地稱為 WAT。別擔心如果你從未編過程——我們將從最基本的開始,一起逐步學習。在這個教學結束時,你將會像專家一樣 WAT!?

WebAssembly - Text Format

什麼是 WebAssembly 文本格式(WAT)?

在我們深入細節之前,讓我們先了解 WAT 實際上是什麼。WebAssembly 文本格式是 WebAssembly 二進制代碼的人類可讀表示。它就像是較為令人生畏的二進制格式的親切友善的表親。WAT 讓我們能夠以文本格式編寫和閱讀 WebAssembly 代碼,使我們這樣的人類更容易理解和使用。

為什麼要學習 WAT?

你可能會想,「我為什麼要麻煩學習 WAT?」我的好奇朋友,WAT 是一種非常好的方式,可以讓你理解 WebAssembly 在底層是如何工作的。這就像在演奏樂器之前學習讀樂譜——它讓你對這門工藝有更深的賞識和理解。

WAT 代碼基礎

讓我們從 WAT 代碼的基本開始。別擔心;我們會一步步來,在你還未意識到之前,你將會編寫自己的 WAT 代碼!

模块結構

每個 WAT 程式都以一個模塊開始。將模塊看作是所有代碼的容器。這是它的樣子:

(module
;; 你的代碼放在這裡
)

這就像說,「喂,計算機!我即將給你一些指示,所以請專注!」

函數

函數是我們 WAT 代碼的建築塊。它們就像執行特定任務的小型機器。讓我們創建一個簡單的函數來將兩個數字相加:

(module
(func $add (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add
)
)

讓我們分解這個:

  1. (func $add ...: 這個聲明了一個名為 "add" 的函數。
  2. (param $a i32) (param $b i32): 這是我們的輸入參數。我們說我們期望兩個 32 位整數。
  3. (result i32): 這指定我們的函數將返回一個 32 位整數。
  4. local.get $alocal.get $b: 這些行檢索我們的輸入參數。
  5. i32.add: 這個執行加法操作。

匯出函數

現在,我們創建了一個函數,但它就像一個藏匿的寶藏——模塊外的人無法使用它!讓我們通過匯出我們的函數來修復這個問題:

(module
(func $add (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add
)
(export "add" (func $add))
)

(export "add" (func $add)) 行使我們的 add 函數可供外界使用。這就像在我們的小型加法機器上掛上「開放」的標誌!

更複雜的操作

現在我們已經掌握了基礎,讓我們嘗試一些更具挑戰性的東西。我們來創建一個計算數字階乘的函數如何?

(module
(func $factorial (param $n i32) (result i32)
(local $result i32)
(local $i i32)

i32.const 1
local.set $result

i32.const 1
local.set $i

(loop $continue
local.get $i
local.get $n
i32.gt_u
if
local.get $result
return
end

local.get $result
local.get $i
i32.mul
local.set $result

local.get $i
i32.const 1
i32.add
local.set $i

br $continue
)

local.get $result
)
(export "factorial" (func $factorial))
)

哇,這真是個大工程!讓我們分解它:

  1. 我們聲明我們的函數,有一個參數 $n 和兩個局部變量 $result$i
  2. 我們將 $result 初始化為 1,將 $i 初始化為 1。
  3. 我們開始一個循環,直到 $i 大於 $n
  4. 在每次迭代中,我們將 $result 乘以 $i 並增加 $i
  5. 當循環結束時,我們返回 $result

這個函數計算輸入數字的階乘。例如,如果我們輸入 5,它將計算 5 4 3 2 1 = 120。

WAT 方法表

這裡是我們使用過的一些常見 WAT 方法以及一些更多方法的表格:

方法 描述
i32.add 將兩個 32 位整數相加
i32.sub 將兩個 32 位整數相減
i32.mul 將兩個 32 位整數相乘
i32.div_s 將兩個 32 位整數(有符號)相除
i32.const 聲明一個常量 32 位整數
local.get 檢索一個局部變量
local.set 設置一個局部變量
i32.gt_u 無符號大於比較
if 開始一個 if 語句
loop 開始一個循環
br 跳轉(分支)到特定點

結論

就是这样,我的編程學徒!你剛剛踏入了 WebAssembly 文本格式的世界。我們已經介紹了模塊、函數、匯出,甚至還處理了一個較複雜的階乘函數。記住,學習編程就像學習一門新語言——它需要練習和耐心。但是,每當你寫下一段 WAT 代碼時,你都在接近成為 WebAssembly 巫師!

繼續實驗,繼續學習,最重要的是,繼續在 WAT 中找到樂趣。在你意識到之前,你將會編寫複雜的算法,並用你的 WebAssembly 技能給朋友留下深刻印象。快樂編程!

Credits: Image by storyset