1. 程式人生 > >關於WebAssembly的一些介紹和開發

關於WebAssembly的一些介紹和開發

近幾年,WebAssembly在快速的成長中,被稱為未來的web發展方向。
本文主要內容是關於WebAssembly,包括和asm.js的一些對比,以及WebAssembly的一些特性和開發方式。
本文主要內容來自Google I/O '17中Alex Danilo的關於WebAssembly的主題演講。感興趣的可以去YouTube看原文視訊。

JavaScript效能瓶頸

首先,我們需要從JavaScript說起,JavaScript目前作為web端的中流砥柱,可以說是撐起了一片天下,加上最近火熱的node.js,大有一統前後端的趨勢。但其作為一門解釋型語言,在大型專案中的執行速度實在是差強人意。通過下面這張圖我們可以通過一個簡單的“+”運算,來看看JavaScript引擎都需要做什麼。
這裡寫圖片描述


上圖為JavaScript如何把執行加號,因為在JavaScript中,一個“+”的兩邊可能是任何型別的資料,並且兩邊的型別並不一定相等,所以在執行時候,引擎首先需要判斷型別,然後再根據型別執行對應的操作,我們從上圖中也可以看到,一個“+”的過程相當複雜。而對於現代引擎來說,已經很難去優化這部分過程,所有的都是必須的。

所以現在有很多關於這方面的研究,關於提升JavaScript的效能瓶頸。目前主要有兩種思路:

  1. 一種是以typescript,JSX 為代表。比如typescript在編寫的時候需要程式設計師指定變數的型別,和一門強型別語言一樣,然後再編譯成JavaScript,相當於把強型別編譯成弱型別。
  2. 以及幾個來自Mozilla的天才工程師發明了asm.js,asm最初的設計目標是在Emscripten中,將寫好的c++轉換成js中一個很小的子集,通過用型別標註,來識別變數型別,而js引擎會將這部分程式碼轉換成更快的原生程式碼。
    下面是一個示例:
//asm.js示例
function add1(x){
     x = x|0;
     return (x+1)|0
}
//通過x後面標註的|0,可以識別x是一個int型別變數。

關於上面兩種方法,很快就發現第二種的潛力和速度是要明顯優於第一種的。對於第一種,只是加快了現有的編譯速度,比如JIT編譯。但是對於第二種,卻可以大大改變現在JavaScript的編譯過程,甚至實現AOT。

隨著幾年的發展,人們發現asm.js的確對JavaScript效能提示有很好的效果。但是,asm也存在著缺陷,因為它並未標準化,導致它在不同瀏覽器上的支援不一樣,導致了效能差異也很明顯,有的瀏覽器對它支援不好。

所以,在Mozilla, Google, Microsoft, and Apple的聯合下,對asm.js去粗取精,進行標準化,誕生了WebAssembly,WebAssembly並不是一種需要去寫的語言,也沒有人會去這麼做,它可以說是一種編譯目標。

首先我們需要清楚一件事情,如果想要極限的優化程式碼執行,讓它執行的更快,減少無用中間過程, 就如上面的“+”操作,我們最終極的目標就是“+”能夠直接被轉換為一條簡單CPU指令操作。而這個也是WebAssembly想要做的。

而WebAssembly目前可以以原生程式碼速度的1.2倍執行,這個資料看上去令人非常吃驚的。但它的確已經存在了,並且這項技術也已經被四個主流的瀏覽器引擎所支援。

過去對於web效能的提升

在正式介紹之前,我們可以回顧下以前提升web效能的一些方式。

在過去提升Web效能的方式主要是通過外掛,比如flash和它的JIT。但是我們也知道這項技術在今天已經過時了,原因之一也是因為它的安全問題,哪怕是在沙盒環境中,它們的安全漏洞依舊存在。其次,這些外掛對Web API的支援並不好。當然,最主要的一個原因應該是移動端的蓬勃發展,導致這些外掛已再無用武之地。

