Autumn:塞進 QR Code 的 WebAssembly 直譯器(2,944 位元組)
purplesyringa.moe · 2026-05-03
Wasmtime 的二進位檔案約 50 MB;一個 C 語言的 Hello World 靜態執行檔也要 900 KB 左右。Purplesyringa 撰寫的 Autumn 直譯器卻只有 2,944 位元組——小到可以編碼為單一 QR Code,同時仍可執行 Lime1 規格的完整 WebAssembly 指令集與大部分 WASI 系統呼叫,包括跑完整個 QuickJS JavaScript 直譯器。
二進位縮小策略
傳統 ELF 可執行檔的尺寸由三部分構成:連結器引入的函式庫程式碼、對齊與段頭的固定開銷、以及 debug 資訊。Autumn 逐一消除:
- 直接系統呼叫:不連結 libc,啟動程式碼以 23 位元組組合語言撰寫,直接呼叫 Linux syscall。
- 段合併:自訂 linker script 將
.text、.data、.rodata合入單一段,消除段頭對齊浪費。 - 暫存器全域變數:利用 GCC 擴充
register T* p asm("r12")將程式碼指標、break level 等全域狀態固定到 x86-64 的 callee-saved register,省去記憶體存取,節省約 500 位元組。
單遍執行與 break_level
傳統 Wasm 直譯器在開始執行前會先掃描所有 block / loop / if 指令,建立跳躍目標表。Autumn 沒有這個前處理步驟——可執行檔沒有空間放跳躍表。取而代之的是一個全域計數器 break_level:當值非零時,直譯器繼續解碼指令但不執行任何操作,直到找到對應的 end 或 else。這樣的「空跑(dry-run)」機制讓控制流程在單遍解碼中運作,代價是 break 目標需要重新解碼經過的指令。
x86 微架構技巧
在指令層級,Autumn 充分利用 x86 的歷史遺留指令集:
rep stosq/rep movsd取代memset/memcpy函式呼叫- x87 FPU 的
fistl(float-to-int 截斷)用於 Wasm 的i32.trunc_f32_s,避免 SSE 的 MXCSR 設定開銷 - 使用 parity flag 實現
i32.min_s/i32.max_s,省去條件跳躍 - 對相似操作碼(不同寬度的記憶體載入)合併為帶參數的單一函式,依操作碼計算移位量與號數延伸遮罩
- Runtime code patching:比較操作的 setcc 指令在執行時依條件碼直接修改
算術編碼壓縮
上述優化後,未壓縮的二進位仍超過 4,500 位元組。最後一步是受 demoscene 工具 Crinkler 啟發的自訂算術編碼器(arithmetic coder with context mixing),為 x86 機器碼提供特化的上下文模型。壓縮率約 40%,將最終可執行檔推進 3 KB 以內,滿足 QR Code 容量限制(版本 40,二進位模式:2,953 位元組上限)。
Autumn 並非可用於生產環境的工具:單遍設計導致 QuickJS REPL 的語法高亮有明顯延遲,且未實作任何沙箱機制。但它以完整的工程細節示範了在極端空間限制下構建系統軟體的技術組合。
Ladybird 四月進度:增量 HTML 解析器、推測性預取、Rust 強制化
ladybird.org · 2026-04-30
Ladybird 瀏覽器在 2026 年四月合併了 333 個 Pull Request,來自 35 位貢獻者(其中 7 位首次貢獻)。此次更新包含幾項對效能有實質影響的架構變更。
增量 HTML 解析器與推測性預取
HTML 解析器現在以串流方式消費回應 body,而非等待整份文件下載完畢後才開始解析。同時引入推測性解析器(speculative parser):它在主解析器前方掃描尚未解析的輸入,提前對 <script src="...">、<link>、<img> 等資源發出預取請求。這兩項改變共同縮短了首次內容繪製(FCP)的時間,效果在高延遲網路環境下尤為明顯。
JavaScript 離線編譯
JavaScript 編譯由主執行緒移至背景執行緒,將約 200ms 的主執行緒阻塞時間轉移至後台。這對 Speedometer 等基準測試有直接影響:分數從 67.7 提升至 73.6。
Rust 強制化與 mimalloc
從本月起,Rust 成為建構 Ladybird 的必要條件(mandatory dependency)。系統分配器改為 mimalloc,在 Linux 上透過 dmabuf GPU 繪製消除了 CPU readback,降低 GPU 提交的 latency。
渲染與 CSS 進展
本月合併的渲染功能包括:
image-set()CSS 函數(響應式圖片解析度選擇)- CSS Anchor Positioning 初步支援
- 改善色彩插值(color interpolation)精確度
- 修正 RTL 文字的 list marker 位置
- 內嵌 flex/grid 容器的 baseline 對齊修正
使用者功能
PDF 透過 pdf.js 整合實現內嵌檢視;地址欄新增歷史記錄與 favicon 的自動補全;書籤管理加入匯入/匯出。Linux 的 GTK4 + libadwaita 前端進入可用狀態。
KDE Plasma 6.6 的自動亮度調節:六點曲線插值與遲滯設計
zamundaaa.github.io · 2026-04-24
Plasma 6.6 在 KWin 中加入了自動亮度調節功能,由 Xaver Hugl 撰寫。大多數筆記型電腦缺乏環境光感測器,使自動亮度在 Linux 桌面上長期難以實作。Plasma 的解法以六點曲線與線性插值為核心。
曲線設計
使用者在設定介面中標記六個控制點,每個點對應感測器讀值(lux)與目標螢幕亮度(0–100%)的對應關係,間距為 20% 亮度。KWin 在執行時用線性插值找到最接近的兩個控制點,計算當前 lux 值對應的亮度設定。
為確保曲線單調(亮度不會隨光線增強而反向降低),實作強制相鄰控制點間至少相差 1 lux 或 10% 亮度。曲線允許最低點低於 0 lux,讓使用者可為黑暗環境設定任意低亮度值。
遲滯與延遲
原始感測器讀值存在高頻雜訊,若直接驅動亮度調節會導致螢幕不斷閃爍。Plasma 的解法是雙重緩衝:
- ±10% 遲滯(hysteresis):只有當感測器讀值偏離當前觸發點超過 10% 時,才重新計算目標亮度。
- 兩秒延遲:感測器穩定在新值兩秒後才實際套用亮度變更。
- 不對稱動畫:亮度降低時動畫比增亮時更緩慢,減少突然變暗帶來的視覺衝擊。
感測器資料透過 Wayland 的 wp_drm_lease_v1 協定讀取,或直接從 sysfs 的 iio 裝置節點取得。作者在 Framework Laptop 13(內建環境光感測器)上開發此功能,並規劃未來延伸至色溫自動調節。