NEO.K / PLDST程式語言設計師風格譜系
編號PLDST-023
版本v1.0
日期2026-07-30
作者Neo.K
狀態公開版/第四部跨設計師正式比較研究

下載 PDF ↓回到論文索引 ↗

Wirth、Ritchie 與 Stroustrup:簡潔、機器控制與相容性之間的三種系統語言倫理

摘要

Niklaus Wirth、Dennis Ritchie 與 Bjarne Stroustrup 都設計過能處理系統級問題、重視效率且深刻影響工程實踐的語言。然而,若只以「Pascal/Oberon、C、C++」的功能表比較三人,就會忽略最重要的差異:他們對語言設計者應保護什麼、允許什麼、刪除什麼,以及把複雜度交給誰,具有三套不同倫理。

本文所謂「倫理」不是對個人人格作道德評價,而是指一種規範性責任配置:

當語言不可能同時最大化簡潔、效率、安全、相容、抽象、可攜與生態規模時,設計者認為哪些價值不可犧牲,哪些成本可以轉移,又由誰承擔後果?

Wirth 的核心要求是:

整個語言與系統必須小到仍可被理解、實作、教授和重建\boxed{ \text{整個語言與系統必須小到仍可被理解、實作、教授和重建} }

他在 Modula-2/Oberon 回顧中把設計簡潔稱為最重要指導原則,並將概念清楚、功能節制、實作效率與可靠性視為其結果。設計 Oberon 時,其策略是先決定從 Modula-2 刪除什麼,再決定必須加入什麼,以提高能力並同時降低複雜度。[R1] Project Oberon 更由 Wirth 與 Jürg Gutknecht 從零建造語言、編譯器、作業系統和工作站環境,使完整系統可以在一本書中被說明和理解。[R2]

Ritchie 的核心要求是:

保留系統程式所需的機器控制,同時把大多數程式邏輯從單一硬體中解放\boxed{ \text{保留系統程式所需的機器控制,} \quad \text{同時把大多數程式邏輯從單一硬體中解放} }

C 從 BCPL 與 B 演化而來。Ritchie 保留 B 的小型表面,加入適合 PDP-11 的型別、陣列/指標規則、結構及編譯器,使 Unix 能在 1973 年由組合語言轉向主要以 C 實作。C 的抽象不是要隱藏機器,而是建立一層足以跨機器保存系統結構、又不阻止位元、位址、布局和外部程式互操作的薄介面。[R3][R4]

Stroustrup 的核心要求是:

程式設計者不應被迫在高階抽象、機器控制、效率與既有程式之間四選一\boxed{ \text{程式設計者不應被迫在高階抽象、機器控制、效率與既有程式之間四選一} }

C++ 的原始目標是把 Simula 的程式組織能力與 C 的系統效率、彈性結合,並在真實專案中迅速可用。[R5] 後來的零額外成本原則要求:未使用的功能不支付成本;使用的抽象不應比合理手寫低階方案更昂貴。[R6] 但 C 相容、多範式和長期工業採用也使 C++ 保存大量歷史能力及交互複雜度。

本文以七個共同軸比較三人:

  1. 設計起點;
  2. 抽象高度;
  3. 硬體暴露;
  4. 安全與錯誤責任;
  5. 相容性;
  6. 完整系統驗證;
  7. 治理權力與長期演化。

本文提出的核心比較是:

Wirth:以刪減保護可理解性Ritchie:以薄抽象保護可攜控制Stroustrup:以零額外成本擴張保護既有能力\boxed{ \begin{aligned} Wirth &: \text{以刪減保護可理解性}\\ Ritchie &: \text{以薄抽象保護可攜控制}\\ Stroustrup &: \text{以零額外成本擴張保護既有能力} \end{aligned} }

三者並不是線性進步關係,而是在不同制度條件下求解不同優化問題:

因此,三人的差異不能只歸因於品味,也由歷史可行空間決定。若忽略此點,便會得到錯誤結論:

更精確的結論是:

