跳至內容

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、CSSJavaScript構建,虛擬機作為純JavaScript庫可在瀏覽器、Node.js及桌面端等多種環境中運行[5]

架構設計

核心組件

Scratch虛擬機的架構圍繞兩個關鍵類構建:VirtualMachineRuntimeVirtualMachine類位於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]

參考文獻