5.2 程式語言中的布林型別(1950–1990)#
1950–1990 年,布爾邏輯完成了另一次抽象升遷:從電路中的閘,升遷為程式語言裡的一等公民——布林型別(boolean type)。true 與 false 不再只是電壓高低,而是帶著名字的資料值,可以宣告、賦值、比較、返回。這一層抽象,使「判斷」本身成為可編程的對象。
開端:FORTRAN 的邏輯型別(1954–1957)#
IBM 的 FORTRAN(1954 年啟動,1957 年發布)是最早為高階語言引入邏輯型別(LOGICAL)的實踐者之一。程式員可以宣告
LOGICAL FLAG
FLAG = A .GT. B .AND. C .LE. D
IF (FLAG) GO TO 100
.AND.、.OR.、.NOT. 三個運算子正是布爾記號的文字化。注意因果次序:硬體已有布爾閘與條件分支指令(4.3、5.1),FORTRAN 只是把機器的原生能力翻譯成人類可讀的語法。語言設計永遠追著硬體的布爾結構走。
ALGOL 60 與 boolean 的標準化#
1960 年的 ALGOL 60 報告是關鍵的規範化時刻:它明確定義型別 boolean,並規定
- 邏輯運算子的嚴格記法 \(\land\)、\(\lor\)、\(\lnot\)、\(\supset\)(蘊涵);
- 布林表達式可作為條件語句
if B then S else S的守衛。
→ ALGOL 60 的結構化思想影響了整個歐陸語言譜系;其後 Dijkstra 對「正確性證明」的推動,見《希爾伯特傳記》第 5 章的邏輯證明計畫延伸脈絡。「程式 = 邏輯命題」的思想,正是布林「思維定律」在軟體時代的迴響。
C 語言的「無型別布爾」與務實路線#
1972 年的 C 語言走了一條奇特的路:沒有布林型別。C 用整數代替——0 為假,非零為真;比較與邏輯運算子 &&、||、! 返回 int。這條路線的因果解釋:
- C 的目標是貼近硬體的系統編程,而機器層面只有位元與字組;
- K&R 時期的極簡主義反對多餘型別;
0/非 0約定與組合語言的條件跳轉完全同構。
這證明了布爾邏輯的「滲透力」:即使語言拒絕命名它,&& 與 || 的短路求值、真值判定仍然嚴格遵循布林代數。而且 C 的短路求值引入了布爾代數原本沒有的語義細節——a && b 中若 a 為假則不評估 b——這是「邏輯 + 控制流」的混合體,後來成為許多語言(Java、JavaScript、Python)的標準行為。
flowchart TD
A[FORTRAN 1957 LOGICAL 型別] --> B[ALGOL 60 boolean 標準化]
B --> C[Pascal C:型別嚴格譜系]
B --> D[C 1972 無布林型別但保留邏輯運算]
C --> E[Java 1995 嚴格 boolean]
D --> E
D --> F[Python 1990s True False 一等物件]
E --> G[1990 布林型別成為語言標配]
F --> G型別嚴格化:Pascal 與 Java#
1970 年代 Pascal 把 boolean 定義為列舉型別 (false, true) 的序偶,並禁止整數與布林互轉——這是對 C 路線的哲學反駁:真值就是真值,不是「非零的數」。這條路線在 1995 年的 Java 中取得工業勝利:
if (flag == true) // 合法
if (flag == 1) // 編譯錯誤:布林與整數嚴格分離
Java 的選擇背後是軟體工程的因果邏輯:大型系統中,「把任何數當條件」是災難性 bug 的常見來源;型別系統強制分離,等於把布林代數的公理寫進編譯器。1990 年代以降,C++(bool)、C#(bool)、Python(True/False 作為一等物件,甚至是 int 的子類)相繼把布林型別列為標配。
事件年表#
| 年份 | 事件 | 後續影響 |
|---|---|---|
| 1957 | FORTRAN 引入 LOGICAL 型別 | 高階語言布爾化的開端 |
| 1960 | ALGOL 60 標準 boolean | 記法與語義的國際規範 |
| 1972 | C 語言以整數代真值 | 務實路線與短路求值 |
| 1970s | Pascal 嚴格布林型別 | 型別安全思想抬頭 |
| 1995 | Java 嚴格 boolean | 工業標準確立 |
小結#
1950–1990 年,布林型別的歷史是一場「命名與否、嚴格與否」的拉鋸:FORTRAN 與 ALGOL 命名了它,C 拒絕命名卻不得不實現它,Pascal 與 Java 最終把它鑄進型別系統。不論路線如何,所有語言的條件判斷都運行在 \(x \land \lnot x = \bot\) 的定律之上。而當布林值離開單機、進入海量文件的檢索與資料庫查詢時,它又獲得了第三重生命——這是 5.3 的故事。