三人各自建立了一套「誰有權控制機器、誰應承擔錯誤、誰可以破壞相容、誰必須理解整個系統」的系統語言憲法。

關鍵詞: Niklaus Wirth、Dennis Ritchie、Bjarne Stroustrup、Oberon、C、C++、系統語言、簡潔、可攜性、零額外成本、相容性、PLDST


第一部分 比較方法:何謂系統語言倫理

一、倫理不是功能清單

語言功能表可以回答:

但它不能回答:


二、責任配置向量

本文將系統語言倫理表示為:

E(L)=(Bu,Bc,Br,Bt,Be,Bg)\mathcal{E}(L)= ( B_u, B_c, B_r, B_t, B_e, B_g )

其中:

沒有語言能消除全部負擔,只能重新分配。


三、價值向量

再定義:

V(L)=(U,M,A,S,P,K,G)\mathcal{V}(L)= ( U, M, A, S, P, K, G )

其中:

三位設計者都重視這些價值,但排序不同。


四、歷史約束集合

語言設計並非在真空中求最大值。

令:

Ω=(TeamSize,InstalledBase,Hardware,UseCase,Institution,Time,MigrationCost)\Omega= ( TeamSize, InstalledBase, Hardware, UseCase, Institution, Time, MigrationCost )

同一設計者在不同 Ω\Omega 下也可能作出不同決定。


第二部分 三種設計起點

五、Wirth:從概念過量開始

Wirth 的問題常是:

其第一問是:

哪些概念可以刪除,而不損失真正能力?


六、Ritchie:從機器和系統缺口開始

Ritchie 的問題是:

其第一問是:

哪一層抽象足以讓 Unix 可攜,又不奪走系統程式設計需要的控制?


七、Stroustrup:從抽象與效率斷裂開始

Stroustrup 的問題是:

其第一問是:

如何加入高階抽象,又不要求使用者放棄 C 世界或支付不必要成本?


八、三種起點的形式差異

Wirth:ExistingConceptsNonessentialRitchie:MachineSpecificSystem+PortableStructureStroustrup:ExistingSystemLanguage+AffordableAbstraction\begin{aligned} Wirth &: ExistingConcepts - Nonessential\\ Ritchie &: MachineSpecificSystem + PortableStructure\\ Stroustrup &: ExistingSystemLanguage + AffordableAbstraction \end{aligned}

第三部分 第一種倫理:Wirth 的可理解性憲法

九、簡潔的地位

Wirth 將簡潔視為:

這不是表面字數,而是概念經濟。


十、先刪後加

Oberon 的策略為:

先問 Modula-2 哪些功能可刪
再問缺少哪些必要能力

而非:

列出所有使用者可能想要的功能
再全部整合

十一、提高能力同時降低複雜度

Oberon 的重要目標不是單純縮小,而是:

CapabilityComplexityCapability\uparrow \qquad Complexity\downarrow

Type extension 是高覆蓋新增;多項低覆蓋或交互成本高的型別、模組選項和語法則被移除。


十二、完整系統作為證明

Project Oberon 不以 Microbenchmark 或 Toy compiler 證明語言,而是建立:

因此:

LanguageAdequacyWholeSystemImplementabilityLanguageAdequacy \Leftarrow WholeSystemImplementability

十三、設計者的義務

在 Wirth 模型中,語言設計者應能:


十四、使用者承擔什麼

使用者仍需:


十五、Wirth 願意犧牲什麼


十六、Wirth 拒絕犧牲什麼


第四部分 第二種倫理:Ritchie 的薄層控制憲法

十七、C 的抽象不是隱藏機器

C 暴露:

但把:

交給 Compiler。


十八、可攜性的正確形式

可攜不是:

MachineSpecificity=0MachineSpecificity=0

而是:

Program=PortableCore+ConstrainedMachineBoundaryProgram = PortableCore + ConstrainedMachineBoundary

且:

PortableCoreMachineBoundary|PortableCore| \gg |MachineBoundary|

