什麼是 WASI?為什麼需要它?
因為 wasm 只是一堆指令,實際上什麼都不能做
WASI 想使用 component model 來定義介面,具體來說是指 wasm interface types
但跨語言的型別很難很難
更不用說每個語言的物件編碼都不一樣
而且除開指標的型別必須有無循環的佈局,這樣才能攤開成 wasm 內建的型別來交換
就算做成一樣的東西也要處理跨越邊界的問題
wasm 的不同 instance 有獨立的記憶體
拿到另一個 wasm instance 的指標 be like
那全部移過來不好嗎?
那全部移過來不好嗎?
此外,目前 Resource 的 own/borrow 也有問題
前面的規則在同步程式下大致上沒有問題,在非同步程式下則有特別多問題
x
可能還沒歸還,所有方就結束並回收 x
了
借出去的同時移動
借用方進入無限迴圈(在同步程式下一樣有問題)
由於 component model 不提供靜態檢查的機制,所以上述違反規則的程式都會陷入 trap 狀態,runtime 要提供錯誤回報
但這些錯誤相當難追蹤跟溯源,所以我本來提案了一個簡單的靜態檢查機制
規則一、移動在非同步語境下被檢查器排到最前面先操作
舉例來說,對上面的程式檢查器會先套用 g
對 context 中 x
的影響,才套用 f
的,因此會顯示試圖借用已移動的資源的錯誤訊息
規則二、需等待非同步的借出歸還才能退出
但因為有可能借用方只是要用一下就要進入無限迴圈,這樣的程式應該也要被接受,所以也可以引入一個新操作 payback
表示借用終止
借出方只需要等待此操作發出的非同步訊號即可,為此也需要一個新操作來描述這種行為
靜態檢查就需要跟蹤某種 source code,但是是哪個 source code 呢?C++, Rust 等編寫語言?還是 wasm 這個目標語言?
另外非同步機制 stack switching 還在 phase 1
所以最後決定今年暫時移除 own/borrow 型別
後續要考慮的問題:移動整個 resource 不好,那我們可以需要用的時候再移動該部分嗎?
可能的方案
interface description language(IDL):
wasm interface types
簡單的想法:每個 wasm instance 都配備一個 .wit
檔案
實際上 component model 複雜得多
component model 的模組化
案例
問題:effect polymorphism
Odersky 2021 Scoped Capabilities for Polymorphic Effects
def foo(using CanThrow[E], x : A) : B
def map(l : List[A], f : A => B) : List[B]
catch {
[...].map(foo)
} (err : E) => ...
https://arxiv.org/abs/2207.03402
基於上面的 polymorphic 解法,我們區分
可消除案例:CanThrow[E]
catch
中可以擲出 E
不可消除案例:Console
:x:
effect 之間有偏序關係,例如
State -> Reader
State -> Writer
IO -> FileSystem -> ReadOnlyFS
整體
End