Asm.js
asm . js是一个中央語言,設計目的是使用 C 等程式語言編寫的電腦軟體會當執行為網路應用程式,同時效能特徵明顯優於標準 JavaScript。
asm . js 包括一个 JavaScript 的嚴格仔集,其中的代碼是採用有手動記持體管理的靜態型別語言(就親像 C 語言)編寫,代碼使用一个原始碼至原始碼編譯器(比如講基於 LLVM 的 Emscripten)就共翻譯。通過共語言特性限制佇適合進前最佳化佮其他效能改進的範圍內,效能得著提懸。
Mozilla Firefox 是第一个實現針對 asm . js 最佳化的瀏覽器,對 Firefox 二十二開始使用。
設計的
asm . js 由 JavaScript 語言的一个嚴格仔集組成。伊會當顯示提懸採用具有手動記持體管理(比如講 C)的靜態型別語言編寫的網路應用程式咧使用原始碼至原始碼編譯器轉換做 JavaScript 後的效能。Asm . js 的目標並毋是提高手寫 JavaScript 代碼的效能,嘛無實現增強效能以外的其他目的。
通過共語言特性限制佇適合進前最佳化佮其他效能改進的範圍內,其旨佇有比標準 JavaScript 閣較倚本地(原生)代碼的效能特徵。通過使用 JavaScript 的一个子集,asm . js 真大程度上支援所有主要的網頁瀏覽器,這無仝 WebAssembly 抑是 Google Native Client 等途徑。
代碼生成
asm . js 通常無直接編寫,是做一種通過編譯器生成的中間語言,該編譯器取得 C + + 抑是其他的語言的原始碼,然後輸出 asm . js。
比如講,提供下列 C 語言代碼:
Emscripten 將輸出下列 JavaScript 代碼:
注意新增加的 ` | 零 ` 和去除的類型說明符。佇咧 JavaScript 中,算這位元運算子會將運算元轉換做三十二位元有符號整數並且出整數結果。這個意味對使用零的捏位元 OR 為一个無作用的操作,只是將值轉換做整數。通過嘿每一个參數按呢做,確定欲對外部代碼呼叫該函式的時陣,該當值予人轉換做正確的類型。這嘛用於返回值,這个情況下確保添加一到 i 的結果將是一个整數(抑若無可能變甲傷大), 並且標記函式的返回類型。遮的轉換做 asm . js 定著愛,按呢最佳化編譯器才會當提早生做高效的本地代碼。在此類最佳化編譯器當中,當 asm . js 代碼呼叫其他 asm . js 代碼的時,轉換無執行,因為必須的類型說明符意味著已經保證值具有正確的類型。此外,佮執行浮點加法佮轉換做整數,伊會當簡單來執行本機整數運算。按呢來喔,伊會當得著顯示的效能增益。 下跤是另外一个計算字串長度的例:
伊對應以下 asm . js 代碼:
佇咧生成的代碼內底,變數 MEM 八實際上是一个類型緩衝區的逐个元組「視圖」,伊充當 asm . js 代碼的堆(heap)。
效能
因為乎 asm . js 佇瀏覽器當中執行,所以效能真大程度上取決於瀏覽器佮硬體。編譯做 asm . js 的 C 程式的初步基準通常比使用 Clang 的本地編譯沓沓仔以上的。
這款超過普通 JavaScript 的效能增益主要是因為一百%的類型一致性以及差不多無糞埽回收(記持體是手動管理的大型類型陣列)。 這閣較簡單的模型無動態行為,無記持體分配抑是釋放,干焦一組簡單、定義明確的整數佮浮點操作,對啊若可能現愈好的效能佮最佳化的潛力。
Mozilla 佇二空一三年十二月的基準測試顯示:「 使用 float 三十二最佳化的 Firefox 會當執行所有的基準,干焦比原生的速度慢無到一爿五倍。Mozilla 指出本地編譯代碼的效能毋是單個度量,是一个範圍,使用無仝的本地編譯器(這个例中為 Clang 佮 GCC)會當提供無仝效能的代碼。「事實上,佇一寡基準的測試譬如講 Box 二 D、FASTA 和 copy 中,asm . js 佮 Clang 較倚,抑是比 Clang 到 GCC 閣接近 Clang。佇一種情形下,asm . js 甚至佇咧 Box 二 D 頂懸微微仔擊敗 Clang。」
實現
Emscripten 專案提供矣會當編譯 C 和 C + +(抑是按怎會當轉換做 LLVM IR 的語言)代碼為 asm . js 的工具。
所有支援 JavaScript 較新版本的瀏覽器攏應該會當支援執行 asm . js 代碼,因為伊是這个規範的子集。
部份瀏覽器的實現針對 asm . js 進行矣特別最佳化:
- Mozilla Firefox 是第一个實現針對 asm . js 最佳化的網頁瀏覽器,自 Firefox 二十二開始使用。OdinMonkey 是 Mozilla 佇咧 Firefox 中使用的 asm . js 提前編譯器,伊是 IonMonkey(SpiderMonkey 的 JIT 編譯器)的一个組件。
- 軟軟仔佇咧 Microsoft Edge 使用的 JavaScript ia̋n-jín Chakra 中實現矣 asm . js 支援,執行驗證以產生懸度最佳化的 JIT 代碼。
- Google Chrome 的 V 八 JavaScript ia̋n-jín 佇咧 Chrome 二十八中著 asm . js 基準測試的效能是較早 Chrome 版本的兩倍以上,就算講 Chrome 的 V 無咧使用提前編譯。
採用
目前差不多所有 asm . js 的應用程式攏是使用 Emscripten 抑是 Mandreel 編譯做 asm . js 的 C / C + + 應用程式。
到這當時為止,已經有袂少程式語言、應用程式框殼、程式、函式庫、遊戲、遊戲 ia̋n-jín 佮其他的軟體已經予人徙栽。部份名單見下:
程式語言
- C / C + +:Clang 和 LLVM
- Lua VM:Lua 虛擬機器
- Perl:( micro ) perl 抹五一个大六 . 三的移栽
- Python–CPython 徙栽
- Ruby–Ruby 徙栽
應用程式框殼
- pepper . js:真濟 PNaCl 應用的移植
- Qt:various Qt demos 佮 KDE 應用(如 Kate)的移植
程式佮庫
- OpenGL、SDL 和 SDL 二
- Vim(Vi IMproved)
- FreeType:佇咧 JavaScript 中使用 FreeType 的 TrueType 字型光柵化
- SQLite
- GNU Privacy Guard
- ctags
- gnuplot
- Graphviz
- zlib
遊戲 ia̋n-jín
- 虛幻 ia̋n-jín 三 : 佇四工內底徙栽
- Unreal Engine 四
- Unity
- ScummVM,伊支援真濟經典的冒險遊戲
- Godot
遊戲
- _ Doom _:執行佇咧 PrBoom 上的開源 Freedoom 遊戲 assets,因為是開源的 Doom 代碼
- _ SuperTux _
- _ Dune II _ via OpenDune
- _ BananaBread _ based on Cube 二
- Humble Mozilla Bundle 中的每一个遊戲(Super Hexagon、輕率膜是重力、Osmos、Zen Bound 二、Dustforce DX、Voxatron、FTL : Advanced Edition 和 Democracy 三)
仿真器
- EM-DOSBox:一个 DOSBox 模擬器的移植
- Start 九 . io:面向加一个遊戲架構的網路仿真平台
- JSMESS:一个 MESS 模擬器的移植,面向真濟遊戲機佮電腦系統
數學計算
- HTML 五 Fractal Playground–畫迵天代函式生成的分形,比如講 Mandelbrot fractal。
參見
- WebAssembly–一个開發中的用於瀏覽器的位元組碼,旨咧比 asm . js 閣較緊解破
RPython
- CrossBridge
- Google Native Client(NaCl)
參考資料
外部連結
- 官方網站
- GitHub 上的 asm . js 頁面
- Asm . js : The JavaScript Compile Target
- RPerl
- Asm . js usage per Google Chrome statistics