很多人第一個會先想到,WebAssembly(WASM,一種可由不同執行環境載入的二進位格式)可以讓程式在瀏覽器執行。但要理解 pwasm 0.2a0,得先問一個更前面的問題:它本身在哪裡執行?pwasm 是以純 Python 寫成的 WASM runtime(執行模組的程式環境),由 Python 程式載入並執行 WASM 模組;它不是瀏覽器內建的 WebAssembly 功能,也不能因此推論它已能直接放進網頁執行。

這個差異會改變採用方式。若 AI 工具要執行模型生成的程式,pwasm 可能成為 Python 工作流裡的一種受限執行元件;若目標是在瀏覽器裡執行 Python 寫成的 pwasm,還要加入能讓 Python 在瀏覽器運作的環境與整合層。兩種部署位置的權限、效能與故障處理都不同,不能只看「用了 WASM」就當作安全或已經適合上線。

一、談 pwasm 前,先分清楚程式在哪裡執行

pwasm 是由 Python 執行的 WebAssembly runtime,不等同瀏覽器原生的 WASM 引擎。 要在瀏覽器使用 Python 寫成的 pwasm,仍需另外部署 Python 執行環境和瀏覽器整合程式。

同一個 .wasm 模組可能在不同 host(宿主環境)執行。第一種是瀏覽器的原生 WASM 引擎,由瀏覽器載入模組;第二種是 Python 程式透過 pwasm 載入模組;第三種則是在瀏覽器放入 Pyodide 等 Python runtime(執行環境),再由其中的 Python 呼叫 pwasm。第三種不是 pwasm 自己變成瀏覽器功能,而是多了一層 Python 在瀏覽器中的執行環境。

這三種組合的資料流與可用介面不同。瀏覽器原生引擎受到瀏覽器 API、同源政策與頁面權限管理;Python 端的 pwasm 則看 Python 程式提供哪些 imports(匯入介面),例如函式、記憶體或其他模組。若把 pwasm 包在瀏覽器端的 Python runtime 裡,還得檢查那個 runtime 如何取得網路、儲存空間與使用者資料。部署圖上先標出每段程式在哪裡跑,才能知道實際的信任邊界在哪裡。

這一層差異也會影響使用者資料經過哪些元件。瀏覽器原生 WASM 常與 JavaScript 應用程式互動,Python 端的 pwasm 則常由伺服器上的 Python 程式呼叫;若把 Python runtime 搬到瀏覽器,套件、輸入資料和輸出結果都要經過新的載入與傳遞流程。資料是否離開裝置,不由「用了 WebAssembly」這幾個字決定,而要看頁面程式、host API 和後端服務實際如何連接。架構圖應標明資料流向、儲存位置與呼叫對象,否則很容易把程式隔離誤讀成資料完全留在本機。

二、pwasm 0.2a0 增加了哪些可用能力

依作者發布說明與專案文件,pwasm 是純 Python 的 WASM 引擎,能載入並執行模組,並附帶 MicroPython、QuickJS 和 Micro QuickJS 的 WASM 組建。 文件列出的支援和效能資料屬專案自述,不能當成獨立驗證。

Simon Willison 在 2026 年 10 月 1 日發布 pwasm 0.2a0 時表示,這是他一月以 AI 輔助方式建立、之後一度擱置的實驗專案;他讓 Claude 檢視程式並進行一系列改進。作者指出,這個版本已能處理幾乎整份 WebAssembly 規格,套件也包含 MicroPython、QuickJS 和 Micro QuickJS 的 WASM 版本。這些是發布者對該版本的描述,實際相容性仍要對照專案當下程式碼、測試和所需模組。

「我完全不會信任這個東西。」這是 Simon Willison 對 pwasm 的提醒,並說明專案因此標示為 alpha(早期測試階段)。

專案文件目前列出 WebAssembly 2.0 核心指令,並註明不支援 SIMD(單指令多資料運算);文件也提到執行 fuel(燃料計數,用於限制運算量)、記憶體上限與逾時,以及一部分 WASI(WASM 系統介面)功能。WASI 文件列出的輕量實作包含標準輸入輸出、時鐘與隨機數,但不提供檔案系統;文件中的 MicroPython 和 JavaScript 沙箱也說明不提供檔案或網路存取。這些描述應逐項對照實際使用的 pwasm 版本與設定,不能擴大成任何 WASM 程式都自動沒有外部存取能力。

專案 README 的 benchmark(基準測試)列有 Python 版本、啟動與迴圈測試等數據,也說明每次函式呼叫都會經過 Python。它們可作為挑選測試案例的線索,不能直接代表你的工作負載表現。純 Python 的實作容易整合進 Python 程式碼,但也可能比含原生擴充的 runtime 慢;是否可接受,要在相同輸入、資源設定與執行環境中比較。

