自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何在 WebAssembly 中寫 “Hello World”?

開發(fā) 后端
WebAssembly 是一種字節(jié)碼格式,幾乎所有的瀏覽器 都可以將它編譯成其宿主操作系統(tǒng)的機器代碼。除了 JavaScript 和 WebGL 之外,WebAssembly 還滿足了將應(yīng)用移植到瀏覽器中以實現(xiàn)平臺獨立的需求。作為 C++ 和 Rust 的編譯目標(biāo),WebAssembly 使 Web 瀏覽器能夠以接近原生的速度執(zhí)行代碼。

[[390511]]

通過這個分步教程,開始用人類可讀的文本編寫 WebAssembly。

WebAssembly 是一種字節(jié)碼格式,幾乎所有的瀏覽器 都可以將它編譯成其宿主操作系統(tǒng)的機器代碼。除了 JavaScript 和 WebGL 之外,WebAssembly 還滿足了將應(yīng)用移植到瀏覽器中以實現(xiàn)平臺獨立的需求。作為 C++ 和 Rust 的編譯目標(biāo),WebAssembly 使 Web 瀏覽器能夠以接近原生的速度執(zhí)行代碼。

當(dāng)談?wù)?WebAssembly 應(yīng)用時,你必須區(qū)分三種狀態(tài):

  1. 源碼(如 C++ 或 Rust): 你有一個用兼容語言編寫的應(yīng)用,你想把它在瀏覽器中執(zhí)行。
  2. WebAssembly 字節(jié)碼: 你選擇 WebAssembly 字節(jié)碼作為編譯目標(biāo)。最后,你得到一個 .wasm 文件。
  3. 機器碼(opcode): 瀏覽器加載 .wasm 文件,并將其編譯成主機系統(tǒng)的相應(yīng)機器碼。

WebAssembly 還有一種文本格式,用人類可讀的文本表示二進制格式。為了簡單起見,我將其稱為 WASM-text。WASM-text 可以比作高級匯編語言。當(dāng)然,你不會基于 WASM-text 來編寫一個完整的應(yīng)用,但了解它的底層工作原理是很好的(特別是對于調(diào)試和性能優(yōu)化)。

本文將指導(dǎo)你在 WASM-text 中創(chuàng)建經(jīng)典的 “Hello World” 程序。

創(chuàng)建 .wat 文件

