無堆疊記憶體模型如何運作
Goose 不使用堆疊分配器、垃圾回收、參考計數或解構子。程式執行時僅依賴原生呼叫堆疊、靜態資料以及由編譯器決定數量 N 的資料堆疊。每個資料堆疊是大範圍位址空間保留區搭配 bump pointer,同一時間每個堆疊上最多只有一個可調整大小的值位於頂端,因此增長操作僅移動指標而不檢查容量或搬移資料。
這種設計確保參考在陣列增長時保持有效。例如向包含百萬個元素的結構新增項目後,先前取得的元素參考仍可安全存取。編譯器透過靜態推斷每個參考的根變數來強制執行生命週期規則,若參考可能比其擁有者存活更久則拒絕編譯,全程無需程式設計師標註生命週期或處理 unsafe 區塊。
基準測試數據與比較條件
根據 Goose 官方發布的十六項基準測試幾何平均值,使用 MSVC 後端時,Goose 比慣用寫法的 C++ 快 3.51 倍、比手動優化的 C++ 快 1.24 倍、比最佳安全 Rust 快 1.13 倍。使用 clang 後端時,對應速度提升分別為 3.54 倍、1.26 倍與 1.19 倍。
記憶體用量方面,Goose 相較於慣用 C++、手動優化 C++ 與最佳安全 Rust 分別減少 1.95 倍、1.32 倍與 1.25 倍的峰值記憶體。這些數據基於整體程序牆鐘時間測量,包含清理階段。速度優勢主要來自內聯儲存巢狀資料、窄連結以及依變體大小儲存列舉型別等記憶體佈局特性。
內聯儲存與窄連結技術細節
Goose 將字串、陣列及記錄等巢狀資料儲存為單一連續區塊,內部不含指標。官方範例顯示一個包含訂單資訊的結構在 Goose 中僅佔 29 位元組且零次分配,而在 C++ 與 Rust 中分別需 160 位元組加一次分配、153 位元組加四次分配。
語言支援寬度小於指標的相對參考,以 1、2 或 4 位元組偏移量儲存型別檢查連結。這使得資料結構具備位置獨立性,可直接寫入檔案作為位元映像,載入時僅需單一讀取與驗證步驟即可拒絕損壞或惡意資料,無需序列化器或指標修正。
並發模型與 C 語言互通
Goose 的執行緒被編譯為擁有獨立記憶體與全域變數副本的單獨程式。執行緒間透過型別佇列傳遞扁平值,這些值必須不含任何深度的參考,傳遞過程僅需一次 memcpy 操作。語言中不存在資料競爭、鎖、原子操作或記憶體順序問題。
Goose 編譯器將整個程式輸出為單一 C 檔案,並內建 TinyCC 後端可在程序內直接編譯執行。開發者可透過 extern fn 宣告直接呼叫 C 函式庫,僅限具有支援之 C 表示法的型別可跨越邊界,不支援的簽名會在宣告時被拒絕。
語言限制與社群回饋
開發者明確列出 Goose 的限制:程式設計師必須思考資料擁有權與作用域;遞迴函式無法在遞迴呼叫間保留可增長資料;變數大小元素的陣列僅能迭代不能索引(除非額外維護參考索引);不支援逃逸閉包、函式指標或 ADT 標籤以外的動態派發。
社群討論指出,由於缺乏垃圾回收,若持續增長堆疊而舊資料未被釋放,記憶體用量可能過大。另有使用者質疑 Goose 如何表示任意數量的動態大小值,開發者回應稱只要靜態指定可增長記憶體區域數量即可使用,適用於受限用途的程式而非所有場景。




