成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

WebAssembly可以做什么-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)WebAssembly可以做什么的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、豐南ssl等。為數(shù)千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的豐南網(wǎng)站制作公司

首先,讓我們看看WebAssembly做什么

首先,我們有必要了解一下asm.js。2012年,Mozilla 的工程師 Alon Zakai 在研究 LLVM 編譯器時(shí)突發(fā)奇想:許多 3D 游戲都是用 C / C++ 語(yǔ)言寫的,如果能將 C / C++ 語(yǔ)言編譯成 JavaScript 代碼,它們不就能在瀏覽器里運(yùn)行了嗎?眾所周知,JavaScript 的基本語(yǔ)法與 C 語(yǔ)言高度相似。于是,他開(kāi)始研究怎么才能實(shí)現(xiàn)這個(gè)目標(biāo),為此專門做了一個(gè)編譯器項(xiàng)目 Emscripten。這個(gè)編譯器可以將 C / C++ 代碼編譯成 JS 代碼,但不是普通的 JS,而是一種叫做 asm.js 的 JavaScript 變體,性能差不多是原生代碼的50%。

之后Google開(kāi)發(fā)了Portable Native Client,也是一種能讓瀏覽器運(yùn)行C/C++代碼的技術(shù)。 后來(lái)可能是因?yàn)楸舜酥g有共同的更高追求,Google, Microsoft, Mozilla, Apple等幾家大公司一起合作開(kāi)發(fā)了一個(gè)面向Web的通用二進(jìn)制和文本格式的項(xiàng)目,那就是WebAssembly。asm.js 與 WebAssembly 功能基本一致,就是轉(zhuǎn)出來(lái)的代碼不一樣:asm.js 是文本,WebAssembly 是二進(jìn)制字節(jié)碼,因此運(yùn)行速度更快、體積更小。

WebAssembly(又稱 wasm) 是一種新的字節(jié)碼格式,主流瀏覽器都已經(jīng)支持 WebAssembly。 和 JS 需要解釋執(zhí)行不同的是,WebAssembly 字節(jié)碼和底層機(jī)器碼很相似可快速裝載運(yùn)行,因此性能相對(duì)于 JS 解釋執(zhí)行大大提升。 也就是說(shuō) WebAssembly 并不是一門編程語(yǔ)言,而是一份字節(jié)碼標(biāo)準(zhǔn),需要用高級(jí)編程語(yǔ)言編譯出字節(jié)碼放到 WebAssembly 虛擬機(jī)中才能運(yùn)行, 瀏覽器廠商需要做的就是根據(jù) WebAssembly 規(guī)范實(shí)現(xiàn)虛擬機(jī)。

WebAssembly 加載時(shí)間

WebAssembly 在瀏覽器中加載速度更快,因?yàn)橹挥幸呀?jīng)編譯好的 wasm 文件需要通過(guò)internet傳輸。wasm 是一種低級(jí)匯編語(yǔ)言,具有非常簡(jiǎn)潔的二進(jìn)制格式。

WebAssembly 執(zhí)行速度

如今 Wasm 運(yùn)行速度只比原生代碼慢 20%,這是一個(gè)令人驚喜的結(jié)果。它是這樣的一種格式,會(huì)被編譯進(jìn)沙箱環(huán)境中且在大量的約束條件下運(yùn)行以保證沒(méi)有任何安全漏洞或者使之強(qiáng)化。和真正的原生代碼比較,執(zhí)行速度的下降微乎其微。更重要的是,未來(lái)將會(huì)更加快速。

更好的是,它與瀏覽器無(wú)關(guān)——所有主要引擎都增加了對(duì) WebAssembly的支持,且執(zhí)行速度相差無(wú)幾。

為了理解與JavaScript相比WebAssembly的執(zhí)行速度有多快,應(yīng)該首先閱讀關(guān)于JavaScript引擎如何工作的文章。

讓我們快速瀏覽下 V8 的運(yùn)行機(jī)制:

WebAssembly可以做什么

在左邊,是一些JavaScript源代碼,包含JavaScript函數(shù)。首先需要解析它,以便將所有字符串轉(zhuǎn)換為標(biāo)記并生成抽象語(yǔ)法樹(shù)(AST)。AST 是JavaScript程序邏輯結(jié)構(gòu)在內(nèi)存中的表示形式。一旦生成了 AST,V8 直接進(jìn)入到機(jī)器碼階段。其后遍歷樹(shù),生成機(jī)器碼,就得到了編譯好的函數(shù),在這個(gè)過(guò)程中是沒(méi)有提高遍歷速度的。

現(xiàn)在,讓我們看看V8管道在下一階段的工作:

