自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

什么是WebAssembly?

譯文 精選
開發(fā) 前端
本文針對一種小型且快速的二進制編程語言—WebAssembly,先后介紹了其工作原理、實際用例、以及正在完善的各項功能。

?譯者 | 陳峻

審校 | 孫淑娟

二十多年來,有一種編程語言一直在Web瀏覽器中以原生的方式被使用至今。這便是JavaScript。期間,我們見證了諸如Java和Flash的ActionScript等第三方二進制插件,從興起到逐漸消亡。而作為另一類Web語言的CoffeeScript,最終仍然會被編譯成JavaScript??梢姡挥蠮avaScript才是Web開發(fā)界的王者,并骨灰級地被沿用著。

不過,我們現(xiàn)在有了一種新的可選項:WebAssembly(簡稱為Wasm)。作為一種小型且快速的二進制格式編程語言,它可以為Web應(yīng)用提供接近原生的性能。此外,WebAssembly旨在成為任何語言的編譯目標,而JavaScript只是目標中的一種。也就是說,鑒于每一種主流瀏覽器都能支持WebAssembly,我們有必要開始認真地考慮,如何編寫出各種可以被編譯為WebAssembly的客戶端應(yīng)用。

值得注意的是,WebAssembly應(yīng)用程序并不打算(至少目前并沒有)取代JavaScript應(yīng)用程序。相反,鑒于JavaScript具有靈活、動態(tài)類型、以及源代碼可讀等交付特性,WebAssembly旨在提供高速、強類型,以及緊湊二進制式的交付特性。因此,WebAssembly可以被視為JavaScript的輔助“伙伴”。

在實際中,開發(fā)人員可以考慮將WebAssembly運用到諸如:游戲、音樂流、視頻編輯、以及CAD應(yīng)用等性能敏感型的用例中。目前,許多Web服務(wù)已經(jīng)開始采用WebAssembly了。例如,為了縮短加載的時間與執(zhí)行的速度,谷歌地球和協(xié)作式繪圖與圖表應(yīng)用Figma,都采用了較新的WebAssembly。

1.WebAssemzbly的工作原理 

由W3C開發(fā)的WebAssembly,用其創(chuàng)建者的話來說是一個“編譯的目標”。開發(fā)人員不必直接編寫WebAssembly。他們可以選用自己熟悉的語言編寫代碼,然后編譯成WebAssembly類型的字節(jié)碼。字節(jié)碼通常運行在客戶端的Web瀏覽器中,并被翻譯成可被高速執(zhí)行的原生機器代碼。

WebAssembly代碼旨在實現(xiàn)比JavaScript更快的加載、解析和執(zhí)行。當使用WebAssembly時,Web瀏覽器仍然存在下載Wasm模塊,以及予以設(shè)置的開銷。雖然對于較大的Wasm項目而言,此類模塊會因為在運行過程中產(chǎn)生了幾兆字節(jié),而出現(xiàn)延遲。但是在其他同等條件的中小型項目中,WebAssembly會運行得更快一些。