再後來,是Google的Native Client計劃。它的目標是將js編譯後執行在web瀏覽器中。但是缺陷和明顯,和web api的互動性弱,不支援dom物件,後來也產生了portable Native Client,但是因為安全原因實現太過困難,也沒有瀏覽器會那麼做。

與asm的對比

下面我們簡單看看在V8引擎中,為什麼WebAssembly會比asm更好,主要體現在優化引擎TurboFan參與 的階段。
以上面的示例asm.js程式碼為例,我們看看這段程式碼在引擎中發生了什麼。
這裡寫圖片描述

首先瀏覽器對程式碼進行解析,分析詞法環境進行,生成ast樹。ast樹是記憶體中你的程式的邏輯表示。不同瀏覽器對於接下來的步驟會有所不同,在v8中,引擎會根據生成的AST直接生成對應的機器碼,這部分由V8的Full Compiler完成。事實上,這段解析js的過程已經是很快了,基本不再有可能去優化這個過程了。

在上面生成的是未經過優化的程式碼。接下來,在V8中會對部分程式碼(由上面的Full Compiler執行一段時間後得出的“熱門”程式碼和那些執行較慢的程式碼)使用它的TurboFan優化引擎。對程式碼進行重新編譯,從而大大提高效率。

對於asm.js,它會參與整個分析階段,包括生成ast,生成機器碼,找出那些使用“熱門”的程式碼以及重編譯等等,這些其實都是屬於CPU週期,asm.js卻需要全程參與。但如果是用WebAssembly,就如下圖所示,WebAssembly會出現在最後階段,這是因為WebAssembly在編譯階段已經完成了優化,所以在不需要再參與分析階段。
這裡寫圖片描述
所以,WebAssembly相比asm大大減小了優化編譯時期的工作量。通過資料顯示,而相比與asm.js,WebAssembly 的速度比asm.js快2/3(指的是執行時速度)。

WebAssembly介紹

下面,我們將要正式介紹WebAssembly。

關於WebAssembly,之前看過很多人問,有了WebAssembly是不是意味著我們不再需要去寫JavaScript了,答案當然是NO。WebAssembly只是JavaScript的一個補充,它提供了一個途徑,去讓那些寫C++,C或是rust code以及其他靜態型別語言的人,把它們寫的編譯成一個模組,而這個模組可以被JavaScript呼叫,與JavaScript協同工作。

WebAssembly作為JavaScript的補充,提供了和c++一樣的強型別機制,例如int32。有了這些強型別的機制,引擎就可以省去之前花費大量時間的型別處理,將JavaScript像C++一樣進行AOT(靜態編譯),從而實現將JavaScript的速度提升到和原生程式碼一樣的程度。

使用WebAssembly,你可以不受任何影響的使用所有的web API,所有的標準DOM函式以及API,當然,也有一些新的東西,比如32位的浮點數或是64位整數,以及新增的threas支援和SIMD(單指令多資料)。需要了解的是,WebAssembly 的執行堆是完全與WebAssembly 程式隔離的,所以你是無法干涉或者改變它的執行過程,這也是一個很重要的安全特性。

需要指出的一點是,WebAssembly 是無法訪問任何的平臺APIs。所以,你需要通過JavaScript本身與調解這一切,而WebAssembly 只需要去完成它本身能夠做的,比如數值方面的工作。

WebAssembly 語言介紹

下面這張圖展示了WebAssembly 的一些要素,數值型別與c++相同,並且在WebAssembly中,它們與c++一樣同樣是靜態型別。操作方面,提供基本的四則運算,除此之外,也包括平方根,取整。
這裡寫圖片描述

支援情況

而對於開發者所關心的支援情況,
這裡寫圖片描述
我們可以看到,目前這項技術是被主流引擎廠商所支援,所以開發者不用擔心支援情況。

WebAssembly 開發

現在開發者現在可以到webassembly官網去獲得如何開發WebAssembly 的一些指導,先從一個hello World開始。這個網站包括了基本所有WebAssembly的內容,包括技術細節,API和DEMO。

