從瞬時運行的Web應(yīng)用程序到瀏覽器中的Python語言来破,一些熱門的編程語言和編譯器項目為WebAssembly的承諾提供多種選擇碳竟。
如今的Web應(yīng)用程序的運行速度和響應(yīng)速度遠不及桌面應(yīng)用程序磷雇,但如果能做到呢?這就是WebAssembly做出的承諾。
WebAssembly是一種低級的類匯編(assembly-like)語言,具有緊湊的二進制格式陕贮,可以在Web瀏覽器中以接近桌面設(shè)備的性能運行。與此同時潘飘,WebBaseMulk為C/C++飘蚯、C馍迄、RISE、GO局骤、Kotlin攀圈、SWIFT等編程語言提供了一個可移植的編譯目標。
WebAssembly被譽為一種既可以提高Web應(yīng)用程序性能峦甩,又允許在瀏覽器應(yīng)用程序開發(fā)中使用JavaScript以外的語言的方式赘来,它得到Google、Mozilla凯傲、Apple和Microsoft瀏覽器的支持犬辰,所有這些瀏覽器都在其引擎中支持該技術(shù)。
WebAssembly促進了一系列新技術(shù)的開發(fā)冰单,其中包括利用其強大功能的全新編程語言幌缝。以下是致力為WebAssembly支持的10個語言項目。
1.Binaryen
Binaryen是一個用于WebAssembly的編譯器工具鏈基礎(chǔ)設(shè)施庫诫欠。Binaryen采用C++編寫涵卵,旨在使編譯到WebAssembly變得更加容易、高效和快速荒叼。它在單個標頭中有一個C API轿偎,并且可以從JavaScript中使用。輸入以類似 WebAssembly的形式被接受被廓,但一般控制圖也被一些編譯器接受坏晦。
Binaryen的內(nèi)部IR使用緊湊的數(shù)據(jù)結(jié)構(gòu),并利用所有 CPU 內(nèi)核進行并行代碼生成和優(yōu)化嫁乘。IR也很容易編譯到WebAssembly昆婿,因為它本質(zhì)上是WebAssembly的一個子集。特定于 WebAssembly的優(yōu)化提高了代碼大小和速度蜓斧,使Binaryen可以單獨用作編譯器后端仓蛆。
2.Blazor WebAssembly
Blazor WebAssembly是一個框架,用于使用.NET構(gòu)建交互式法精、客戶端的單頁Web應(yīng)用程序多律,并將這些應(yīng)用程序托管在基于WebAssembly的.NET 運行時的瀏覽器中(包括移動設(shè)備瀏覽器)。不需要插件或?qū)⒋a重新編譯成其他語言搂蜓。在運行時使.NET代碼能夠通過 WebAssembly的JavaScript API訪問瀏覽器功能狼荞。
當(dāng)Blazor WebAssembly應(yīng)用程序在瀏覽器中運行時,C#代碼文件和Razor文件將編譯為.NET程序集帮碰,這些程序集將隨著.NET運行時一起下載到瀏覽器相味。而且,由于.NET代碼是在瀏覽器的JavaScript沙盒中的WebAssembly上執(zhí)行的殉挽,所以它會受到保護丰涉,因此可以防止客戶端計算機上的惡意操作拓巧。Blazor WebAssembly應(yīng)用程序可以獨立部署,也可以在服務(wù)器端支持下部署一死。
3.Cheerp
Leaning科技公司開發(fā)的Cheerp被定位為用于Web的企業(yè)級C/C++ 編譯器肛度,將C、C++投慈、甚至C++ 17編譯成 WebAssembly承耿、JavaScript 或兩者的組合。Cheerp可以集成到 LLVM/Clang基礎(chǔ)設(shè)施中伪煤,通過自定義優(yōu)化來提高性能并最小化編譯輸出的大小加袋。Cheerp主要用于將現(xiàn)有的C/C++庫和應(yīng)用程序移植到HTML5,也可用于編寫Web應(yīng)用程序和WebAssembly組件抱既。Cheerp是在開源和商業(yè)許可下提供的职烧。
4.CheerpJ
這款基于LLVM的編譯器被譽為“Web的Java編譯器”,可將任何Java客戶端應(yīng)用程序轉(zhuǎn)換為WebAssembly防泵、JavaScript和HTML蚀之,從而使Java客戶端應(yīng)用程序能夠在各個瀏覽器中運行。CheerpJ利用三個組件:AOT(提前)編譯器择克、WebAssembly和JavaScript DOM互操作性API恬总,以從Java訪問DOM前普。使用CheerpJ肚邢,可以使用AOT 編譯器編譯JAR檔案。CheerpJ 不需要任何服務(wù)器端支持拭卿。
和Cheerp一樣骡湖,CheerpJ也是Leaning科技公司開發(fā)的。
5.Emscripten
Emscripten這個開源編譯器工具鏈將C和C++或任何其他使用LLVM編譯器技術(shù)的語言編譯成WebAssembly峻厚,以便部署在Web响蕴、Node.js或Wasm上。Emscripten 編譯器emcc也通過JavaScript為編譯后的代碼提供API支持惠桃。Emscripten已被用于將現(xiàn)實世界的代碼庫列表轉(zhuǎn)換為WebAssembly浦夷,其中包括商業(yè)代碼庫,例如Unreal Engine 4游戲引擎和Unity 3D 平臺辜王。Emscripten支持C和C++標準庫劈狐、C++和OpenGL/WebGL圖形命令荠商,用于安裝Emscripten 工具鏈(emcc讳苦、LLVM 等)的Emscripten SDK可以在Linux澎埠、MacOS和Windows等操作系統(tǒng)上使用承璃。
6.Forest
Forest 是一種可編譯為 WebAssembly的函數(shù)式編程語言妄壶。開發(fā)人員Nick Johnstone表示,F(xiàn)orest背后的目標是提供一種語言题山,使創(chuàng)建復(fù)雜胖替、交互式和功能性的Web應(yīng)用程序變得更容易,并且沒有這種方法的傳統(tǒng)開銷坟岔。
目前被描述為“pre-alpha谒兄、實驗性、概念研究軟件”社付,F(xiàn)orest具有靜態(tài)類型舵变、模式匹配、不可變數(shù)據(jù)結(jié)構(gòu)瘦穆、多種語法和自動代碼格式纪隙。開發(fā)中的第一個語法受到Elm和Haskell的啟發(fā)。
Forest語言的設(shè)計原則包括易于協(xié)作扛或、盡可能無痛的測試以及在結(jié)構(gòu)和語義上達成一致绵咱,同時在語法上達成一致。Johnstone 努力讓Forest足夠快來構(gòu)建復(fù)雜的游戲熙兔,這樣使用網(wǎng)絡(luò)應(yīng)用程序運行得非潮妫快。
7.Grain
開發(fā)該項目的網(wǎng)站聲稱住涉,Grain語言具有學(xué)術(shù)語言和功能語言的特性麸锉。通過Binaryen工具鏈和編譯器基礎(chǔ)設(shè)施編譯為WebAssembly,Grain可以在瀏覽器舆声、服務(wù)器和任何地方運行花沉。沒有運行時類型錯誤,也不需要類型注釋媳握。Grain工具鏈具有CLI碱屁、編譯器、標準庫蛾找,并作為單個二進制文件提供娩脾。開發(fā)人員將需要Node.js和Yarn從源代碼構(gòu)建Grain,并且二進制文件可用于Linux打毛、MacOS和Windows柿赊。
8.JWebAssembly
JWebAssembly由I-Net Software公司開發(fā),是一個 Java字節(jié)碼到WebAssembly編譯器幻枉,它以Java類文件為輸入碰声,生成WebAssembly二進制格式(.wasm文件)或文本格式(.wat文件)作為輸出。目標是使用WebAssembly在瀏覽器中本地運行展辞。在理論上奥邮,JWebAssembly可以編譯那些能夠編譯Java ava字節(jié)碼的語言,例如Clojure、Groovy洽腺、JRuby脚粟、Kotlin和Scala,這些語言都有待測試蘸朋。
JWebAssembly尚未準備好生產(chǎn)核无。盡管JWebAssembly 1.0版本所需的一切都已實現(xiàn),但測試仍有待完成藕坯。1.0版路線圖需要Java字節(jié)碼解析器团南、測試框架和Gradle插件等功能。 I-Net Software公司預(yù)計今年將發(fā)布JWebAssembly 1.0炼彪。
9.Pyodide
Pyodide項目最近從Mozilla遷移出來之后成為一個獨立項目吐根,將Python和Python科學(xué)堆棧編譯到WebAssembly,將Python 3.8辐马、NumPy拷橘、SciPy、Matplotlib喜爷、Scikit-learn 和其他數(shù)十個包引入瀏覽器冗疮。Pyodide提供JavaScript和Python之間對象的透明轉(zhuǎn)換,并允許Python 訪問Web API檩帐。Pyodide始于2018年术幔,是Iodide項目的一部分,用于在瀏覽器中進行數(shù)據(jù)科學(xué)湃密。用戶可以從瀏覽器中的REPL嘗試采用Pyodide诅挑。
10.TeaVM
作為Java字節(jié)碼的提前編譯器,TeaVM通過WebAssembly和JavaScript在瀏覽器中運行勾缭。但是揍障,需要注意 WebAssembly 支持目前處于試驗階段目养。與其近親GWT(Google Web Toolkit)一樣俩由,TeaVM允許開發(fā)人員采用Java編寫應(yīng)用程序,并將它們部署為JavaScript癌蚁。與GWT不同幻梯,TeaVM使用編譯后的類文件,而不是源代碼努释。此外碘梢,TeaVM依賴于現(xiàn)有的編譯器,例如javac伐蒂、kotlinc和scalac煞躬,因此可以編譯Kotlin和Scala代碼以及Java。TeaVM主要是一個Web開發(fā)工具,但它不是為在Java或Kotlin中使用大型代碼庫并生成JavaScript而設(shè)計的恩沛。TeaVM子項目Flavour可以作為編寫單頁Web應(yīng)用程序的框架在扰。