rust(34)-Rust and WebAssembly(2)
WebAssembly (wasm)是一種簡單的機器模型和可執行格式,具有廣泛的規范。它被設計成便攜、緊湊、以或接近本機速度執行。
作為一種編程語言,WebAssembly由兩種表示相同結構的格式組成,只是方式不同:
wat文本格式(在“WebAssembly text”中稱為wat)使用s -表達式,與Scheme和Clojure等Lisp家族語言有一些相似之處。
.wasm二進制格式是較低級的,打算直接由wasm虛擬機使用。它在概念上類似于ELF和Mach-O
WebAssembly的設計目標如下:
快速、安全、可移植的語義:
快速:以接近本機代碼的性能執行,利用所有現代硬件的通用功能。
安全:在內存安全的[2]、沙箱環境中驗證和執行代碼,防止數據損壞或安全破壞。
良好定義的:充分而精確地定義有效的程序及其行為,以一種容易進行非正式和正式推理的方式。
與硬件無關:可以在所有現代架構、桌面或移動設備和嵌入式系統上編譯。
與語言無關:不為任何特定的語言、編程模型或對象模型提供特權。
平臺獨立的:可以嵌入到瀏覽器中,可以作為獨立的VM運行,也可以集成到其他環境中。
開放:程序可以以一種簡單和通用的方式與它們的環境進行互操作。
高效便攜的表現形式:
緊湊:二進制格式,比典型的文本或本機代碼格式小,傳輸速度快。
模塊化:程序可以分成更小的部分,可以分別傳輸、緩存和使用。
高效:可以在快速單遍中進行解碼、驗證和編譯,這與即時(JIT)編譯或提前(AOT)編譯是一樣的。
Streamable:允許在看到所有數據之前盡快開始解碼、驗證和編譯。
允許將解碼、驗證和編譯分解成許多獨立的并行任務。
可移植性:在現代硬件中沒有廣泛支持的架構假設。
WebAssembly編碼一種低級的、類似于程序集的編程語言。這種語言的結構圍繞以下概念。
Values值
WebAssembly只提供四種基本的值類型。這些是整數和IEEE 754-2019數字,每個32位和64位寬。32位整數也可以用作布爾值和內存地址。對這些類型的常規操作是可用的,包括它們之間轉換的完整矩陣。有符號整數類型和無符號整數類型之間沒有區別。相反,整數被各自的操作解釋為無符號或在2的補碼表示中有符號。
Instructions指令
WebAssembly的計算模型是基于堆棧機器的。代碼由按順序執行的指令序列組成。指令操作隱式操作數堆棧[1]上的值,分為兩大類。簡單指令對數據執行基本操作。它們從操作數堆棧中取出參數并將結果推回到操作數堆棧中。控制指令改變控制流程。控制流是結構化的,這意味著它是用嵌套良好的結構(如塊、循環和條件)來表示的。分支只能以這些構造為目標。
Traps陷阱
在某些情況下,某些指令可能會產生一個陷阱,立即中止執行。陷阱不能由WebAssembly代碼處理,而是報告給外部環境,通常可以在那里捕獲它們。
Functions函數
代碼被組織成獨立的函數。每個函數都接受一個值序列作為參數,并返回一個值序列作為結果。[2]函數可以相互調用,包括遞歸調用,從而產生一個不能直接訪問的隱式調用堆棧。函數也可以聲明可作為虛擬寄存器使用的可變局部變量。
Tables表
表是特定元素類型的不透明值的數組。它允許程序通過動態索引操作數間接地選擇這些值。目前,惟一可用的元素類型是無類型函數引用。因此,程序可以通過動態索引間接地調用表中的函數。例如,這允許通過表索引來模擬函數指針。
Linear Memory線性內存
線性內存是一個連續的、可變的原始字節數組。這樣的內存是用初始大小創建的,但是可以動態增長。一個程序可以在任何字節地址(包括未對齊的)加載和存儲值到線性內存。整數加載和存儲可以指定小于各自值類型大小的存儲大小。如果訪問不在當前內存大小的范圍內,則會發生陷阱。
Modules模塊
WebAssembly二進制文件采用模塊的形式,其中包含函數、表和線性內存的定義,以及可變或不可變的全局變量。還可以導入定義,指定模塊/名稱對和合適的類型。每個定義都可以以一個或多個名稱導出。除了定義之外,模塊還可以為其內存或表定義初始化數據,這些數據以段的形式復制到給定的偏移量。它們還可以定義一個自動執行的start函數。
Embedder嵌入
WebAssembly實現通常會嵌入到主機環境中。該環境定義了如何啟動模塊加載、如何提供導入(包括主機端定義)以及如何訪問導出。但是,任何特定嵌入的細節都超出了此規范的范圍,而是由補充的、特定于環境的API定義提供。
從概念上講,WebAssembly的語義分為三個階段。對于語言的每個部分,規范都指定了它們。
解碼
WebAssembly模塊以二進制格式分發。解碼過程,將其格式化并轉換為模塊的內部表示形式。在這個規范中,這種表示是由抽象語法建模的,但是真正的實現可以直接編譯成機器碼。
驗證
解碼模塊必須是有效的。驗證檢查許多格式良好的條件,以確保模塊是有意義的和安全的。特別是,它執行函數及其主體中的指令序列的類型檢查,例如確保一致地使用操作數堆棧。
執行
最后,可以執行有效的模塊。執行可進一步分為兩個階段:
實例化。模塊實例是模塊的動態表示,包含自己的狀態和執行堆棧。實例化執行模塊主體本身,給出其所有導入的定義。它初始化全局變量、內存和表,并在定義時調用模塊的start函數。它返回模塊導出的實例。
調用。實例化之后,可以通過調用模塊實例上導出的函數來啟動進一步的WebAssembly計算。給定所需的參數,執行相應的函數并返回其結果。
實例化和調用是嵌入環境中的操作。
總結
以上是生活随笔為你收集整理的rust(34)-Rust and WebAssembly(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React和Vue的Chrome扩展工具
- 下一篇: rust(36)-Rust and We