作為開發 WebAssembly的工具 。目前有binarian,這也是新誕生一種工具,通過與emscripten一同協作來產生WebAssembly code。此外,也可以用其他工具比如GCC 。

接下來,當你有了一個c++檔案,就可以通過相應的編譯命令,得到兩個檔案,.js和.WASM。這個js檔案便可以直接在瀏覽器中執行。
同時,也可以在WASM中呼叫js,包括一些DOM APIs,通過使用EM_ASM這個命令:

//CALL JS FROM WASM
#include<emscripten.h>
int main(){
    EM_ASM(
        const elt = document.getElementById("hello-world");
        elt.innerText = "Hello World";
    );
    return 0;
}

當然,不僅限於Web API,你同樣也可以可以在C++中匯入你在js中定義的函式。

總結

以上就是關於webassembly的一些介紹,現在webassembly被稱為未來web的發展方向。個人認為它是解決JavaScript效能瓶頸的出路,期待以後web能夠給人們展示越來越炫酷和驚豔的頁面。

開發資源:

示例:

相關推薦

關於WebAssembly一些介紹開發

近幾年,WebAssembly在快速的成長中,被稱為未來的web發展方向。 本文主要內容是關於WebAssembly,包括和asm.js的一些對比,以及WebAssembly的一些特性和開發方式。 本文主要內容來自Google I/O '17中Alex Dani

Android OpenSL ES 開發:Android OpenSL 介紹開發流程說明

ror logic ogr activity engine eid 優化 als 分享 一、Android OpenSL ES 介紹 OpenSL ES (Open Sound Library for Embedded Systems)是無授權費、跨平臺、針對嵌入式系統精心

【黃兆雷的程式設計雜談部落格】個人的一些介紹做過的專案_覺得有點自豪的一些專案

黃兆雷,一個喜歡程式設計的人,日常工作,每天都程式設計,感覺累嗎?其實,個人感覺不累,因為我的興趣就在這裡啦。生活中,我喜歡運動,音樂和健長樂,因為健長樂挺好的,有些人說健長樂是個騙局,其實,個人感覺,這些人都不瞭解健長樂吧,假冒的健長樂才是騙局吧,而且不少的人都覺得健長樂不良反應也有,

個人的一些介紹做過的專案,呵呵

性格開朗,為人幽默,工作有責任感。 1精通Java基礎語言 2精通J2EE相關技術,熟悉使用Myeclipse等開發平臺 3熟悉Oracle、SQLserver資料庫的開發,能熟練編寫SQL語句 4掌握WEB前端技術的使用,JS、JQurey、html、css等WEB前端技

新版V8引擎的一些介紹了解

2017年的谷歌I/O大會召開。本文主要介紹在這次I/O大會上關於V8引擎最新的一些東西。 效能優化的多方權衡 在最開始,介紹一些關於瀏覽器引擎優化的基本路線,看看對瀏覽器引擎優化一般從哪幾個方面著手。V8雖然在對javascript優化上取得很

對Thymeleaf的一些籠統介紹理解