WebAssembly可以做什么

現(xiàn)在有了V8 的新的優(yōu)化編譯器 (TurboFan), 當(dāng) JavaScript應(yīng)用程序在運(yùn)行時(shí),很多代碼都在 V8 中運(yùn)行。TurboFan 監(jiān)測(cè)是否有代碼運(yùn)行緩慢,是否存在性能瓶頸和熱點(diǎn)(內(nèi)存使用過(guò)高的地方),以便對(duì)其進(jìn)行優(yōu)化。它把以上監(jiān)視得到的代碼推向后端即優(yōu)化過(guò)的即時(shí)編譯器,該編譯器把消耗大量 CPU 資源的函數(shù)轉(zhuǎn)換為性能更優(yōu)的代碼。

它解決了性能的問(wèn)題,但這種處理方式有個(gè)缺點(diǎn),分析代碼和決定優(yōu)化哪些內(nèi)容的過(guò)程也會(huì)消耗CPU,這意味著更高的耗電量,特別是在移動(dòng)設(shè)備上。

但是,wasm 并不需要以上的全部步驟-如下所示是它被插入到執(zhí)行過(guò)程示意圖:

WebAssembly可以做什么

在編譯階段,WebAssembly 不需要被轉(zhuǎn)換,因?yàn)樗呀?jīng)是字節(jié)碼了??傊?,以上的解析不在需要,你擁有優(yōu)化后的二進(jìn)制代碼可以直接插入到后端(即時(shí)編譯器)并生成機(jī)器碼。編譯器在前端已經(jīng)完成了所有的代碼優(yōu)化工作。

由于跳過(guò)了編譯過(guò)程中的不少步驟,這使得 wasm 的執(zhí)行更加高效。

WebAssembly 內(nèi)存模型

WebAssembly可以做什么

例如,編譯 成WebAssembly 的c++ 程序的內(nèi)存是一個(gè)連續(xù)的內(nèi)存塊,其中沒(méi)有“漏洞”。wasm 有助于提高安全性的一個(gè)特性是執(zhí)行堆棧與線性內(nèi)存分離的概念。在 c++ 程序中,如果有一個(gè)堆,從堆的底部進(jìn)行分配,然后從其頂部獲得內(nèi)存來(lái)增加內(nèi)存堆棧的大小。你可以獲得一個(gè)指針然后在堆棧內(nèi)存中遍歷以操作你不應(yīng)該接觸到的變量。

這是大多數(shù)可疑軟件可以利用的漏洞。

WebAssembly采用了完全不同的內(nèi)在模式。執(zhí)行堆棧與 WebAssembly 程序本身是分開(kāi)的,因此無(wú)法在其中修改和更改諸如變量的值。同樣,這些函數(shù)使用整數(shù)偏移量,而不是指針。函數(shù)指向一個(gè)間接函數(shù)表。之后,這些直接的計(jì)算出的數(shù)字進(jìn)入模塊中的函數(shù)。通過(guò)這種方式構(gòu)建的,可以同時(shí)加載多個(gè) wasm 模塊,偏移所有索引且每個(gè)模塊都運(yùn)行良好。

更多關(guān)于 JavaScript 內(nèi)存模型和管理的文章詳見(jiàn)這里。

WebAssembly 垃圾收集

在 JavaScript 中,開(kāi)發(fā)者不需要擔(dān)心內(nèi)存中無(wú)用變量的回收。JS 引擎使用一個(gè)叫垃圾回收器的東西來(lái)自動(dòng)進(jìn)行垃圾回收處理。

現(xiàn)在,WebAssembly 根本不支持垃圾回收。內(nèi)存是手動(dòng)管理的(就像 C/C++)。雖然這些可能讓開(kāi)發(fā)者編程更困難,但它的確提升了性能。

目前,WebAssembly 是專門圍繞 C++ 和 RUST 的使用場(chǎng)景設(shè)計(jì)的。由于 wasm 是非常底層的語(yǔ)言,這意味著只比匯編語(yǔ)言高一級(jí)的編程語(yǔ)言會(huì)容易被編譯成 WebAssembly。C 語(yǔ)言可以使用 malloc,C++ 可以使用智能指針,Rust 使用完全不同的模式(一個(gè)完全不同的話題)。這些語(yǔ)言沒(méi)有使用內(nèi)存垃圾回收器,所以他們不需要所有復(fù)雜運(yùn)行時(shí)的東西來(lái)追蹤內(nèi)存。WebAssembly 自然就很適合于這些語(yǔ)言。