alpha 標記則提醒使用者,功能完整度、介面穩定性與錯誤處理仍可能變動。引用文件時要綁定版本,更新套件後重新跑相容性和安全測試,並確認依賴套件與編譯進去的 MicroPython、QuickJS 版本如何維護。開源授權可從 repository 的授權檔確認;把程式碼公開不會自動替部署者完成風險評估,也不代表每種用途都已有支援承諾。若產品依賴某個 WASM 指令、直譯器行為或逾時保證,應先確認該版本確實提供並能重現。

三、AI 程式工作流為什麼會需要受限執行環境

模型產生的程式不應直接取得執行服務的全部權限;沙箱可用來限制程式可用資源與 host 提供的功能。 pwasm 是程式執行工具,不是 AI 模型或會自行推論的 agent。

例如,AI 工具收到使用者要求後產生一段 Python 或 JavaScript,服務可以把程式交給受限的解譯器處理,將結果回傳給模型或使用者。這段流程包含模型推論、程式碼生成、執行環境和結果檢查,是幾個不同環節。pwasm 承擔其中可能的 WASM 執行部分;它不會負責判斷模型回答是否正確,也不會自動管理整個 agent 的工具權限。

安全界線取決於模組能呼叫什麼。WASM 模組須透過 host 提供的 imports 取得外部能力;若 host 傳入可讀取資料或呼叫網路的函式,模組便可能透過這些介面使用它們。反過來說,不提供檔案、網路或敏感資料的介面,能縮小程式可觸及的範圍。對 AI 工作流而言,應把需要的資料轉成最小輸入,只回傳必要結果,並避免把金鑰、環境變數或其他任務的資料暴露給 guest(受執行模組)。

程式服務將不可信程式送入 WASM guest,host 僅提供一個 JSON 查詢介面,並分別管控檔案、網路、機密資料與運算資源
guest 能做什麼,由 host 提供的介面與資源限制共同決定。

資源限制也要分開理解。fuel 可限制執行步數或特定計算單位,記憶體上限限制 WASM 記憶體成長,逾時則以牆鐘時間停止執行。專案文件稱 fuel 會按函式呼叫與迴圈次數扣除;這不等於 CPU 使用量、背景子程序或外部 host 函式時間都必然受到同一機制完整約束。整合者須實際確認逾時如何中止呼叫、上限是否作用於所有路徑,以及大量併發時的整體資源消耗。

四、採用 pwasm 前要檢查效能、整合與安全邊界

先查版本成熟度,再用實際工作負載量測效能、檢查 imports 權限,並測試超時或陷阱發生後的復原方式。 WASM 的記憶體隔離不能替代完整的威脅模型與系統安全設計。

執行方式執行位置需要確認的條件
瀏覽器原生 WASM瀏覽器引擎瀏覽器支援、頁面權限、同源政策與模組介面
Python + pwasmPython 程式所在環境imports、檔案與網路存取、資源上限、Python runtime 成本
瀏覽器 Python + pwasm瀏覽器中的 Python runtimePython runtime 相容性、下載量、啟動時間、瀏覽器 API 與兩層資源限制

效能測試應涵蓋冷啟動、重複呼叫、長迴圈、記憶體成長和接近逾時的程式。若工作包含大量數值運算、即時回應或高併發,應把 pwasm 和目標環境中的替代 runtime 放在相同測試條件下比較。作者公布的數值可供選擇測試方向,不能代替自己的測量。若功能正確但延遲超標,仍未達到工作流要求。

部署在瀏覽器時,整合成本不只在載入 .wasm。以 Python 寫成的 runtime 需要 Python 執行環境,可能影響下載體積、記憶體使用和啟動時間,也要驗證瀏覽器支援、封裝方式及前端與執行環境之間的資料傳遞。若實際需求只是瀏覽器中的 WASM 模組,應先比較直接使用瀏覽器原生引擎的方案;只有在必須以 Python 控制 WASM、或需要 pwasm 所附的語言直譯器時,才把額外一層納入評估。

WebAssembly.org 的安全說明指出,模組在與 host runtime 隔離的沙箱環境中執行,但模組仍受其嵌入環境的安全政策約束。換言之,隔離能力和 host 授權設計必須一起檢視。

WebAssembly 的結構化控制流程、線性記憶體界線和執行陷阱,能降低某些越界或直接控制流程攻擊風險;但安全文件也指出仍有其他錯誤類型,且模組可用哪些外部能力要看嵌入環境提供的 API。Python runtime 自己也需要安全維護。因此,沙箱只能視為整體防護中的一層,還需配合程序隔離、權限最小化、輸入驗證、日誌與更新管理。

