WebAssembly 是什么曙求?
2019 年 12 月,W3C 標(biāo)準(zhǔn)批準(zhǔn)了第四種官方語(yǔ)言:WebAssembly (Wasm)映企。這種語(yǔ)言在結(jié)構(gòu)悟狱、使用和功能方面與以前的語(yǔ)言有很大不同。
WebAssembly 是一種新的編碼方式堰氓,可以在現(xiàn)代的Web瀏覽器中運(yùn)行 - 它是一種低級(jí)的類匯編語(yǔ)言挤渐,具有緊湊的二進(jìn)制格式,可以接近原生的性能運(yùn)行双絮,并為諸如 C / C ++等語(yǔ)言提供一個(gè)編譯目標(biāo)浴麻,以便它們可以在 Web 上運(yùn)行。它也被設(shè)計(jì)為可以與 JavaScript 共存囤攀,允許兩者一起工作软免。
對(duì)于Web平臺(tái)而言,WebAssembly 具有巨大的意義——它提供了一條途徑焚挠,以使得以各種語(yǔ)言編寫的代碼都可以以接近原生的速度在 Web 中運(yùn)行膏萧。在這種情況下,以前無(wú)法以此方式運(yùn)行的客戶端軟件都將可以運(yùn)行在 Web 中蝌衔。
WebAssembly 被設(shè)計(jì)為可以和 JavaScript 一起協(xié)同工作——通過(guò)使用 WebAssembly 的 JavaScript API榛泛,你可以把 WebAssembly 模塊加載到一個(gè) JavaScript 應(yīng)用中并且在兩者之間共享功能。這允許你在同一個(gè)應(yīng)用中利用 WebAssembly 的性能和威力以及 JavaScript 的表達(dá)力和靈活性噩斟。
什么時(shí)候使用WebAssembly曹锨?
開發(fā)人員可能希望在兩種一般情況下使用 Wasm。一種是作為想要編寫性能更高的代碼的 Web 開發(fā)人員剃允。另一種是作為軟件開發(fā)人員沛简,希望將現(xiàn)有技能與其他編程語(yǔ)言(如 C++ 或 Rust)結(jié)合使用來(lái)構(gòu)建在 Web 上運(yùn)行并通過(guò) Web 瀏覽器訪問(wèn)用戶的軟件,而無(wú)需額外的步驟(例如下載和安裝程序)斥废。 雖然開發(fā)人員在第一種情況下仍需要使用 JavaScript椒楣,但他們也可以使用 Wasm 將需要接近原生速度的部分生成為模塊并使用 JS 加載它們。這是因?yàn)?JS 和 WebAssembly 模塊之間雙向通信的能力使應(yīng)用程序能夠利用 WebAssembly 的出色性能营袜。
開發(fā)人員可以繼續(xù)使用 React 等流行的
UI 庫(kù)來(lái)構(gòu)建 Web 應(yīng)用程序的 UI,并間接使用 Wasm 來(lái)實(shí)現(xiàn)高性能的內(nèi)部邏輯丑罪。Figma 等流行的應(yīng)用程序通過(guò)使用 React 和 C++ 采用了這種技術(shù)荚板。 對(duì)于第二種情況凤壁,開發(fā)人員可以使用 Rust、C++ 或 C# 等語(yǔ)言與 Blazor 一起編寫 Web 應(yīng)用程序跪另∨《叮或者甚至用 C# 設(shè)計(jì)一個(gè)游戲并輕松將其編譯為 Wasm,然后通過(guò)網(wǎng)絡(luò)將其提供給消費(fèi)者免绿。
簡(jiǎn)而言之唧席,開發(fā)人員可以通過(guò)以下方式使用 Wasm:
除了 JS,開發(fā)者還可以在 Wasm 中編寫高性能的關(guān)鍵性代碼嘲驾,并用 JS 導(dǎo)入淌哟。
開發(fā)人員可以使用 Wasm 作為編譯目標(biāo),編寫使其他編程語(yǔ)言能夠在 Web 上運(yùn)行的代碼辽故。
OpenIM通過(guò)WebAssembly解決了什么問(wèn)題徒仓?
OpenIM是由IM技術(shù)專家打造的開源的即時(shí)通訊組件。OpenIM包括IM服務(wù)端和客戶端SDK誊垢,實(shí)現(xiàn)了高性能掉弛、輕量級(jí)、易擴(kuò)展等重要特性喂走。開發(fā)者通過(guò)集成OpenIM組件殃饿,并私有化部署服務(wù)端,可以將即時(shí)通訊芋肠、實(shí)時(shí)網(wǎng)絡(luò)能力快速集成到自身應(yīng)用中乎芳,并確保業(yè)務(wù)數(shù)據(jù)的安全性和私密性。
目前github 11k star业栅,上萬(wàn)開發(fā)者秒咐,廣泛應(yīng)用在政務(wù)協(xié)同辦公,社交等領(lǐng)域碘裕。重點(diǎn)有如下特色
(1)開源:核心代碼開源携取,數(shù)據(jù)自我掌控,打造全球領(lǐng)先的IM開源社區(qū)帮孔,括客戶端SDK和服務(wù)端雷滋,打造全球領(lǐng)先的IM開源社區(qū)。
(2)易擴(kuò)展:服務(wù)端采用golang實(shí)現(xiàn)文兢,首創(chuàng)“一切皆消息”的通訊模型晤斩,輕松實(shí)現(xiàn)自定義消息和擴(kuò)展功能。
(3)高性能:支持集群分層治理架構(gòu)姆坚,經(jīng)受過(guò)海量用戶檢驗(yàn)澳泵,抽象在線消息、離線消息兼呵、歷史消息存儲(chǔ)模型兔辅。
(4)全平臺(tái)支持:iOS腊敲、Android原生;Flutter维苔、uni-app碰辅、ReactNative跨端;React介时、Vue等所有主流web前端框架没宾;小程序;PC支持Electron沸柔。
我們的客戶端SDK底層庫(kù)openim-sdk-core是通過(guò)Go語(yǔ)言編寫循衰,并通過(guò)Gomobile工具打包為AAR和Framework庫(kù)輕松集成到Android和iOS兩端,并且擴(kuò)展支持了部分主流跨平臺(tái)開發(fā)框架如:Flutter 勉失、ReactNative羹蚣、Uniapp等。
現(xiàn)在我們借助WebAssembly技術(shù)將openim-sdk-core再次移植到了Web平臺(tái)乱凿,底層復(fù)用一套代碼顽素,降低了SDK的維護(hù)成本,同時(shí)充分發(fā)揮wasm的特性徒蟆。幫助開發(fā)者可以更加快速胁出、穩(wěn)定的將即時(shí)通訊、實(shí)時(shí)網(wǎng)絡(luò)能力集成到自身應(yīng)用中段审。
同時(shí)全蝶,我們還借助sql.js(同樣使用emscripten將SQLite編譯為 webassembly)和IndexedDB在Web環(huán)境中增加了消息本地存儲(chǔ)能力,這使得SDK整體使用更加高效寺枉。當(dāng)前大多數(shù)IM的JSSDK都是直接通過(guò)API每次到服務(wù)器拉取大量數(shù)據(jù)抑淫,給服務(wù)器帶來(lái)巨大壓力的同時(shí)也讓用戶可能獲得不太好的體驗(yàn),如弱網(wǎng)環(huán)境下獲取聊天記錄的漫長(zhǎng)等待姥闪。但在open-im-sdk-wasm中始苇,因?yàn)橄⒂涗浂急粌?chǔ)存在了IndexedDB中,使得用戶可以穩(wěn)定達(dá)到100~200ms內(nèi)拉取記錄的絲滑體驗(yàn)筐喳。
github地址:
https://github.com/OpenIMSDK/
官網(wǎng):https://www.rentsoft.cn/
WebAssembly的未來(lái)
WebAssembly 是作為客戶端技術(shù)發(fā)明的催式,但它也被證明在服務(wù)器端非常有用。 服務(wù)器端 WebAssembly 在現(xiàn)代 Web 和服務(wù)端應(yīng)用程序中都存在至關(guān)重要的優(yōu)勢(shì)避归。
高性能荣月。WebAssembly 實(shí)現(xiàn)了接近原生的性能。與 Java梳毙、Python 或 JavaScript 運(yùn)行時(shí)相比哺窄,它可以快 10 倍到 100 倍(這怎么可能?)。它也比 Docker 快得多萌业,尤其是在冷啟動(dòng)和系統(tǒng)訪問(wèn)方面蔑担。
安全。WebAssembly 是一個(gè)具有基于能力的安全模型的沙箱咽白。它不僅比原生二進(jìn)制文件更安全,而且比 Docker 這樣的操作系統(tǒng)級(jí)容器更安全鸟缕。然而晶框,它提供了對(duì)底層系統(tǒng)的訪問(wèn),包括新的硬件功能懂从。
可移植授段。WebAssembly 應(yīng)用程序可以用 C、C++番甩、Rust侵贵、Go 編寫,并且無(wú)需更改即可在不同的操作系統(tǒng)和硬件平臺(tái)上運(yùn)行缘薛。
易于管理窍育。WebAssembly 程序可以由其他應(yīng)用程序配置、啟動(dòng)宴胧、熱交換漱抓、停止和移動(dòng)。
WASI是一種將 WebAssembly 跑在任何系統(tǒng)上的標(biāo)準(zhǔn)化系統(tǒng)接口恕齐,當(dāng) WebAssembly 的性能逐漸增強(qiáng)時(shí)乞娄,WASI 可以提供一種可行的方式,在任意平臺(tái)上運(yùn)行任意的代碼显歧,就像 Docker 所做的一樣仪或,但是不需要受限于操作系統(tǒng)。正如 Docker 的創(chuàng)始人所說(shuō):
“ 如果 WASM 和 WASI 早在 2008 年就存在士骤,那么我們就不需要?jiǎng)?chuàng)建 Docker范删。可見 Wasm 是多么重要敦间。服務(wù)器上的 WebAssembly 將會(huì)是“計(jì)算”的未來(lái)模式瓶逃。而現(xiàn)在的問(wèn)題是缺少標(biāo)準(zhǔn)化的系統(tǒng)接口。希望 WASI 能夠勝任這項(xiàng)工作廓块!“
Wasm 雖然起源于 Web厢绝,但如今,它已經(jīng)不止于 Web带猴。那就讓我們來(lái)一起期待 Wasm 帶來(lái)的昔汉,那個(gè)擁有無(wú)限可能的世界吧!