前端未來的可能性
前言
之前看稀土开发者大会 2023
·前端未来
的演講,舉辦在在 2023 年 7 月
,其中有一段下午場,是小米的工程師彭耀宗講的,主題是:快應用框架在 IOT 場景中的落地。
影片在這邊,下午場
,大概 46:30
的時間點。
讓我驚豔的是,在硬體資源
的吃緊的 IOT 環境,他們如何一步一步的去達到,不放棄前端豐富的生態
還有開發效率
,並達到超過golang的效能
傳統 IOT 的局限性
主要有三點:
- 缺乏
安全性
跟隔離性
,只有內核態
,一個process
,應用
crash,系統
就直接 crash - 缺乏
模塊化
機制 - C 開發需要針對不同的
芯片
,配置不同的編譯器
、開發環境
等等,開發難度高
IOT 引進前端生態
優點
- 提供應用
容器
- 應用 crash 不會擊穿,影響到內核
wasm
已經是w3c
的標準
- 豐富的生態
npm package
是現在最豐富的,遠超其他套件系統,前端工程師也多
- 高效開發
- 用前端框架去開發,降維打擊
- 但是必須解決
穩定性
跟性能
問題
缺點
- 應用
卡頓
- 相較於 C,JS
效能
差了不只一個量級
- 相較於 C,JS
內存
佔用高- IOT 硬體沒什麼資源
內存泄露
嚴重
IOT 引進 wasm
優點
sandbox
- 處理
安全性
跟隔離性
- 處理
高性能
- 有近低階語言的
效能
- 優化空間更大
- 有近低階語言的
多語言
- wasm 支持多種語言
缺點
目前只支持
靜態語言
,對動態語言的支持力不足
- gc proposal 還在 phase 3,基本穩定,但是尚未被廣泛使用(
V8
已經支援)
- gc proposal 還在 phase 3,基本穩定,但是尚未被廣泛使用(
缺少
模塊機制
- 意味著只能作為
JS 生態的補充
,沒有辦法做自己的獨立生態
- 因為一次性的把所有模塊都加載進內存是很糟糕的事情
- 意味著只能作為
缺少通用的
異常處理
機制- 沒有 try catch
- 只能 runtime 自己去實現 try catch
開發工具
不完善- 沒有內存分析工具
- 沒有性能分析工具
wasm 在前端的現況
wasm 技術棧缺少一個高效
的前端開發語言
,這極大的限制他在前端領域
的應用
- C/C++/Rust -
高性能
,開發效率低
,很難融入前端現有生態
(npm package
) - javascript/golang - 需要
套娃
,嵌入整個runtime
,效能降低
ts 引入 wasm 生態
使用其他語言寫 wasm,都不是真正意義上的前端,都有種割裂感
將 ts 引入 wasm 生態,把前端技術帶回前端
使用 ts 的優點
- 對接前端現有
生態
- 可以使用龐大的
npm package
生態,而且前端工程師
很多
- 可以使用龐大的
- 直接編譯到
wasm
- 將 ts 的
靜態類型
轉譯到wasm
,利用 wasm 的AOT
提速
- 將 ts 的
- 兼顧
開發
跟運行效率
- 開發者喜歡動態語言,IOT 需要運行效率,TS 就是一個平衡
WAMR 跟 ts2wasm
WAMR
wasm-micro-runtime
縮寫intel
開源,用c
寫的,給類IOT
用的wasm runtime
ts2wasm
intel
發起,小米
聯合開發,將ts
編譯為wasm
在WAMR
上運行- 還沒 open source
ts2wasm 如何優化效能
JS 是動態語言
,為了開發的靈活性,他犧牲掉了一些效能
,底層會幫你做一些類型判斷
跟類型轉換
,有個術語叫Coercion
,在 ECMAScript
規格書上都會有轉換的規則。
現有前端生態的 ts 只做類型檢查
,底層還是用 JS 的 runtime,並沒有辦法把靜態類型
,帶到runtime
,去做更多
的JIT
、AOT
的優化。
ts2wasm
就是另外一個編譯 ts 的runtime
,像其他強型別語言一樣,有類型
資訊做系統優化,編譯後的 code 直接是 wasm(bytecode),性能非常好。
因為場景的需求跟性能要求,ts2wasm
也屏棄掉 JS 某些功能。
小結
前端其實很依賴平台
,所有的能力都是平台賦予的。
在瀏覽器,就被瀏覽器的 JS runtime 限制住,這有好有壞。
而 ts2wasm
幫 javascript 開了一個想像力很大的門。
讓我想到 stack overflow 的 creator 講的 Atwood's law
:
Any application that can be written in JavaScript, will eventually be written in JavaScript