還要把「guest 不能直接碰到檔案系統」與「整個服務不會洩漏資料」分開。若 host 提供查詢函式,而函式沒有檢查呼叫者身分或資料範圍,guest 即使碰不到磁碟,也可能經由這個介面取得不該看到的結果。類似地,允許呼叫外部 API 的 import 可能帶來請求偽造、資料外傳或費用消耗風險。對不可信程式而言,程式來源只是風險的一部分,host 授權邏輯、輸入內容、資料敏感度和失敗後的副作用都需要一併盤點。

遇到 fuel 用盡、逾時或 WASM trap(執行陷阱)時,系統也要決定如何處置部分輸出、是否重試,以及是否保留或丟棄該執行個體。pwasm 文件提醒,硬性上限中止 guest 後,其內部狀態可能不一致,較安全的選擇是丟棄並重新建立。呼叫端應把中止視為明確失敗狀態,避免將不完整輸出當成成功結果。

五、用小型驗證決定是否納入工作流

先寫清楚執行位置、程式可用權限和成功條件,再以不含敏感資料的代表性程式驗證資源、相容性及失敗處理。 無法量測或隔離的用途,先限制在原型測試。

先定義威脅模型(列出可能的攻擊者、可受影響資產與風險路徑):程式由誰提供,輸入是否可信,執行結果會改變什麼資料,失敗會影響哪些服務?接著列出 host 要提供的 imports,逐項確認是否真的需要讀檔、連網、讀取環境變數或呼叫其他工具。預設不授權,只有明確需求才加入介面,並限制每個介面可讀寫的資料範圍。

  1. 選定執行位置與版本,記錄 Python、pwasm、瀏覽器或伺服器環境。
  2. 準備不含敏感資料的正常、邊界及惡意輸入案例,設定 fuel、記憶體和時間上限。
  3. 檢查 guest 可呼叫的 imports,測試檔案、網路和機密資料不可被未授權讀取。
  4. 記錄正確率、啟動和執行時間、資源消耗,並和替代 runtime 比較。
  5. 人為觸發逾時、fuel 耗盡、格式錯誤和執行陷阱,確認輸出、日誌、重試與清除狀態符合預期。

評估結果應涵蓋程式正確性,也要看延遲、併發資源、異常恢復、更新責任和維護狀況。pwasm 目前標示 alpha,正式採用前應依實際版本檢查安全公告、相容性、授權和維護情形。若對安全邊界或效能仍無法提出可重現的證據,將用途留在受控原型,並限制資料敏感度與外部權限。

成功條件應在測試前先訂好,例如輸出須符合哪些格式、可接受的延遲是多少、單次工作可消耗多少記憶體,以及逾時是否允許重試。測試紀錄要能對應程式版本、設定、輸入案例與執行環境;否則一次成功只能代表當時那個案例,無法支撐更廣泛的安全或相容性結論。當測試發現 guest 能透過某個 import 觸及超出預期的資料,先縮小介面權限,再重跑案例,而非只增加提示詞要求模型不要越權。

  • pwasm 是 Python WebAssembly runtime,與瀏覽器原生 WASM 執行環境不同。
  • 沙箱的實際邊界由 host imports、資料範圍與資源限制共同決定。
  • pwasm 標示 alpha,正式使用前應以目標工作負載驗證效能、相容性和故障恢復。
驗證流程依序呈現威脅模型與部署位置、測試輸入、資源限制、匯入介面檢查、故障復原及採用決策
先用可重現的測試確認權限、資源與故障處理,再決定是否擴大採用。

六、常見問題

目前不能只依版本功能描述就判定適合正式環境。 它的定位、整合條件和資源限制需依實際 host、工作負載與採用版本驗證。

常見問題

Q1:pwasm 0.2a0 是瀏覽器內建的 WebAssembly 功能嗎?

不是。它是以 Python 撰寫的 WebAssembly runtime。若要在瀏覽器端使用,還要準備能在瀏覽器執行 Python 的環境和整合層;若只需要瀏覽器執行 WASM,應另外評估瀏覽器原生引擎。

Q2:pwasm 能直接執行 AI 模型嗎?

本文談的是執行 WASM 模組與打包在 WASM 中的語言直譯器,不代表 pwasm 本身是 AI 模型或推論引擎。AI 工具可以在架構上把它用作執行程式碼的其中一環,但模型推論和工具權限仍由其他元件負責。

Q3:alpha 階段適合執行不可信任的程式碼嗎?

專案提供資源限制與沙箱介面,不等同已獲獨立安全驗證。先確認 host imports、檔案與網路能力、fuel、記憶體和逾時設定,並用無敏感資料的測試案例確認中止後狀態;正式使用前也要評估版本維護和整體隔離措施。