十九、C 的設計單位

C 並不試圖成為完整封閉系統。

它接受:

因此:

LanguageToolchainSystemLanguage \subset Toolchain \subset System

二十、結構高於逐指令對應

C 的關鍵提升是:

它讓 Unix 的 Inode、Process、Buffer 等系統概念能以程式結構表示,而不是以無名 Offset 和 Register 組成。


二十一、實作與使用共同裁決

C 的早期規則常由:

共同決定。

Ritchie 對 &&||、Preprocessor、Pointer 和 Cast 歷史的回顧,甚至明確承認部分規則具有遷移折衷和後來看來不理想的結果。[R3]


二十二、Ritchie 的設計者義務

設計者應:


二十三、使用者承擔什麼

使用者承擔:

Library、Lint、Compiler warning 和組織規範只是補助。


二十四、Ritchie 願意犧牲什麼


二十五、Ritchie 拒絕犧牲什麼


第五部分 第三種倫理:Stroustrup 的能力保存憲法

二十六、抽象不能強迫支付成本

零額外成本原則有兩層:

  1. 不使用的功能不支付其一般成本;
  2. 使用抽象時,不應比合理手寫低階方案更差。

這使高階機制能進入:


二十七、User-defined type 與內建型別平權

Stroustrup 的核心目標是讓使用者定義:

並使其在:

上接近內建型別。


二十八、RAII:資源責任型別化

C 將資源釋放交給流程紀律。

C++ 以:

ResourceLifetime=ObjectLifetimeResourceLifetime = ObjectLifetime

建立:

這是對 C 責任配置的重大重寫,但仍保留 Raw escape。


二十九、多範式不是無中心

C++ 支援:

共同中心是:

高效、型別化、可組合的使用者定義抽象\text{高效、型別化、可組合的使用者定義抽象}

三十、能力不可因設計者無知而被刪除

Stroustrup 擔心語言設計者:

因此 C++ 保留:


三十一、相容是社會部署技術

C 相容降低:

C++ 的成功不只在語言能力,也在能進入既有 C 專案。


三十二、Stroustrup 的設計者義務

設計者應:


三十三、使用者承擔什麼

使用者需理解:


三十四、Stroustrup 願意犧牲什麼


三十五、Stroustrup 拒絕犧牲什麼


第六部分 共同軸一:抽象與硬體的距離

三十六、Wirth:抽象應保持規則且可完整編譯

Wirth 不追求最高抽象,而追求:

低階能力應集中在 SYSTEM 等邊界,而非瀰漫全語言。


三十七、Ritchie:抽象是可攜機器介面

C 的 Pointer、Array、Structure 與整數模型讓使用者持續看見機器。

其抽象距離最短,但仍比 Assembly 高出足以保存系統結構的一層。


三十八、Stroustrup:抽象可以很高,只要不多付不必要成本

C++ 允許:

但設計目標仍要求成本能映射到機器。


三十九、比較

設計者抽象與機器關係Wirth少量規則抽象,完整可實作Ritchie薄抽象,直接暴露表示與位址Stroustrup高階抽象,但要求低階成本可承受\begin{array}{c|c} \text{設計者} & \text{抽象與機器關係}\\ \hline Wirth & \text{少量規則抽象,完整可實作}\\ Ritchie & \text{薄抽象,直接暴露表示與位址}\\ Stroustrup & \text{高階抽象,但要求低階成本可承受} \end{array}

第七部分 共同軸二:安全責任

四十、Wirth:以限制換取靜態清楚

主要手段:

設計者透過刪除危險交互降低錯誤空間。


四十一、Ritchie:能力優先,安全外移

主要手段:

語言本身不阻止大量非法記憶體狀態。


四十二、Stroustrup:建立安全抽象,但保留逃生

主要手段:

但仍保留 C 型能力和 Undefined behavior 邊界。


四十三、安全責任分配