良好的 let serve 模板 方式 系列 希望 現在 溢出 (隨手記錄的,,可能沒那麽易看,sorry le) 先大概介紹一下關於Thymeleaf的概念和理解:首先Thymeleaf模板引擎(換句話說他是現代服務器端的Java模板引擎,) 他所對應的主要作用(因為也是

Hybrid APP混合開發一些經驗總結

後臺 機制 獲取 功能 前端 如果 導致 接口 編寫 寫在前面: 由於業務需要,接觸到一個Hybrid APP混合開發的項目。當時是第一次接觸混合開發,有一些經驗和總結,歡迎各位一起交流學習~ 1、混合開發概述 Hybrid App主要以JS+Native兩者

arraylist,linklist的部分源碼介紹一些區別

copy 因此 else list GC prev RF iou 返回 arraylist: 3個構造器: (1)默認構造器(使用這個構造器初始化的集合容量為默認初始化容量10) public ArrayList() { this.elementDat

Web2.0簡單介紹軟件開發結構淺談

Web2.0簡單介紹和軟件開發結構淺談 1、Web2.0指的是利用Web的平臺,由用戶主導而生成內容的互聯網產品模式,為了區別由網站雇員主導生成內容的傳統網站而定義為Web2.0基於Web2.0這些特點所產生的具有代表性的服務如下:博客、內容源、WiKi、參與評論與評分的Digg機制、美味書簽、社會化網絡、

PEP8編碼規範,及開發中的一些慣例建議

ret mar 小寫 比較運算 -c 包含 user def 有意 為什麽要有編碼規範   規範的代碼給人的第一感覺是【美觀】,美的東西總是更加的吸引人,也願意觀看。亂糟糟得是不是會讓人不由自主地想飆臟話。所以美觀進而帶來的是代碼的【可讀性】強,想一想你寫的代碼可讀性非常高

瀏覽器介紹一些簡單的代碼

鏈接 ebs left 火狐 需要 .com 分享 sublime tro   一網頁主要由:1. title 題目         2. Url 網址         3. body 網站內容(body裏的內容靠代碼實現)         這些內容     4

Spring Cloud微服務系統架構的一些簡單介紹使用

Spring Cloud 目錄 特徵 雲原生應用程式 Spring Cloud上下文:應用程式上下文服務 引導應用程式上下文 應用程式上下文層次結構

國外15種手機遊戲引擎開發工具介紹

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

JAVA開發Web Service幾種框架介紹選擇

下面分別介紹一個這幾種Web Service框架的基本概念1、JWS是Java語言對WebService服務的一種實現,用來開發和釋出服務。而從服務本身的角度來看JWS服務是沒有語言界限的。但是Java語言為Java開發者提供便捷釋出和呼叫WebService服務的一種途徑。2、Axis2是Apac

Vue SSR的應用場景開發中遇到的一些問題

https://blog.csdn.net/P6P7qsW6ua47A2Sb/article/details/81256748   https://blog.csdn.net/qq_26744901/article/details/78617209   根據專案需要,如有需要用到n

Flutter提升開發效率的一些方法工具

Flutter的環境搭配完之後,就開始Flutter的開發,下面的一些工具和方法,可以省下一些時間。 自己在用的,暫時想到的,就是這些了,總結一下。 1.JSON解析快速生成實體類 根據介面返回的資料,編寫實體類,新增兩個方法。 fromJson()方法是可以聰一個Map中構造出一個User的例項,t

家用NAS進階折騰之旅—常見NAS系統介紹一些體會以及QNAP 威聯通 TS-563 NAS使用感受

原文網址:https://post.smzdm.com/p/653673/   寫在前面 新人第一篇投稿,因能力一般,水平有限,內容均為個人理解,難免有紕漏指出。如果您對本文內容有異議或有更好的解決方案,請不吝賜教。而且從小語死早,文采可能非常渣,請大家選擇性的 往下看。

iOS開發-多執行緒NSThread的基本介紹使用

今天給同學講解一下多執行緒的入門瞭解和使用那麼廢話不多說直接上程式碼~ NSThread建立和啟動執行緒 NSThread其他用法 其他建立執行緒方式 執行緒的狀態介紹 控制執行緒狀態 多執行緒的安全

iOS開發-多執行緒GCD的介紹使用

今天給同學講解一下強大的GCD(Grand Central Dispatch) 可譯為"牛逼的中樞排程器"來實現多執行緒的技術那麼廢話不多說直接上程式碼~ 什麼是GCD? 任務和佇列 執行任務 佇列的

移動應用開發部,實施敏捷開發3個月後的一些經驗教訓。

部門採用敏捷開發了3個月,這3個月利用敏捷的思想在部門實施了敏捷開發的大部分實踐和嘗試,這裡總結一下這3個月實施敏捷開發的一些工作狀況。 一、敏捷開發的具體工作; 1. 整體人員進行敏捷開發培訓,在部門內選擇不同的人員擔任產品負責人(PO)、ScrumMaster; 2.