工程趣聞 2026 年 5 月 4 日

2026-05-04 — TUI 回歸、PEP 661 五年、Ladybird 四月工程進度

TUI 回歸:原生 GUI 框架碎片化的技術後果 alcid…

TUI 回歸:原生 GUI 框架碎片化的技術後果

alcidesfonseca.com · 2026-05-03

終端使用者介面(Terminal User Interface,TUI)在過去幾年出現了明顯的復甦——不僅在系統工具領域,連部分開發工具和資料探索工具也選擇了終端介面。alcidesfonseca.com 的一篇分析從平台框架失敗的角度解釋了這個現象。

Windows 的框架輪替史

Windows 在 GUI 框架上的歷史是一部持續失敗的輪替史:MFC(1992)、WinForms(2002)、WPF(2006)、UWP(2012)、MAUI(2022),每個框架都試圖統一 Windows 應用程式的外觀與互動模型,但沒有一個做到持久的生態系統整合。開發者在每次主要 Windows 版本更新後都面臨遷移決策;使用者則面臨同一 OS 上多種不同互動慣例並存的混亂。

macOS 的設計退化

macOS 在 2010 年代中期以後逐漸放棄了對自身設計原則的遵守。Fitts' 定律(目標越大越容易點中)在 macOS 的原生應用程式中越來越不一致地執行。原生控件的外觀在 macOS 版本之間持續變化,破壞了第三方應用程式的視覺連貫性。從 macOS Big Sur 開始的設計語言轉變使部分慣用操作的回饋變得不直觀。

Linux 的雙軌分裂

GTK 與 Qt 在 Linux 桌面長期並存,帶來了字型、間距、主題、動畫的不一致。即使在同一個桌面環境(如 GNOME)中,原生應用程式與使用不同框架撰寫的工具之間的外觀差距也相當明顯。Electron 應用程式普遍存在於 Linux 上,但它們放棄了平台原生的互動模型(右鍵選單行為、鍵盤導航、無障礙 API 整合)。

TUI 的技術優勢

TUI 在上述情境中提供了幾項實際的工程優勢:

  • 跨平台一致性:VTE/xterm 等終端模擬器的行為在 Windows Terminal、macOS Terminal.app、Linux 各終端之間高度一致,應用程式不需處理平台差異
  • 鍵盤驅動:TUI 的設計天然以鍵盤為主,自動化腳本與人機互動共用相同的介面
  • 遠端執行:透過 SSH 執行 TUI 不需要 X forwarding 或 VNC,網路頻寬需求極低
  • 可預測的渲染:ANSI escape codes 的語意明確,不依賴平台的渲染引擎或 GPU 加速

作者的核心論點是:TUI 不是因為技術進步而回歸,而是因為原生 GUI 框架長期無法提供穩定、可預期的開發與使用體驗,讓「退回基礎」成為工程上合理的選擇。

原始來源:Why TUIs are back


PEP 661 終獲接受:Python 哨兵值的五年標準化歷程

python.org / Lobsters · 2026-05-01

Python 社群注意到一個近期在 Lobsters 引發討論的事件:PEP 661(哨兵值,Sentinel Values)在 2021 年首次提出,歷經五年、多輪替代方案辯論後,終於在 Python 3.15 中以內建函式的形式獲得接受。這個過程本身就是 Python 演進決策機制的一個縮影。

哨兵值的工程背景

哨兵值解決的是一個常見但細膩的問題:當函式需要區分「使用者未傳入任何值」與「使用者明確傳入 None」時,None 本身無法作為預設值的標記。Python 開發者長期以來使用 _MISSING = object() 的慣用法,但這個方法有三個系統性缺陷:repr 無意義、型別標注不可能、copy/pickle 後失去身份一致性(identity)。

五年的爭議點

PEP 661 的延遲主要來自對「正確抽象層次」的分歧:

  • 應建立 Sentinel 類別,讓開發者繼承?(提供最大彈性,但增加概念複雜度)
  • 應在 enum 模組新增 sentinel() 工廠?(保持與現有列舉機制的概念鄰近性)
  • 應作為內建函式,與 NoneTrueFalse 同層?(最高可見性,但對內建命名空間的使用需謹慎)
  • 應留在 functools 或第三方函式庫?(最保守方案)

社群調查顯示 37% 的受訪者選擇「專用哨兵工廠納入 stdlib」為最優先方案,但具體放在哪個模組仍有爭議。最終決定是作為內建函式builtins.sentinel),理由是哨兵值的使用場景足夠基礎,值得與 None 同級別的曝光度。

技術決策的關鍵點

pickle 身份一致性的保證是最後突破的技術關鍵。要讓 pickle.loads(pickle.dumps(MISSING)) is MISSINGTrue,哨兵物件必須在模組載入時以名稱(name string)為鍵在全域字典中保留引用,pickle 時序列化名稱,unpickle 時從字典查找同一物件。Steering Council 確認此語意可正確實作後,接受了 PEP。

原始來源:PEP 661 – Sentinel ValuesLobsters 討論串


Ladybird 四月工程進度:333 PR、強制 Rust、GTK4 前端

ladybird.org · 2026-04-30

Ladybird 是一個從頭開發的獨立瀏覽器引擎,不共用 Blink、Gecko 或 WebKit 的任何程式碼。四月的進度報告展示了這個剛滿兩週年(開源時間)的專案已累積到的工程深度。

333 PR 中的工程亮點

本月 35 位貢獻者合入 333 個 PR,其中七位是首次貢獻者。以下幾個變更有工程架構意義:

  • Rust 強制化:Rust 成為建構 Ladybird 的必要相依,不再是可選項。LibGC(垃圾回收子系統)正以 Rust 重寫,現有的 C++ GC 實作將被取代。
  • mimalloc 替換系統分配器:jemalloc/glibc malloc 換為 mimalloc,在多數 allocation pattern 下速度更快,且 mimalloc 對碎片化的控制更好。
  • dmabuf GPU 繪製:在 Linux 上透過 dmabuf 直接將渲染結果傳給 GPU,消除了 CPU readback(從 GPU 記憶體複製回 CPU 再傳給視窗系統),降低了合成(compositing)的延遲。

GTK4 + libadwaita 前端

繼 Qt 前端之後,Ladybird 現在有了第二個 Linux GUI 前端:基於 GTK4 和 libadwaita 的實作。這讓 Ladybird 在 GNOME 桌面環境下的外觀與互動符合 GNOME HIG(Human Interface Guidelines),包括正確的主題整合與無障礙支援。

JavaScript 引擎的細粒度優化

LibJS(Ladybird 的 JavaScript 引擎)本月的優化涵蓋:for-in 迴圈的快取機制、字串串接的原地擴展(避免不必要的複製)、陣列操作的 fast path。Speedometer 2 分數從月初的 67.7 提升至月末的 73.6,約 8.7% 的進步。

原始來源:This Month in Ladybird – April 2026


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