安全主要放在哪裡低階逃生Wirth語言限制+Module+小系統集中、明示Ritchie程式設計者+工具+慣例廣泛Stroustrup型別化抽象+Library+工具保留且多層\begin{array}{c|c|c} & \text{安全主要放在哪裡} & \text{低階逃生}\\ \hline Wirth & \text{語言限制+Module+小系統} & \text{集中、明示}\\ Ritchie & \text{程式設計者+工具+慣例} & \text{廣泛}\\ Stroustrup & \text{型別化抽象+Library+工具} & \text{保留且多層} \end{array}

第八部分 共同軸三:記憶體與資源

四十四、Wirth 的位置

Modula-2 早期因:

拒絕一般 GC。

Oberon System 後來可使用 GC,顯示其立場不是永遠反對自動回收,而是要求:


四十五、Ritchie 的位置

C 提供:

資源生命期主要由人和流程管理。


四十六、Stroustrup 的位置

C++ 以:

把一般資源生命期放入型別和 Scope,同時保留 Manual control。


四十七、比較

Wirth:系統整體決定管理模型Ritchie:程式流程直接管理資源Stroustrup:型別封裝資源,但保留直接控制\begin{aligned} Wirth &: \text{系統整體決定管理模型}\\ Ritchie &: \text{程式流程直接管理資源}\\ Stroustrup &: \text{型別封裝資源,但保留直接控制} \end{aligned}

第九部分 共同軸四:相容性

四十八、Wirth:允許另起新語言

Wirth 的路線:

PascalModula-2OberonOberon-07Pascal \rightarrow Modula\text{-}2 \rightarrow Oberon \rightarrow Oberon\text{-}07

核心一致高於 Source compatibility。

他願意讓使用者學習新語言,以修正舊核心。


四十九、Ritchie:實作和使用形成漸進相容

C 早期可以變動,但:

快速形成既有實踐。

後來標準化主要編碼共同實踐,而非另建新語言。


五十、Stroustrup:相容從第一天即是原始條件

C++ 選 C 作基礎,本身就是:

相容不是後來附加,而是核心政治。


五十一、相容矩陣

設計者 破壞舊語言的容忍 主要理由
Wirth 修正核心、保持概念一致
Ritchie 中→低 早期演化,後期既有實踐與標準
Stroustrup C/C++ 生態、工業遷移、ABI 與多領域

五十二、相容不是純美德

相容保護:

也保存:


第十部分 共同軸五:完整系統驗證

五十三、Wirth:從語言到處理器的閉環

Project Oberon 的理想驗證:

Language
→ Compiler
→ OS
→ UI
→ Network
→ Processor

設計者可以追蹤完整因果鏈。


五十四、Ritchie:以 Unix 作真實共演化平台

C 的驗證不是從零封閉建造所有硬體,而是:

C
↔ Unix Kernel
↔ Utilities
↔ Port
↔ Other OS environments

可攜成功比單一完整說明更重要。


五十五、Stroustrup:以多領域專案和生態驗證

C++ 不由單一 Project C++ 證明。

它由:

共同驗證。

這提高覆蓋,降低整體可理解性。


五十六、三種證據標準

Wirth完整小系統可被一體理解Ritchie真實 OS 可跨機器重建Stroustrup多領域大型生態可長期使用\begin{array}{c|c} Wirth & \text{完整小系統可被一體理解}\\ Ritchie & \text{真實 OS 可跨機器重建}\\ Stroustrup & \text{多領域大型生態可長期使用} \end{array}

第十一部分 共同軸六:治理

五十七、Wirth:集中設計與新版本替換

特徵:

優勢是概念一致;風險是採用和接班。


五十八、Ritchie:研究小組、文件與標準委員會

階段:

  1. Bell Labs 小組實作;
  2. K&R 公共文本;
  3. 多 Compiler 實踐;
  4. ANSI/ISO 委員會。

權力從個人和小組逐步轉移。


五十九、Stroustrup:創始者方向與公共標準共存