另外,這些語(yǔ)言并不能夠 100% 地應(yīng)用于復(fù)雜的 JavaScript 使用場(chǎng)景比如監(jiān)聽(tīng) DOM 變化 。用 C++ 來(lái)寫整個(gè)的 HTML 程序是毫無(wú)意義的因?yàn)?C++ 并不是為此而設(shè)計(jì)的。大多數(shù)情況下,工程師用使用 C++ 或 Rust 來(lái)編寫 WebGL 或者高度優(yōu)化的庫(kù)(比如大量的數(shù)學(xué)運(yùn)算)。

然而,將來(lái) WebAssembly 將會(huì)支持不帶內(nèi)存垃圾回功能的的語(yǔ)言。

WebAssembly  平臺(tái)接口訪問(wèn)

依賴于執(zhí)行 JavaScript 的運(yùn)行時(shí)環(huán)境,對(duì)特定于平臺(tái)的api的訪問(wèn)是公開(kāi)的,可以通過(guò) JavaScript 程序來(lái)直接訪問(wèn)這些平臺(tái)所暴露出的指定接口。例如,如果您在瀏覽器中運(yùn)行JavaScript,有一組Web API, Web 應(yīng)用程序可以調(diào)用這些API來(lái)控制Web瀏覽器/設(shè)備功能,并訪問(wèn) DOM、CSSOM、WebGL、IndexedDB、Web Audio API 等等。

然而,WebAssembly 模塊不能訪問(wèn)任何平臺(tái)api。所有的這一切都得由 JavaScript 來(lái)進(jìn)行中轉(zhuǎn)。如果想在 WebAssembly 模塊中訪問(wèn)一些特定于平臺(tái)的api,必須通過(guò)JavaScript調(diào)用它。

例如,如果想使用console.log,你必須通過(guò)JavaScript調(diào)用它,而不是 c++ 代碼。而這些 JavaScript 調(diào)用會(huì)產(chǎn)生一定的性能損失。

情況不會(huì)一成不變的。規(guī)范將會(huì)為在未來(lái)為 wasm 提供訪問(wèn)指定平臺(tái)的接口,這樣你就可以不用在你的程序中內(nèi)置 JavaScript。

從源碼轉(zhuǎn)換講起

JavaScript腳本正變得越來(lái)越復(fù)雜。大部分源碼(尤其是各種函數(shù)庫(kù)和框架)都要經(jīng)過(guò)轉(zhuǎn)換,才能投入生產(chǎn)環(huán)境。

常見(jiàn)的源碼轉(zhuǎn)換,主要是以下三種情況:

  1. 壓縮,減小體積。比如jQuery 1.9的源碼,壓縮前是252KB,壓縮后是32KB。

  2. 多個(gè)文件合并,減少HTTP請(qǐng)求數(shù)。

  3. 其他語(yǔ)言編譯成JavaScript。最常見(jiàn)的例子就是CoffeeScript。

這三種情況,都使得實(shí)際運(yùn)行的代碼不同于開(kāi)發(fā)代碼,除錯(cuò)(debug)變得困難重重。

通常,JavaScript的解釋器會(huì)告訴你,第幾行第幾列代碼出錯(cuò)。但是,這對(duì)于轉(zhuǎn)換后的代碼毫無(wú)用處。舉例來(lái)說(shuō),jQuery 1.9壓縮后只有3行,每行3萬(wàn)個(gè)字符,所有內(nèi)部變量都改了名字。你看著報(bào)錯(cuò)信息,感到毫無(wú)頭緒,根本不知道它所對(duì)應(yīng)的原始位置。

這就是Source map想要解決的問(wèn)題。

Source map

簡(jiǎn)單說(shuō),Source map就是一個(gè)信息文件,里面儲(chǔ)存著位置信息。也就是說(shuō),轉(zhuǎn)換后的代碼的每一個(gè)位置,所對(duì)應(yīng)的轉(zhuǎn)換前的位置。有了它,出錯(cuò)的時(shí)候,除錯(cuò)工具將直接顯示原始代碼,而不是轉(zhuǎn)換后的代碼。這無(wú)疑給開(kāi)發(fā)者帶來(lái)了很大方便。

WebAssembly可以做什么

由于沒(méi)有規(guī)范定義Source map,所以目前 WebAssembly 并不支持,但最終會(huì)有的(可能快了)。當(dāng)你在 C++ 代碼中設(shè)置了斷點(diǎn),你將會(huì)看到 C++ 代碼而不是 WebAssembly。至少,這是 WebAssembly 源碼映射的目標(biāo)。

多線程

JavaScript 是單線程的。有一些方法可以利用事件循環(huán)并利用異步編程,這個(gè)之前在 JavaScript是如何工作的:事件循環(huán)和異步編程的崛起+ 5種使用 async/await 更好地編碼方式 已經(jīng)講過(guò)了。

