將 WebAssembly 文字格式轉換為二進位制

WebAssembly 具有基於 S-表示式的文字表示形式,這是一種為在文字編輯器、瀏覽器開發者工具等中顯示而設計的中間格式。本文件將簡要介紹其工作原理,以及如何使用可用工具將文字格式檔案轉換為 Wasm 格式。

注意:文字格式檔案通常儲存為 .wat 副檔名。過去也曾使用過 .wast 副檔名,但現在它用於 WebAssembly 測試套件使用的指令碼語言。

初探文字格式

讓我們看一個例子——以下程式從名為 my_namespace 的模組匯入一個名為 imported_func 的函式,並匯出一個名為 exported_func 的函式。

wat
(module
  (func $i (import "my_namespace" "imported_func") (param i32))
  (func (export "exported_func")
    i32.const 42
    call $i
  )
)

WebAssembly 函式 exported_func 被匯出,以便在我們的環境中(例如,我們正在使用 WebAssembly 模組的 Web 應用程式)使用。當它被呼叫時,它會呼叫一個名為 imported_func 的已匯入 JavaScript 函式,該函式使用作為引數提供的 42 這個值來執行。

將 .wat 文字轉換為 .wasm 二進位制檔案

讓我們來嘗試將上面的 .wat 文字表示示例轉換為 .wasm 彙編格式。

  1. 首先,將上面的列表複製到一個文字檔案中;將其命名為 simple.wat

  2. 在我們能夠使用它之前,需要將其文字表示形式組裝成瀏覽器實際讀取的組合語言。為此,我們可以使用 wabt 工具,該工具包含用於在 WebAssembly 的文字表示和 Wasm 之間相互轉換的編譯器,以及更多功能。請訪問 https://github.com/webassembly/wabt — 按照此頁面上的說明設定該工具。

  3. 獲得工具構建後,將 /wabt/out/clang/Debug 目錄新增到您的系統 PATH

  4. 接下來,執行 wat2wasm 程式,將其輸入檔案路徑作為引數傳遞,然後是 -o 引數,然後是輸出檔案路徑。

    bash
    wat2wasm simple.wat -o simple.wasm
    

這將把 Wasm 轉換為一個名為 simple.wasm 的檔案,其中包含 .wasm 彙編程式碼。

注意:您也可以使用 wasm2wat 工具將彙編轉換回文字表示形式;例如 wasm2wat simple.wasm -o text.wat

檢視彙編輸出

由於輸出檔案是基於彙編的,因此無法在普通文字編輯器中檢視。但是,您可以使用 wat2wasm 工具的 -v 選項來檢視它。試試這個:

bash
wat2wasm simple.wat -v

這將以如下方式在您的終端中生成輸出:

several strings of binary with textual descriptions beside them. For example: 0000008: 01 ; section code

另見

  • 理解 WebAssembly 文字格式 — 對文字格式語法的詳細解釋。
  • 從 C/C++ 編譯到 WebAssembly — Binaryen/Emscripten 等工具都可以將您的原始碼編譯為 Wasm,並建立在 JavaScript 上下文中執行模組所需的 API 程式碼。瞭解更多關於如何使用它們。
  • 使用 WebAssembly JavaScript API — 如果您想了解更多關於 WebAssembly API 程式碼的工作原理,請閱讀此文件。
  • 文字格式 — 在 WebAssembly GitHub 倉庫中更詳細地解釋了文字格式。
  • wast-loader — 一個用於 webpack 的載入器,它可以為您處理所有這些。