階段:

  1. C with Classes 個人原型;
  2. Bell Labs 使用者;
  3. 商業 Compiler;
  4. ANSI/ISO WG21;
  5. 全球 Library/Tool/Vendor。

Stroustrup仍具高度影響力,但沒有最終單人裁決。


六十、治理複雜度

GovernanceComplexityInstalledBase×StakeholderDiversity×CompatibilityCostGovernanceComplexity \propto InstalledBase \times StakeholderDiversity \times CompatibilityCost

這解釋了為何 C++ 的治理必然比 Oberon 複雜,而不必直接歸因於設計者性格。


第十二部分 三個具體案例

六十一、案例一:增加新抽象

Wirth

先問:

Ritchie

先問:

Stroustrup

先問:


六十二、案例二:歷史缺陷

Wirth

建立後繼語言,刪除錯誤。

Ritchie

若已形成大量實踐,透過 Warning、Cast、Lint、Standard 漸進收緊。

Stroustrup

很少移除;以:

建立推薦子語言。


六十三、案例三:初學者遇到低階成本

Wirth

應理解型別、資料結構和 Compiler,因為教育是系統能力的一部分。

Ritchie

應理解 Pointer、Memory 和表示,因為這些是系統工作的本體。

Stroustrup

應先使用高階 Container、RAII 和 Value type,仅在需要時下降到 Raw control。


第十三部分 誰保護誰

六十四、Wirth 的主要保護對象


六十五、Ritchie 的主要保護對象


六十六、Stroustrup 的主要保護對象


第十四部分 誰被犧牲

六十七、Wirth 路線可能犧牲


六十八、Ritchie 路線可能犧牲


六十九、Stroustrup 路線可能犧牲


第十五部分 反事實推演

七十、若 Wirth 面對 C++ 的 Installed base

他很可能不會直接接受所有歷史能力,但也可能無法以 Oberon 式方式重建全球工業平台。

因此:

WirthStyle+C++InstalledBaseOberonAtScaleWirthStyle + C++InstalledBase \neq OberonAtScale

七十一、若 Ritchie 在今日設計 C

不能假設他會完全複製 1973 C。

現代條件包括:

Ritchie 的穩定風格可能仍是薄層和機器透明,但具體安全機制可能不同。


七十二、若 Stroustrup 沒有 C 相容

可能得到:

也可能失去:

成功與複雜具有共同原因。


第十六部分 不能作出的錯誤排名

七十三、不能說 Wirth 最簡單所以最好

因為:


七十四、不能說 C 最接近機器所以最有效

現代效能還受:

影響。

高階抽象有時能產生更好最佳化。


七十五、不能說 C++ 功能最多所以最強

能力多也意味:


七十六、不能把三人化成性格漫畫

Wirth = 極簡潔癖
Ritchie = 放任高手
Stroustrup = 不會拒絕功能

這些都忽略歷史可行空間和設計者的自我反省。


第十七部分 統一比較矩陣

Wirth Ritchie Stroustrup
首要問題 系統不可理解 系統綁定機器 抽象與效率分裂
核心策略 刪減、正交、完整實作 薄抽象、可攜 Compiler 零額外成本、多範式
硬體暴露 受控邊界 廣泛直接 可高可低
安全責任 語言限制與小系統 使用者、工具、慣例 型別化抽象+Escape
Runtime 小且可解釋 最小、外部化 依抽象選擇,避免強制成本
相容性 可犧牲 早期變動、後期保守 核心契約
擴張方式 新語言/少量高覆蓋機制 Library/Toolchain Language+Template+Library
驗證方式 完整可理解系統 Unix 與跨機器 Port 多領域工業生態
治理 集中設計 小組→文本→標準 創始者影響+WG21
最大優勢 概念清楚 可攜控制 抽象與效能共存
最大代價 生態與相容 安全外移 語言與制度複雜

第十八部分 PLDST 三角模型

七十七、三個頂點

定義:

則三位設計者的重心可近似表示:

WirthUWirth \rightarrow U RitchieM+PRitchie \rightarrow M+P StroustrupK+A+MStroustrup \rightarrow K+A+M

