Scratch-VM
Scratch虛擬機(英文:Scratch Virtual Machine,簡稱Scratch VM或scratch-vm)是Scratch 3.0的核心執行引擎與運行時庫,由麻省理工學院媒體實驗室(MIT Media Lab)終身幼兒園組(Lifelong Kindergarten Group)開發,現由Scratch基金會(Scratch Foundation)維護[1]。該庫以JavaScript實現,負責將用戶通過拖拽積木構建的圖形化程序解析為抽象語法樹(AST),並管理程序狀態的表示、運行與維護[2]。作為Scratch 3.0技術架構的中間層,Scratch虛擬機向上與Scratch Blocks對接以接收積木變更事件,向下調用Scratch Render等模塊完成舞台渲染,同時通過擴展系統支持硬件與第三方服務的接入[3]。
| Scratch虛擬機 | |
|---|---|
| 中文名 | Scratch虛擬機 |
| 英文名 | Scratch Virtual Machine |
| 縮寫 | Scratch VM / scratch-vm |
| 開發者 | MIT Media Lab 終身幼兒園組 |
| 維護者 | Scratch Foundation |
| 初始發布 | 2016年 |
| 編程語言 | JavaScript |
| 運行環境 | 瀏覽器、Node.js、桌面端 |
| 許可證 | BSD-3-Clause |
| 代碼倉庫 | scratch-editor(mono-repo) |
| 上游模塊 | scratch-blocks |
| 下游模塊 | scratch-render、scratch-audio |
概述
Scratch虛擬機是Scratch 3.0生態系統的底層引擎,其核心職責包括項目文件的加載與序列化、積木邏輯的解析與執行、多角色(Sprite)並發線程的調度,以及擴展功能的管理[4]。與Scratch 2.0基於Adobe Flash的架構不同,Scratch 3.0完全基於HTML5、CSS與JavaScript構建,虛擬機作為純JavaScript庫可在瀏覽器、Node.js及桌面端等多種環境中運行[5]。
架構設計
核心組件
Scratch虛擬機的架構圍繞兩個關鍵類構建:VirtualMachine與Runtime。VirtualMachine類位於src/virtual-machine.js,作為外部交互的主要接口,負責協調舞台、積木與擴展之間的連接;其內部包含一個runtime實例,來自src/engine/runtime.js,是實際管理程序執行的核心引擎[6]。Runtime存儲所有關鍵運行時數據,包括目標對象(角色與舞台)、積木定義與執行邏輯、I/O設備狀態(鍵盤、鼠標、視頻等)以及線程調度隊列。
抽象語法樹
虛擬機通過blockListener監聽scratch-blocks工作區發出的事件,據此構建並維護抽象語法樹(AST)[7]。每個可執行目標(如角色)均保有獨立的AST,可在運行時通過vm.runtime.targets[...].blocks查看其狀態。AST中的每個積木節點包含標識符、操作碼(opcode)、輸入參數、字段值及執行鏈接等完整信息,為後續線程執行提供結構化依據。
線程與執行模型
Scratch採用協作式多任務模型。Runtime維護一個線程隊列,每個線程對應一條積木腳本鏈。虛擬機通過周期性的"步進"(step)機制調度線程執行:在每個幀周期內,線程依次執行其積木鏈中的指令,直至遇到 yield 點(如等待、重繪請求)或腳本結束[8]。該設計保證了單線程JavaScript環境下的並發表現,同時避免了傳統搶占式調度帶來的複雜性。
功能特性
項目加載與序列化
虛擬機支持解析.sb2與.sb3格式的項目文件,加載其中包含的圖片、聲音等資源,並將角色渲染到舞台上[4]。同時,虛擬機可將當前項目狀態反向序列化,打包為.sb3文件以供導出或分享。
擴展系統
Scratch虛擬機通過src/extensions/目錄支持功能擴展。開發者可基於官方API創建自定義擴展,為Scratch添加新的積木分類與硬件支持[9]。內置擴展包括畫筆(Pen)、音樂(Music)、視頻感知(Video Sensing)以及Micro:bit、LEGO Mindstorms等硬件連接擴展[10]。
運行時監控
虛擬機內置Playground調試環境,開發者啟動開發服務器後可訪問本地端口查看項目性能實時監控、積木執行次數統計、內存使用跟蹤及幀速率分析等數據[11]。
開發與部署
倉庫遷移
2024年至2025年間,Scratch團隊將scratch-vm模塊遷移至新的單體倉庫(mono-repo)scratch-editor中,原獨立倉庫被歸檔並設為只讀[2]。新版本以@scratch/scratch-vm名稱發布於NPM registry。遷移旨在統一管理編輯器各包的依賴關係,降低跨模塊變更的維護成本,計劃於2025年內分四批完成全部遷移工作[12]。
使用方式
開發者可通過NPM直接安裝:npm install scratch-vm,或在瀏覽器中通過獨立構建版本引入。在Node.js環境中,通過require('scratch-vm')獲取VirtualMachine類,實例化後監聽積木變更事件並調用vm.start()啟動運行時[1]。
參考文獻
- ↑ 1.0 1.1 Scratch VM - GitHub
- ↑ 2.0 2.1 scratch-editor - GitHub
- ↑ Scratch3的結構 - 博客園
- ↑ 4.0 4.1 Scratch開發筆記 - Gitee
- ↑ Scratch 3.0 Released To Mixed Reaction - I Programmer
- ↑ 深度解析scratch-vm架構 - CSDN
- ↑ scratch-vm - MIT Media Lab
- ↑ scratch-vm - CodeClubLuxembourg
- ↑ scratch-vm擴展開發指南 - CSDN
- ↑ mbot_scratch_gui - GitHub
- ↑ Scratch核心引擎 - GitCode
- ↑ scratch-editor - GitHub