JavaScript 也使用 Web Workers 但是只有在極其特殊的情況下-大體上,可以把任何可能阻塞 UI 主線程的密集的 CPU 計(jì)算移交給 Web Worker 執(zhí)行以獲得更好的性能。但是,Web Worker 不能夠訪問(wèn) DOM。

目前 WebAssembly 不支持多線程。但是,這有可能是接下來(lái) WebAssembly 要實(shí)現(xiàn)的。Wasm 將會(huì)接近實(shí)現(xiàn)原生的線程(比如,C++ 風(fēng)格的線程)。擁有真正的線程將會(huì)在瀏覽器中創(chuàng)造出很多新的機(jī)遇。并且當(dāng)然,會(huì)增加濫用的可能性。

可移植性

現(xiàn)在JavaScript幾乎可以在任何地方運(yùn)行,從瀏覽器到服務(wù)器端,甚至在嵌入式系統(tǒng)中。

WebAssembly的設(shè)計(jì)宗旨是安全、便攜。就像JavaScript。它將運(yùn)行在每個(gè)支持 wasm 的環(huán)境中(例如,每個(gè)瀏覽器)。

WebAssembly 擁有和早年 Java 使用 Applets 來(lái)實(shí)現(xiàn)可移植性的同樣的目標(biāo)。

WebAssembly 使用場(chǎng)景

WebAssembly 的最初版本主要是為了解決大量計(jì)算密集型的計(jì)算的(比如處理數(shù)學(xué)問(wèn)題)。最為主流的應(yīng)用場(chǎng)景就是游戲——處理大量的像素。你可以使用你熟悉的 OpenGL 綁定來(lái)編寫 C++/Rust 程序,然后編譯成 wasm。之后,它就可以在瀏覽器中運(yùn)行。

在瀏覽器中
  • 更好的讓一些語(yǔ)言和工具可以編譯到 Web 平臺(tái)運(yùn)行。

  • 圖片/視頻編輯。

  • 游戲:

    • 需要快速打開(kāi)的小游戲

    • AAA 級(jí),資源量很大的游戲。

    • 游戲門戶(代理/原創(chuàng)游戲平臺(tái))

  • P2P 應(yīng)用(游戲,實(shí)時(shí)合作編輯)

  • 音樂(lè)播放器(流媒體,緩存)

  • 圖像識(shí)別

  • 視頻直播

  • VR 和虛擬現(xiàn)實(shí)

  • CAD 軟件

  • 科學(xué)可視化和仿真

  • 互動(dòng)教育軟件和新聞文章。

  • 模擬/仿真平臺(tái)(ARC, DOSBox, QEMU, MAME, …)。

  • 語(yǔ)言編譯器/虛擬機(jī)。

  • POSIX用戶空間環(huán)境,允許移植現(xiàn)有的POSIX應(yīng)用程序。

  • 開(kāi)發(fā)者工具(編輯器,編譯器,調(diào)試器...)

  • 遠(yuǎn)程桌面。

  • VPN。

  • 加密工具。

  • 本地 Web 服務(wù)器。

  • 使用 NPAPI 分發(fā)的插件,但受限于 Web 安全協(xié)議,可以使用 Web APIs。

  • 企業(yè)軟件功能性客戶端(比如:數(shù)據(jù)庫(kù))

脫離瀏覽器
  • 游戲分發(fā)服務(wù)(便攜、安全)。

  • 服務(wù)端執(zhí)行不可信任的代碼。

  • 服務(wù)端應(yīng)用。

  • 移動(dòng)混合原生應(yīng)用。

  • 多節(jié)點(diǎn)對(duì)稱計(jì)算

感謝各位的閱讀!關(guān)于WebAssembly可以做什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

當(dāng)前名稱:WebAssembly可以做什么-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://jinyejixie.com/article40/dispho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、定制網(wǎng)站、軟件開(kāi)發(fā)、關(guān)鍵詞優(yōu)化、自適應(yīng)網(wǎng)站、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
达州市| 黄平县| 鹰潭市| 荣昌县| 双流县| 普格县| 天门市| 辉南县| 敦煌市| 马尔康县| 定安县| 广昌县| 吐鲁番市| 海丰县| 于田县| 岳阳市| 张掖市| 阿拉善左旗| 密山市| 连平县| 广汉市| 边坝县| 灵丘县| 双城市| 余干县| 固镇县| 临沭县| 含山县| 磐安县| 阳城县| 同江市| 馆陶县| 鄯善县| 保亭| 高雄县| 洪洞县| 科尔| 筠连县| 林口县| 云南省| 广丰县|