同時,WebAssembly也提供了一個沙盒執(zhí)行模型,該模型與JavaScript的現(xiàn)有安全模型非常相似。也就是說,Wasm應(yīng)用程序無法直接訪問到沙箱之外的任何內(nèi)容,甚至是它們正在運行的網(wǎng)頁上的DOM。因此,如果應(yīng)用程序需要與系統(tǒng)中的其他部分進行交互,就必須使用類似WebAssembly系統(tǒng)接口(WASI,https://wasi.dev/)的各種ABI(應(yīng)用程序二進制接口)。WASI為程序提供了常被用于文件、網(wǎng)絡(luò)、系統(tǒng)時鐘、以及其他系統(tǒng)服務(wù)的受控式訪問。

目前,雖然在Web瀏覽器中運行WebAssembly,是其最常見的一種使用場景,但是WebAssembly遠不僅僅是基于Web的解決方案。例如:Wasmer項目就可以在服務(wù)器端運行WebAssembly應(yīng)用程序。這與Node.js運行時(runtime)在瀏覽器之外運行JavaScript的方式非常類似。

2.用例 

WebAssembly的最基本用例就是被開發(fā)者用來編寫瀏覽器內(nèi)的軟件。我們可以用各種語言來編寫出可以被編譯成WebAssembly的組件,然后通過JavaScript,將WebAssembly的最終、有效負載傳遞給客戶端。

如前文所述,WebAssembly在設(shè)計時就考慮到了各種性能密集型、基于瀏覽器的用例。其中包括:游戲、音樂流、視頻編輯、CAD、加密、以及圖像識別等等??偟恼f來,WebAssembly用例通常適合如下三個領(lǐng)域:

  • 已存在于目標語言中的高性能代碼。例如,如果你有一個已用C語言編寫的高效數(shù)學函數(shù),并且需要將它合并到某個Web應(yīng)用程序中,那么,你就可以將它部署為一個WebAssembly模塊。同時,您可將該應(yīng)用中,那些對于性能不太敏感的、面向用戶的部分,保留為JavaScript。
  • JavaScript代碼不夠理想,需要從頭開始編寫的高性能代碼。過去,開發(fā)人員會使用asm.js(http://asmjs.org/)來改寫此類代碼。如今,您可以通過WebAssembly來實現(xiàn)該目的。
  • 將桌面應(yīng)用移植到Web環(huán)境中。雖然asm.js和WebAssembly都可以在技術(shù)上實現(xiàn)此類需求,但是WebAssembly可以提供比使用HTML呈現(xiàn)GUI更為基礎(chǔ)的應(yīng)用。對此,您可以查看WebDSP和瀏覽器中的Windows 2000這兩個示例,來進一步了解其功效。

總之,WebAssembly開發(fā)往往能夠達到比現(xiàn)有JavaScript應(yīng)用程序更快的運行效果。

3.WebAssembly的語言支持 

顧名思義,WebAssembly不可被直接編寫,它更像是一種匯編語言,一種供機器使用、而非高級的、用戶友好的編程語言。與C或Java相比,WebAssembly更接近由LLVM語言編譯器的基礎(chǔ)結(jié)構(gòu)所生成的中間代碼表示(intermediate representation,IR)。

通常,大多數(shù)使用WebAssembly的場景都會涉及到使用如下三種基本方式中的一種,把那些由高級語言編寫的代碼,轉(zhuǎn)換為WebAssembly:

  • 直接編譯。通過本語言自帶的編譯器工具鏈,源代碼可以被直接翻譯成WebAssembly。例如:Rust、C/C++、Kotlin/Native、以及D都可以通過原生方式,從支持此類語言的編譯器處,直接編譯出Wasm。
  • 第三方工具。Java、Lua和.Net等語言雖然并不提供原生的、支持Wasm的工具鏈,但它們可以使用第三方實用程序,將代碼轉(zhuǎn)換為Wasm。
  • 基于WebAssembly的解釋器。它并非是將現(xiàn)有語言的代碼翻譯成WebAssembly,而是用由WebAssembly編寫的語言解釋器,去運行代碼。由于解釋器本身就占有幾兆字節(jié)的代碼空間,因此,該方法較為臃腫。當然,它保留了那些原有語言編寫的代碼,在無需轉(zhuǎn)換的情況下,被運行起來。例如,Python(往往是通過PyScript)和Ruby都擁有翻譯成Wasm的解釋器。

4.WebAssembly即將推出的功能 

不可否認,WebAssembly仍處于早期階段。其工具鏈和實現(xiàn),更接近于概念性的驗證(proof-of-concept)。目前,WebAssembly正努力通過如下方面的舉措,讓其更加實用:

垃圾回收的原語(Primitives)

WebAssembly目前并不直接支持那些使用垃圾回收內(nèi)存模型(garbage-collected memory model)的語言。我們只能通過限制功能集,或?qū)⒄麄€運行時(runtime)嵌入WebAssembly的可執(zhí)行文件,以支持Lua或Python等語言。當然,WebAssembly正在緊鑼密鼓地研發(fā)其支持垃圾回收內(nèi)存模型的功能。

線程(Threading)

對線程的原生支持,在Rust和C++等語言中十分常見。而WebAssembly缺乏對于線程的支持,就意味著那些以WebAssembly為最終目標的應(yīng)用代碼的整個類,我們都不能使用Rust和C++等語言來編寫。目前,已有人提出使用C++線程模型,向WebAssembly添加線程。

大容量內(nèi)存操作和SIMD

大容量內(nèi)存操作和SIMD(單指令與多數(shù)據(jù),single instruction, multiple data)的并行性,對于需要處理大量數(shù)據(jù)、并需要通過原生CPU加速,來防止阻塞的應(yīng)用程序(如機器學習或數(shù)據(jù)科學應(yīng)用)而言,是必不可少的。目前,WebAssembly正努力添加此類功能。

高級語言結(jié)構(gòu)

同時,WebAssembly正在對標高級語言結(jié)構(gòu),并不斷完善如下功能:

  • 異常(Exceptions)可以在WebAssembly中被模擬,但是不能通過WebAssembly的指令集被原生地實現(xiàn)。目前,WebAssembly正計劃創(chuàng)建與C++異常模型相兼容的異常原語,以便被編譯為WebAssembly的那些語言代碼所使用。
  • 參考類型(Reference types)可以輕松地向主機環(huán)境傳遞被用作參考的對象。它能夠使得垃圾回收和其他高級功能,更容易地在WebAssembly中實現(xiàn)。
  • 尾調(diào)用(Tail calls)是一種在多種語言中被用到的設(shè)計模式。
  • 能返回多個值的函數(shù),如Python或C#中的元組(tuples,或稱數(shù)組)。
  • 符號擴展運算符(Sign-extension operators),一種實用的低級數(shù)學運算。LLVM能夠支持它。

調(diào)試和分析工具

如您所知,被轉(zhuǎn)譯的JavaScript存在著一個巨大問題:由于無法在轉(zhuǎn)譯代碼和源代碼之間建立關(guān)聯(lián),因此我們難以進行調(diào)試和分析。目前,WebAssembly正努力通過源地圖支持的方式,來解決此類問題。

原文鏈接:https://dzone.com/articles/what-is-webassembly

譯者介紹

陳峻 (Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項目實施經(jīng)驗,善于對內(nèi)外部資源與風險實施管控,專注傳播網(wǎng)絡(luò)與信息安全知識與經(jīng)驗;持續(xù)以博文、專題和譯文等形式,分享前沿技術(shù)與新知;經(jīng)常以線上、線下等方式,開展信息安全類培訓與授課。?

責任編輯:武曉燕 來源: 51CTO技術(shù)棧
相關(guān)推薦

2023-06-13 23:21:35

2017-03-23 14:37:19

WebAssemblyasm.js編程

2023-02-26 00:17:45

2023-05-05 17:20:04

2023-01-31 09:02:24

JSVMVR

2017-03-19 22:13:10

WebAssemblyJavaScript編程

2022-06-02 08:01:11

云原生工具

2022-10-28 16:57:18

DockerWasm

2023-12-10 16:48:00

Wasm瀏覽器

2021-03-20 22:46:22

IaaSSaaSPaaS

2017-03-19 20:41:57

WebAssemblyJavaScript編程

2017-03-19 22:43:12

WebAssemblyJavaScript編程

2022-05-28 12:33:17

谷歌項目經(jīng)理領(lǐng)導(dǎo)者

2023-09-01 13:49:00

內(nèi)存進程線程

2020-07-14 14:59:00

控制反轉(zhuǎn)依賴注入容器

2017-12-19 21:29:58

物聯(lián)網(wǎng)區(qū)塊鏈大數(shù)據(jù)

2023-03-27 13:25:18

WebAssembl語言Scheme

2021-06-11 09:00:00

語言WebWebAssembly

2022-05-16 10:25:03

Web內(nèi)部垃圾收集安全性

2023-12-12 07:30:54

IstioWasm前端
點贊
收藏

51CTO技術(shù)棧公眾號