Tiny: A Concurrent Dynamic Language with Inline Go Extensions

Tiny 是一款使用 Go 編寫的高性能、並行程式語言與運行時系統。它結合了動態編碼的靈活性與多執行緒運行時引擎,並利用基於堆疊的位元組碼虛擬機,將原始碼文件編譯成 .tbc 指令。

Multi-Tiered Execution and JIT Compilation

Tiny 採用多層次執行模型,包含用於一般邏輯的高效解釋器,以及用於性能關鍵路徑的即時編譯器 (JIT)。JIT 引擎將熱點位元組碼路徑轉換為原生 WebAssembly,以實現接近原生的速度。

Region Outlining

編譯器會自動識別函數體與頂層代碼中的熱點迴圈,並將其輪廓化 (outlining) 為專門的 JIT 區域。這使得腳本與基準測試可以以原生速度運行,而無需開發者手動將邏輯封裝進函數中。

Packed Object Arrays

為了減少 VM 與原生層之間的交互開銷,JIT 為包含統一形狀 (shape) 物件的陣列實現了主機記憶體鏡像 (host-memory mirroring)。透過使用欄位-列 (field-column) 指標表,運行時可以直接在線性記憶體中存取物件屬性。這些封裝陣列支援動態增長與 Wasm 端的優化。

JIT Optimization Best Practices

開發者可以透過遵循特定的編碼模式來最大化 JIT 性能:

  • 使用類型提示 (Type Hints):提供明確的提示(例如 : number)有助於 JIT 生成專用的機器碼。
  • 避免擷取閉包 (Avoid Capturing Closures):閉包了可變外部變數的函數會由解釋器而非 JIT 處理。
  • 保持同步 (Stay Synchronous)async 函數目前尚不符合 JIT 編譯的條件。
  • 字串操作:字串連接操作會經過 JIT 加速,但對於大規模構建,建議使用標準庫中的 stringBuilder

Language Specifications

Tiny 旨在用於快速原型設計與穩健的應用開發,將動態類型與結構化驗證相結合。

Dynamic Typing and Structural Interfaces

Tiny 預設為動態類型,但支援變數、參數與回傳類型的選用靜態類型提示,包括對泛型 (generics) 與聯合類型 (unions) 的支援。它使用結構化類型 (structural typing,基於形狀的驗證),即在運行時根據介面驗證物件。JIT 引擎透過追蹤物件形狀並利用線性記憶體欄位偏移量來優化這些檢查。

Advanced Syntax Features

  • 解構賦值 (Destructuring Assignment):支援包含嵌套模式、屬性重新命名與預設值的物件與陣列解構。
  • 類別組合 (Class Composition)embed 關鍵字允許類別將行為委派給其他類別實例,傾向於使用組合而非深層繼承。
  • 模式匹配 (Pattern Matching)match 區塊支援字面量、變數、列舉 (enums)、聯合模式與守衛 (guards),作為從列舉變體中提取數據的主要機制。
  • 作用域清理 (Scoped Cleanups)defer 陳述式確保函數調用在包圍的作用域退出前立即執行,無論是提前返回或發生錯誤。

Concurrency and Threading

Tiny 利用作業系統層級的多執行緒來實現並行執行,這與事件迴圈模型不同。spawn 關鍵字會在隔離的 VM 狀態空間中啟動一個新的執行程序,允許任務在所有可用的 CPU 核心上並行運行。

共享狀態透過互斥鎖 (mutexes) 與原生的 lock 區塊來管理。編譯器確保在執行離開該區塊時會自動釋放互斥鎖,以防止死鎖。

Inline Go Extensions via WebAssembly

Tiny 允許開發者使用 native fn 區塊直接在原始碼文件中編寫 Go 代碼。這些區塊會透過 TinyGo 編譯成 WebAssembly,並在運行時載入,從而允許在 Tiny 腳本中使用特定的 Go 套件。

Standard Library and Tooling

Tiny 提供了一個全面的標準庫,用於各種使用場景:

  • validate:用於物件、陣列與聯合類型的架構驗證 (schema validation) 的可鏈式 API。

  • http:具備基於路由的多路複用功能的並行 Web 伺服器與客戶端。

  • ui:基於 WebView 的桌面容器,使用 HTML/CSS/JS 並直接綁定 Tiny 函數。

  • desktop:用於鍵盤、滑鼠與剪貼簿交互的作業系統自動化工具。

  • time, url, 和 array:用於計時、URL 編碼與原生陣列操作的工具組。

CLI and Ecosystem

Tiny CLI 提供幾個關鍵命令:

  • tiny run <file>:編譯並運行腳本,使用位元組碼快取以避免重複編譯。
  • tiny pack <file> -o <binary>:將位元組碼與 VM 運行時打包成單個獨立的原生可執行檔(約 13MB)。
  • tiny pack <file> -o <dir>:將位元組碼與 VM 運行時打包成單個獨立的原生可執行檔(約 13MB)。
  • tiny dist <file> -o <dir>:將應用程式與插件與資產打包成套件。
  • tiny lsp: 啟動語言伺服器 (Language Server) 以進行編輯器集成(例如 VS Code),提供類型收窄 (type narrowing)、語義恢復 (semantic recovery) 與重構安全性 (refactoring safety) 功能。

Community Perspective

雖然該專案展現了顯著的技術廣度,但部分用戶對其與直接使用 Go 或 Python 的具體使用場景進行了質疑。一位用戶建議,Tiny 尤其適合作為一種高層級的腳本語言,用於即時性的配置管理系統。

"i'm wondering if it can beat just installing go though. I think it'd be interesting to build a adhoc config mgmt system w/ this and use it as a high level scripting language."

Sources