後端工坊 2026 年 5 月 3 日

2026-05-03 — Rust nvptx 基線升級、dotcl CL on .NET、C++ 遊戲協程、Pollen WASM

Rust 1.97 將 nvptx64-nvidia-cud…

Rust 1.97 將 nvptx64-nvidia-cuda 目標基線升至 PTX ISA 7.0 / SM 7.0

Rust Blog · 2026-05-01

Rust 1.97(預計 2026-07-09 發布)將 nvptx64-nvidia-cuda 編譯目標的最低支援規格提升為 PTX ISA 7.0 與 Compute Capability SM 7.0(Volta 架構,V100 起),移除對 Maxwell(SM 5.x)與 Pascal(SM 6.x)的相容輸出。

變更動機

Rust 團隊在舊版架構上發現多個影響正確性的編譯器缺陷:在特定指令組合下觸發 ICE(Internal Compiler Error)與不正確的程式碼生成。由於 NVIDIA 已不再主動支援這些架構,維護回溯相容性的工程成本超過效益,因此決定收緊基線,將資源集中於現有主流硬體的正確性改善。

新基線規格

  • PTX ISA 7.0:需要 CUDA 11 Driver(或更新版本)才能載入生成的 PTX。
  • SM 7.0:Compute Capability 7.0 以下的 GPU 不再獲得相容的 PTX 輸出。Volta(V100)、Turing(RTX 20 系列,SM 7.5)、Ampere(A100、RTX 30 系列,SM 8.x)以及 Ada Lovelace(RTX 40 系列,SM 8.9)均在新基線範圍內。

受影響的使用者

使用 -C target-cpu=sm_60 或更低值的開發者必須移除或更新該旗標;使用 CUDA 10 Driver 或更舊版本的環境將無法載入新編譯的 PTX。若需要繼續支援舊硬體,須在 Rust 1.97 之前的版本上凍結編譯,或維護獨立的舊版建構管線。對於以 --target nvptx64-nvidia-cuda 編譯且不指定 SM 版本的開發者,編譯行為整體不變,僅是生成的 PTX 不再相容舊硬體。

原始來源:Rust Blog


dotcl v0.1.2:Common Lisp 在 .NET CLR 上完整執行

github.com/dotcl · 2026-05

dotcl 將 Common Lisp 原始碼編譯為 CIL(Common Intermediate Language),讓 Lisp 程式直接在 .NET JIT 上執行,支援 Windows、macOS、Linux 的 x86-64 與 ARM64。Hacker News 討論獲 143 點。

架構

系統採用兩層設計:用 Lisp 撰寫的編譯器將 S-expression 轉換為 CIL 指令;以 C# 實作的 runtime 負責物件表示(representation)、Reader、CIL assembly 以及標準函式庫函數。初始引導(bootstrap)透過交叉編譯完成:Roswell/SBCL 執行 Lisp 編譯器生成初始 bytecode,接著由 .NET runtime 載入。完成引導後,dotcl 可自我重新編譯(self-host)。

ANSI CL 相容性

依據 ansi-test 測試套件,dotcl 廣泛符合 ANSI Common Lisp 標準。Quicklisp 的套件在不依賴 SBCL 內部實作細節的前提下一般可正常載入,asdfalexandria 已確認可用。

.NET 互操作

透過 dotnet: 套件,開發者可直接在 Lisp 中存取 .NET 型別、呼叫方法、繼承類別,不需要單獨的 FFI 綁定生成步驟。官方範例包含:以 Lisp 定義 MAUI 應用程式的 UI 邏輯、ASP.NET Core controller、MonoGame 遊戲以及 MCP Server。v0.1.2 於 2026 年 5 月發布,三個正式版本,GitHub 81 顆星。

原始來源:dotcl GitHub Repository


約 200 行 C++ 實作遊戲開發用的無堆疊協程

Vittorio Romeo · 2026-05-03

Vittorio Romeo 在 SFEX 引擎中使用約 200 行 C++ 實作了一套無堆疊協程(stackless coroutines),針對遊戲邏輯的時序編排需求量身設計,刻意迴避 C++20 原生協程機制。

核心機制

協程狀態僅由一個整數(state 欄位)加上結構體成員組成。控制流以 switch 分派實作:每個 SFEX_CO_YIELD() 巨集展開為儲存目前狀態、退出函數,並在下次呼叫時透過 switch case 跳回該位置。Case label 的編號由 __COUNTER__ 巨集自動生成,並以相對偏移(relative offset)確保在程式碼前後插入無關行時不改變已有 yield 的 case 數字,對儲存檔案向後相容有所助益。

與 C++20 協程的差異

C++20 協程依賴 HALO(Heap Allocation eLision Optimization)消除堆積分配,但此優化並非保證——在 Debug 建構中幾乎必然觸發堆積分配。此外,C++20 協程的內部 frame 不可被序列化或外部觀察,而遊戲存檔系統通常需要完整序列化所有執行中的行為狀態。SFEX 的方法中,協程狀態是普通的 C++ struct,可直接以標準序列化手段存入存檔。

時序組合

SFEX_CO_AWAIT(sub_coroutine) 讓父協程掛起直到子協程結束,yield 自動向上傳播。這使多層嵌套的時序邏輯(如 Boss 在攻擊階段中循環播放不同攻擊模式)可以線性方式撰寫,而不必手動維護複雜的有限狀態機轉換表。需要注意:跨 yield 存活的變數必須宣告為結構體成員;RAII 物件在每個 yield 點都會解構;新增或移除 yield 點會使舊版存檔中的 case 數字錯位,需要版本號管理。

原始來源:Vittorio Romeo Blog


Pollen:單一二進制、無控制平面的分散式 WASM 執行環境

github.com/sambigeara · 2026-05-03

Pollen 以 Go 撰寫,實作了一個自組織網格與 WebAssembly 執行環境。節點間透過 QUIC 連接,以 gossip CRDT 同步狀態,不需要任何中央控制器。工作負載以 WASM 模組(透過 Extism 執行)封裝,依內容雜湊進行 P2P 分發。節點自主依本地容量與流量鄰近性決定是否承載工作負載;節點故障後,存活節點自動接手。所有連線使用 mTLS 零信任模型。目前版本 v0.0.1-dev.16,GitHub 204 星,HN 獲 103 點討論。

原始來源:Pollen GitHub


End of article
0
Would love your thoughts, please comment.x
()
x