摘要:的代碼采用另外一套編譯器,將代碼預先編譯成機器指令,在編譯過程或運行過程中,一旦發現語法錯誤或違反類型標記的情況出現,便重新將代碼交予引擎解析執行。
Asm.js簡介
早前流行的JavaScript將會統治世界這個梗,很好的說明了JavaScript的將來,能用JavaScript書寫的都會用JavaScript來進行書寫,不過JavaScript的弱類型是其被黑性能的很大不一部分,而為了解決由其他強類型語言【c++、Java】等轉換為JavaScript的困擾時,各大瀏覽器嘗試進行了不同的嘗試,其中Mozilla的Asm.js最為突出,
Asm.js 來自于 JavaScript 應用的一個新領域: 編譯成JavaScript的C/C++應用. 它是 JavaScript 應用的一個全新流派,由 Mozilla 的 Emscripten項目催生而來。
Emscripten 將 C/C++ 代碼傳入 LLVM, 并將 LLVM生成的字節碼轉換成 JavaScript (具體的,
Asm.js, 是 JavaScript 的一個子集).
asm.js不是一種新的語言,而是JS語法的一個子集,也就是說所有用asm.js寫的程序都是合法的JS程序,asm.js與JS語言的關系有點類似C與C++的關系。因此,不支持asm.js的瀏覽器或JS引擎也可以無誤地執行asm.js的代碼。asm.js顧名思義是作為JS的匯編語言來設計的,它的語法手寫起來非常困難,且難以閱讀。首先,asm.js的語法利用了一些標注讓JS的變量成為強類型的,這些標注與Emscripten生成的代碼如出一轍,實際上asm.js的產生就是為了提高Emscripten轉換后的代碼執行效率的。
準確的來說,目前我們還無法來完整的使用這個功能,因為僅僅https://www.mozilla.org/zh-CN... 只有他支持asm.js,當然前文也說了,即使不支持的瀏覽器也可以執行,因為本質上Asm.js就是JavaScript,只不過這樣書寫的js的性能和可讀性都不如正常書寫的JavaScript,所以沒有意義,asm.js本來也是不希望程序員去書寫,而是JavaScript擴展到其他領域的可能,通過將c/c++的應用程序轉換為Asm.js的程序,就可以在web平臺跑了,
至于怎么運行的,官網上有一張圖片:
由于asm.js相當于支持了強類型,因此可以直接對應編譯成機器指令執行。asm.js的代碼采用另外一套AOT(Ahead Of Time)編譯器,將asm.js代碼預先編譯成機器指令,在編譯過程或運行過程中,一旦發現語法錯誤或違反類型標記的情況出現,便重新將代碼交予JS引擎解析執行。
從本質上來說Asm.js不是新的語言,是一種新的JavaScript的使用場景、領域,他的語法都是JavaScript的語法,實現的過程就是:
使用各種黑白膜法【位運算、注解、檢測】來實現了強類型;
通過各類工具【Emscripten】來將其他語言轉換為asm.js格式的js,可在web平臺執行;
通過瀏覽器的js引擎的支持,將asm.js編譯成更為底層的機器碼來加提高js的性能;
同時也要兼容,變異的機器碼需要動態檢測是引擎否能夠支持這種機器碼,不能就轉到js執行,這樣的話性能并沒有提高。
準確的說Asm.js都是編譯而來的機器碼,但是可以根據web平臺的js引擎來進行【機器碼--JavaScript】的切換動作,從而兼容其他web平臺。
最后列一段真是的編譯后的Asm.js模塊代碼:
function GeometricMean(stdlib, foreign, buffer) { "use asm"; var exp = stdlib.Math.exp; var log = stdlib.Math.log; var values = new stdlib.Float64Array(buffer); function logSum(start, end) { start = start|0; end = end|0; var sum = 0.0, p = 0, q = 0; // asm.js forces byte addressing of the heap by requiring shifting by 3 for (p = start << 3, q = end << 3; (p|0) < (q|0); p = (p + 8)|0) { sum = sum + +log(values[p>>3]); } return +sum; } function geometricMean(start, end) { start = start|0; end = end|0; return +exp(+logSum(start, end) / +((end - start)|0)); } return { geometricMean: geometricMean }; }
參考:網友解讀:https://software.intel.com/zh...
官網:http://asmjs.org/spec/latest/
githu地址 https://github.com/dherman/as...
很贊的文章 http://www.oschina.net/transl...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87033.html
摘要:并且于年月日,四個主要的瀏覽器一致同意宣布的版本已經完成,即將推出一個瀏覽器可以搭載的穩定版本。因此本文著重介紹為什么比更快。本文主要表達的是為什么應該是更快的。則不同,它是由幾大主要的瀏覽器廠商共同設計的。 作者:Alon Zakai 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58ce80d2a6d8a0...
摘要:前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點分為新聞熱點開發教程工程實踐深度閱讀開源項目巔峰人生等欄目。利用降低三倍加載速度自推出之后,很多開發者都開始嘗試在小型項目中實踐,不過尚缺大型真實案例比較。 前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點;分為新聞熱點、開發教程、工程實踐、深度閱讀、開源項目、巔峰人生等欄目...
摘要:優化項也會引發一些問題。檢查你的代碼是否工作并修復問題。從起,及以上的優化級別默認啟動了這項設置。目前正在進行改進。代碼移植系列文章代碼移植主題系列文章是中文站點的一部分內容。 作者:云荒杯傾歡迎加入Wasm和emscripten技術交流群,群聊號碼:939206522。 這是關于Emscripten的系列文章,更多文章請看下面鏈接。 Emscripten代碼移植系列文章 Emscr...
摘要:優化項也會引發一些問題。檢查你的代碼是否工作并修復問題。從起,及以上的優化級別默認啟動了這項設置。目前正在進行改進。代碼移植系列文章代碼移植主題系列文章是中文站點的一部分內容。 作者:云荒杯傾歡迎加入Wasm和emscripten技術交流群,群聊號碼:939206522。 這是關于Emscripten的系列文章,更多文章請看下面鏈接。 Emscripten代碼移植系列文章 Emscr...
摘要:來自于應用的一個新領域編譯成的應用它是應用的一個全新流派,由的項目催生而來。所有外部數據在一個稱為堆的對象中存儲并被引用。到目前為止,大部分的使用情況下,代碼性能是至關重要的比如運行游戲,圖像,處理語言翻譯和庫。 正如許多開發者一樣,我也為Asm.js的前景而感到興奮不已。最近的新聞——Asm.js正在被Firefox支持——引起了我的興趣。同樣感興趣的還有Mozilla和Epic聲明...
閱讀 3110·2021-11-10 11:36
閱讀 3312·2021-10-13 09:40
閱讀 6051·2021-09-26 09:46
閱讀 662·2019-08-30 15:55
閱讀 1409·2019-08-30 15:53
閱讀 1579·2019-08-29 13:55
閱讀 2997·2019-08-29 12:46
閱讀 3204·2019-08-29 12:34