WASM-text 文件通常以 .wat 結(jié)尾。第一步創(chuàng)建一個名為 helloworld.wat 的空文本文件,用你最喜歡的文本編輯器打開它,然后粘貼進去:

  1. (module
  2.     ;; JavaScript 命名空間導(dǎo)入
  3.     (import  "console"  "log" (func  $log (param  i32  i32))) ;; 導(dǎo)入 log 函數(shù)
  4.     (import  "js"  "mem" (memory  1)) ;; 導(dǎo)入 1 內(nèi)存(64kb
  5.    
  6.     ;; 我們的模塊的數(shù)據(jù)段
  7.     (data (i32.const 0) "Hello World from WebAssembly!")
  8.    
  9.     ;; 函數(shù)聲明:導(dǎo)出 helloWorld(),無參數(shù)
  10.     (func (export  "helloWorld")
  11.         i32.const 0  ;; 傳遞偏移 0 log
  12.         i32.const 29  ;; 傳遞長度 29 log(示例文本的字符串長度)
  13.         call  $log
  14.         )
  15. )

WASM-text 格式是基于 S 表達式的。為了實現(xiàn)交互,JavaScript 函數(shù)用 import 語句導(dǎo)入,WebAssembly 函數(shù)用 export 語句導(dǎo)出。在這個例子中,從 console 模塊中導(dǎo)入 log 函數(shù),它需要兩個類型為 i32 的參數(shù)作為輸入,以及一頁內(nèi)存(64KB)來存儲字符串。

字符串將被寫入偏移量 為 0 的數(shù)據(jù)段。數(shù)據(jù)段是你的內(nèi)存的疊加投影overlay,內(nèi)存是在 JavaScript 部分分配的。

函數(shù)用關(guān)鍵字 func 標(biāo)記。當(dāng)進入函數(shù)時,棧是空的。在調(diào)用另一個函數(shù)之前,函數(shù)參數(shù)會被壓入棧中(這里是偏移量和長度)(見 call $log)。當(dāng)一個函數(shù)返回一個 f32 類型時(例如),當(dāng)離開函數(shù)時,一個 f32 變量必須保留在棧中(但在本例中不是這樣)。

創(chuàng)建 .wasm 文件

WASM-text 和 WebAssembly 字節(jié)碼是 1:1 對應(yīng)的,這意味著你可以將 WASM-text 轉(zhuǎn)換成字節(jié)碼(反之亦然)。你已經(jīng)有了 WASM-text,現(xiàn)在將創(chuàng)建字節(jié)碼。

轉(zhuǎn)換可以通過 WebAssembly Binary Toolkit(WABT)來完成。從該鏈接克隆倉庫,并按照安裝說明進行安裝。

建立工具鏈后,打開控制臺并輸入以下內(nèi)容,將 WASM-text 轉(zhuǎn)換為字節(jié)碼:

  1. wat2wasm helloworld.wat -o helloworld.wasm

你也可以用以下方法將字節(jié)碼轉(zhuǎn)換為 WASM-text:

  1. wasm2wat helloworld.wasm -o helloworld_reverse.wat

一個從 .wasm 文件創(chuàng)建的 .wat 文件不包括任何函數(shù)或參數(shù)名稱。默認情況下,WebAssembly 用它們的索引來識別函數(shù)和參數(shù)。

編譯 .wasm 文件

目前,WebAssembly 只與 JavaScript 共存,所以你必須編寫一個簡短的腳本來加載和編譯 .wasm 文件并進行函數(shù)調(diào)用。你還需要在 WebAssembly 模塊中定義你要導(dǎo)入的函數(shù)。

創(chuàng)建一個空的文本文件,并將其命名為 helloworld.html,然后打開你喜歡的文本編輯器并粘貼進去:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Simple template</title>
  6. </head>
  7. <body>
  8. <script>
  9. var memory = new WebAssembly.Memory({initial:1});
  10.  
  11. function consoleLogString(offset, length) {
  12. var bytes = new Uint8Array(memory.buffer, offset, length);
  13. var string = new TextDecoder('utf8').decode(bytes);
  14. console.log(string);
  15. };
  16.  
  17. var importObject = {
  18. console: {
  19. log: consoleLogString
  20. },
  21. js : {
  22. mem: memory
  23. }
  24. };
  25. WebAssembly.instantiateStreaming(fetch('helloworld.wasm'), importObject)
  26. .then(obj => {
  27. obj.instance.exports.helloWorld();
  28. });
  29. </script>
  30. </body>
  31. </html>

WebAssembly.Memory(...) 方法返回一個大小為 64KB 的內(nèi)存頁。函數(shù) consoleLogString 根據(jù)長度和偏移量從該內(nèi)存頁讀取一個字符串。這兩個對象作為 importObject 的一部分傳遞給你的 WebAssembly 模塊。

在你運行這個例子之前,你可能必須允許 Firefox 從這個目錄中訪問文件,在地址欄輸入 about:config,并將 privacy.file_unique_origin 設(shè)置為 true

 

Firefox setting

注意: 這樣做會使你容易受到 CVE-2019-11730 安全問題的影響。

現(xiàn)在,在 Firefox 中打開 helloworld.html,按下 Ctrl+K 打開開發(fā)者控制臺。

 

Debugger output

了解更多

這個 Hello World 的例子只是 MDN 的 了解 WebAssembly 文本格式 文檔中的教程之一。如果你想了解更多關(guān)于 WebAssembly 的知識以及它的工作原理,可以看看這些文檔。 

 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2011-11-21 14:10:53

C#

2012-08-27 09:10:05

JVMJava

2020-03-25 14:40:45

語言編程語言Hello

2014-12-19 10:07:10

C

2017-11-23 17:45:46

Yii框架IntelYii框架深度剖析

2013-06-06 13:58:14

C語言

2012-02-20 14:26:48

JavaPlay Framew

2021-02-01 17:29:19

FlutterHello World開發(fā)

2009-07-30 13:21:17

Scala入門Hello World

2009-09-16 17:15:19

OSGi Bundle

2009-08-11 10:32:23

什么是Groovy

2023-01-06 08:18:44

2023-09-04 07:30:03

Wasm匯編語言

2011-06-08 14:39:06

Qt 教程

2011-03-14 09:33:35

Mono

2021-11-26 08:22:01

Java動態(tài)開發(fā)

2009-08-14 16:54:19

C# Hello Wo

2024-04-11 13:13:27

2011-08-05 09:48:46

iPhone Interface

2014-04-11 11:36:42

NDKAndroid開發(fā)終端
點贊
收藏

51CTO技術(shù)棧公眾號