其中 PP 為可攜, AA 為抽象。


七十八、不可同時極大化

若:

UU\uparrow

通常需要:

若:

MM\uparrow

通常需要:

若:

K+AK+A\uparrow

通常需要:


七十九、系統語言不可能三角

可提出:

完整可理解+最大機器自由+長期相容的高階擴張\boxed{ \text{完整可理解} + \text{最大機器自由} + \text{長期相容的高階擴張} }

難以同時極大化。

這不是形式不可能定理,而是從三個歷史案例抽取的工程張力模型。


第十九部分 對當代語言設計的啟示

八十、先聲明保護對象

設計新系統語言前應明確回答:

沒有語言能同時將所有群體成本降到最低。


八十一、把省略寫成正式決策

不加入某功能應記錄:

Wirth 的方法提醒:省略不是缺少設計。


八十二、把低階能力限制在可審查邊界

Ritchie 的歷史證明低階能力不可避免;C 的安全代價則證明能力若在全語言無邊界擴散,後代會承擔巨大成本。

現代語言應區分:


八十三、相容必須有預算

每保留一項歷史行為,都應計算:

Costcompat=Teaching+Tooling+Interaction+Security+Specification+MigrationDeferredCost_{\text{compat}} = Teaching + Tooling + Interaction + Security + Specification + MigrationDeferred

Stroustrup 的案例表明相容是成功來源,也可能是最大複雜度來源。


八十四、完整實作仍不可替代

即使語言最終服務全球生態,也應建立:

驗證設計。

三人都不是只寫語法規格。


八十五、治理應與 Installed base 一起設計

小型新語言可集中裁決。

成熟平台需要:


第二十部分 統一結論

Niklaus Wirth、Dennis Ritchie 與 Bjarne Stroustrup 代表的不是三種單純語言風格,而是三種對系統程式責任的回答。

Wirth 認為:

設計者首先有責任讓語言和完整系統仍能被人理解。若歷史功能阻礙這一點,就應刪除、重建或另立新語言。

Ritchie 認為:

系統語言必須誠實面對機器,保留真正需要的控制;但編譯器應把大部分程式結構從單一硬體中解放,使完整系統可以移植。

Stroustrup 認為:

使用者不應因追求抽象而失去效能和機器能力,也不應因設計者偏好而被迫放棄既有程式;抽象必須可負擔,相容必須被承擔。

本文對三者的最終 PLDST 判定為:

Wirth:Understandability-First Systems EthicRitchie:Portable Machine-Control EthicStroustrup:Compatibility-Constrained Abstraction Ethic\boxed{ \begin{aligned} Wirth &: \text{Understandability-First Systems Ethic}\\ Ritchie &: \text{Portable Machine-Control Ethic}\\ Stroustrup &: \text{Compatibility-Constrained Abstraction Ethic} \end{aligned} }

三種倫理各自具有不可替代價值:

Wirth

提醒我們:

Ritchie

提醒我們:

Stroustrup

提醒我們:

三者也各有不可忽視的代價:

Wirth:以生態和相容換取清楚Ritchie:以安全證明外移換取控制Stroustrup:以語言和治理複雜換取能力保存\boxed{ \begin{aligned} Wirth &: \text{以生態和相容換取清楚}\\ Ritchie &: \text{以安全證明外移換取控制}\\ Stroustrup &: \text{以語言和治理複雜換取能力保存} \end{aligned} }

最終,不存在脫離情境的最佳系統語言倫理。

真正可普遍化的原則是:

先說明不可犧牲的價值,再公開複雜度被轉移給了誰。\boxed{ \text{先說明不可犧牲的價值,} \quad \text{再公開複雜度被轉移給了誰。} }

若一門語言宣稱:

卻不說明代價轉移位置,它就尚未完成設計論證。

Wirth、Ritchie 和 Stroustrup 的共同歷史價值,正是三人都以不同方式使自己的取捨接受了真實實作、完整系統和長期使用的檢驗。


