jank 重寫 C++ 互操作錯誤診斷,並開設官方原生套件庫 jank commons
jank-lang.org · 2026-09-04
2026 年 9 月 4 日,jank 語言作者 Jeaye Wilkerson 在官方部落格公布近三個月的進展:編譯器重新設計了C++ 互操作候選函式的錯誤訊息、補上原生執行期例外的堆疊追蹤,並上線官方原生套件庫 jank commons。jank 是一個以 Clojure 語法搭配原生(C++/LLVM)語意執行的程式語言,這批改動集中在可用性與工具鏈完整度。
C++ 候選函式錯誤與跨語言堆疊追蹤
jank 的 AST 與 Clang AST 緊密結合,遇到多載候選函式無法決議時,錯誤訊息會以表格形式列出每個候選、依參數數量、必要的隱式轉換與存取層級排序,預設只顯示前三筆;即使函式定義在 cpp/raw 巨集內,仍能取得正確的簽章與來源位置。除了編譯期錯誤,jank 也補上未捕捉例外的堆疊追蹤——原生編譯器沒有統一取得堆疊的方式,jank 因此把三種除錯資訊來源拼接:目前執行檔本身、AOT 編譯物件檔(對應 Clojure JVM 的 .class)、以及 JIT 編譯時動態加入 LLVM runtime 的物件檔。這讓例外堆疊能同時顯示 Clojure 與 C++ 邊界的呼叫點,並標出精確來源位置與呼叫弧度(arity),目前在 macOS 與 Linux 上皆已驗證可用。
原生建置系統與官方套件庫 jank commons
jank 的原生建置系統(由 Kyle Cesare 建立、Wilkerson 近期加上 macOS 沙盒與更完整的靜態連結支援)疊在 Clojure 既有的 Clojars 套件機制上:新增依賴時,工具鏈會自動偵測該套件是否附帶 jank 建置腳本,並在沙盒環境中本機建置,沙盒不會接觸使用者個人檔案。在此基礎上,官方推出jank commons——一個發布至 Clojars 的原生套件庫,依循 Rust/Cargo 慣例以 -sys 字尾標示「只提供系統函式庫繫結、不含高階 API」的套件,目前已收錄 raylib、SDL、sqlite3、Boost、Dear ImGui、Box2D 等常見函式庫的繫結,讓上層套件可以專心撰寫高階介面而不必處理原生打包細節。
C++26 定案 std::hive:兼顧指標穩定與局部性的新容器
sandordargo.com · 2026-09-02
C++26 標準已於 2026 年 3 月的 WG21 Croydon 會議定案,其中提案 P0447R28(作者 Matthew Bentley)引入新容器 std::hive,填補 std::vector 與 std::list 之間的空缺:提供指標與參照穩定性,同時維持接近陣列的迭代效能。該提案的前身名為 colony,經 D2332R0 更名為 hive 以符合標準庫命名慣例。
核心設計:skipfield 與多區塊記憶體
std::hive 的宣告如下:
template<class T, class Allocator = allocator<T>> class hive;
struct hive_limits { size_t min; size_t max; };
容器不使用單一連續配置,而是把元素放進多個獨立的「element block」;每個區塊搭配一個skipfield(游程編碼的跳過表),記錄哪些槽位已被清除,迭代時直接跳過這些槽位而不需搬移其餘元素。元素被清除後,該槽位標記為可重用,後續插入可直接填回,因此插入與清除都是 O(1) 攤銷複雜度,只有排序等操作退化為 O(n log n)。容器只提供雙向迭代器,不支援隨機存取,也不保證維持插入順序。
效能特徵與適用場景
Daniel Lemire 在 Intel Xeon Gold 6548N、GCC 16.1(-O3 -march=native)上實測 plf::hive 參考實作,量化它相對 vector/list 的取捨:
| 操作(每元素) | std::vector | std::hive | std::list |
|---|---|---|---|
| 插入(100 萬筆) | 0.29 ns | 1.57 ns | — |
| 迭代(1000 萬筆) | 0.32 ns | 1.96 ns | 3.51 ns |
| 清除 50% 隨機元素 | 3.0 ns | 2.1 ns | 77.4 ns |
| 每元素記憶體額外開銷 | 8.0–8.4 bytes | 9.4 bytes | 32.0 bytes |
可以看出hive 在清除密集場景明顯優於 vector 與 list,迭代效能介於兩者之間但遠優於 list,記憶體開銷也僅略高於 vector。這使它適合遊戲引擎的實體池、事件訂閱者列表、連線池等需要跨呼叫保存指標、又頻繁插入刪除的場景。
uutils coreutils 0.11.0 導入編譯器風格錯誤診斷,橫跨 30 餘個工具
uutils.org · 2026-09-05
GNU coreutils 的 Rust 重寫專案 uutils 於 2026 年 8 月 31 日發布 0.11.0,合併 358 個 PR、新增 26 位貢獻者,headline 功能是以 ariadne 函式庫打造的編譯器風格錯誤診斷引擎。當 stderr 連到終端機時,解析錯誤會把原始參數印成一行原始碼、以插入符號(^)指出出錯字元,再附上一行語法說明,涵蓋 chmod、cut、sort、tr、mkdir、numfmt、stat、join 等 25 個以上會解析小型語法的工具。
診斷引擎的行為與開關
這套診斷只在偵測到終端機時啟用,管線或指令碼呼叫時仍維持舊有純文字輸出,避免破壞既有腳本;可用環境變數 UUTILS_DIAG 控制渲染行為,體積受限的建置也能整個編譯掉診斷渲染邏輯。錯誤插入符號甚至能定位到引號內部的單一字元,而非只標示整個參數,同時遵守 NO_COLOR 慣例決定是否輸出色彩。
其餘變更範圍
同一版本也包含效能與相容性項目:
- PGO(Profile-Guided Optimization)發行版建置最高提升 31% 效能,
join在配對輸入上較前版快 1.37 倍、較 GNU 版本快 2.5 倍 - GNU 測試套件通過數增至 653(+8),失敗數降至 22(−6),本版首次做到 0 個測試出錯
- 安全性修補 4 項,包括
mv/cp的 xattr TOCTOU 問題、rm/chmod的符號連結防護、stdbuf暫存目錄洩漏 kill、uptime補上 Windows 實作,WASI 支援也一併加強
原始來源:jank 官方部落格、jank commons、WG21 P0447R28、Daniel Lemire 效能實測、uutils coreutils 0.11.0 release notes