附錄 A 三人比較卡

Niklaus Wirth
保護對象:學習者、維護者、完整系統理解者
核心手段:刪減、型別、Module、完整實作
不可犧牲:概念清楚
主要代價:相容和生態

Dennis Ritchie
保護對象:系統實作者、移植者、硬體控制者
核心手段:薄抽象、Pointer、Structure、Compiler
不可犧牲:機器能力與可攜控制
主要代價:安全責任外移

Bjarne Stroustrup
保護對象:既有產業程式設計者、高效抽象使用者
核心手段:Class、RAII、Template、Zero-overhead、Standard
不可犧牲:能力、效能和相容
主要代價:語言、工具與治理複雜

附錄 B 統一評分向量

以下不是排名,而是相對風格位置,範圍 1–5:

Wirth Ritchie Stroustrup
完整可理解性優先 5 3 2
直接機器控制 3 5 5
高階抽象廣度 3 2 5
語言強制安全 4 1 3
向後相容優先 1 3 5
核心功能節制 5 5 2
Library/生態擴張 2 4 5
完整系統親自驗證 5 5 3
多方治理需求 1 3 5

此表是 PLDST 分析工具,不是客觀測量。


附錄 C 來源與參考文獻

[R1] Niklaus Wirth, “Modula-2 and Oberon,” HOPL III, revised 2006.
— 設計簡潔、Modula-2/Oberon 演化、先刪後加、Type extension、完整實作與限制。

[R2] Niklaus Wirth and Jürg Gutknecht, Project Oberon: The Design of an Operating System, a Compiler, and a Computer, 1992/2013.
— 完整系統、可理解性、Compiler、OS、硬體及共同作者。

[R3] Dennis M. Ritchie, “The Development of the C Language,” HOPL II, 1993.
— BCPL/B/C、PDP-11、Array/Pointer、Structure、Preprocessor、Unix 重寫及直接貢獻者。

[R4] Dennis M. Ritchie, “The Evolution of the Unix Time-sharing System,” 1979/1984 editions.
— Unix 歷史、組合語言到 C、Port、社會條件及完整系統演化。

[R5] Bjarne Stroustrup, “A History of C++: 1979–1991,” HOPL II, 1993.
— Simula+C、C with Classes、效率與彈性、真實專案、工具及標準化。

[R6] Bjarne Stroustrup, “Foundations of C++,” ETAPS, 2012.
— Hardware mapping、Zero-overhead、Type-rich programming、Resource management 及 Modern C++。

[R7] Niklaus Wirth, “A Plea for Lean Software,” 1995.
— 軟體膨脹、硬體進步、功能經濟與可靠性。

[R8] Brian W. Kernighan and Dennis M. Ritchie, The C Programming Language, 1978/1988.
— C 公共文本、Library、Reference 及 K&R 共同文化。

[R9] Bjarne Stroustrup, The Design and Evolution of C++, 1994.
— 相容性、功能取捨、使用者能力、RAII、多範式和標準前史。

[R10] ANSI/ISO C and C++ Rationale/WG14/WG21 historical materials.
— 現有實踐、公共標準、多方治理和相容性制度。

[R11] S. C. Johnson and D. M. Ritchie, “Portability of C Programs and the UNIX System,” Bell System Technical Journal, 1978.
— 可攜性的相對定義、環境依賴、系統移植及 Portable C Compiler。

[R12] Bjarne Stroustrup, “Thriving in a Crowded and Changing World: C++ 2006–2020,” HOPL IV, 2021.
— Problem-driven、Zero-overhead、Stability、Committee、Library 及長期相容演化。


附錄 D PLDST 比較標記

[W-U] Wirth: whole-system understandability
[W-R] Wirth: reduction before addition
[W-I] Wirth: implementability ethics

[R-M] Ritchie: machine transparency
[R-P] Ritchie: portable systems layer
[R-E] Ritchie: externalized safety responsibility

[S-Z] Stroustrup: zero-overhead abstraction
[S-C] Stroustrup: compatibility politics
[S-M] Stroustrup: multi-paradigm capability preservation

[C-E] Comparative ethics
[C-B] Burden allocation
[C-G] Governance under installed-base pressure

附錄 E 第二輪史實、概念與比較校對紀錄

E.1 Wirth 並非「永遠反對垃圾回收」

第二輪重新核對 Modula-2/Oberon 回顧與 Project Oberon:

因此本文將其立場校準為:

Memory-management mechanism 必須符合目標系統、型別安全與可理解性\text{Memory-management mechanism 必須符合目標系統、型別安全與可理解性}

而不是「Wirth 的設計倫理永遠排斥 GC」。


E.2 Project Oberon 的「完整」範圍

Project Oberon 的官方前言說明:

「完整系統」不表示:

本文將其用作「完整因果鏈驗證」案例,而非全球平台等價物。


E.3 Ritchie 對可攜性的正式定義

第二輪重新核對 Johnson/Ritchie 的 Portability 論文:

因此:

PortabilityImmediateMachineIndependencePortability \neq ImmediateMachineIndependence

本文使用的「擴大可攜核心、縮小機器邊界」與原始定義一致。


E.4 Ritchie 並非將所有安全問題都視為個人紀律

第二輪核對 C 歷史:

因此,Ritchie 的倫理不是「只信任高手、不需要工具」,而是:

保留低階自由
+
以 Type、Compiler、Lint、Library 和慣例逐步補強

只是其語言強制安全程度仍明顯低於 Wirth 路線及現代安全系統語言。


E.5 零額外成本的成本邊界

第二輪重新核對〈Foundations of C++〉:

因此本文沒有以零額外成本否認 C++ 在其他維度的巨大複雜度。


E.6 C++ 相容性不是偶然的後期負擔

Stroustrup 的早期 HOPL 回顧和 HOPL IV 長期回顧共同支持:

因此,C++ 複雜性同時來自:

原始多目標設計+C 相容+工業領域異質性+長期標準演化\text{原始多目標設計} + \text{C 相容} + \text{工業領域異質性} + \text{長期標準演化}

不能只歸因於委員會,也不能只歸因於創始者個人。


E.7 三人對安全的比較層級

本篇比較的是主要歷史語言及設計方向,而非宣稱:

更精確的層級是:

Wirth:
以較小語言、嚴格型別、Module 與受控低階邊界減少錯誤空間

Ritchie:
提供基本型別與結構,但把 Bounds、Lifetime、Alias 等大量義務外移

Stroustrup:
在 C 能力上建立 RAII、Container、Template 和型別化抽象,
但為相容與系統控制保留 Raw/Unsafe 路徑

E.8 三人的「完整系統驗證」不是同一種證據

第二輪校準後,本文保留三類不同證據:

Wirth

小型完整系統能否被整體說明和重建

Ritchie

真實作業系統能否以高階語言重寫並跨架構移植

Stroustrup

抽象機制能否在大量工業領域和多實作中維持效能與互操作

三者不能互相直接替代,也不構成單一分數排名。


E.9 Installed base 是因果變量,不是免責理由

本文把 Installed base 寫入歷史約束:

Ω=(TeamSize,InstalledBase,Hardware,UseCase,Institution,Time,MigrationCost)\Omega= ( TeamSize, InstalledBase, Hardware, UseCase, Institution, Time, MigrationCost )

它能解釋為何:

但 Installed base 不是保存所有缺陷的自動正當化理由。設計者與治理機構仍需評估:


E.10 「倫理」一詞的公開邊界

本文所稱系統語言倫理,是:

價值優先序
+
成本與風險配置
+
保護對象
+
權力及相容責任

它不是:

此詞用於讓被隱藏的責任轉移成為可討論對象。


E.11 比較矩陣的信心層級

高信心:

中高信心:

後者是本文根據多項決策的理論抽象,不是三位設計者本人正式提出的名稱或定理。