跳轉到

1972 Edsger Dijkstra —— 「GOTO 有害」的宣言與最短路徑的算法#

「一位荷蘭程式設計師在 1968 年寫了一封兩頁半的信,整個產業 為之動搖。憑什麼一封信可以當成圖靈獎級的證據?」

案件檔案#

項目 內容
得主 Edsger W. Dijkstra (1930–2002)
得獎理由 程式設計的科學層面:最短路徑演算法、最優先佇列、信號量
關鍵詞 Dijkstra 演算法、信號量、結構化程式設計

前因#

1960 年代末「軟體危機」爆發:專案延期、錯誤叢生、成本失控。 Brooks 後來稱之「沒有銀彈」(1999 案)。疑點:為什麼程式會 大到沒有人能懂? 嫌疑人之一:GOTO 指令讓控制流像纏死的毛線球。

線索與推理#

案一:最短路徑(1956/1959)#

問題:荷蘭鐵路網任兩城最短路線。Dijkstra 手持鉛筆 20 分鐘 想出貪心演算法:

1. 起點距離 0,其餘 ∞
2. 取未定點中距離最小者 u,標記為確定
3. 鬆弛 u 的每個鄰居:dist[v] = min(dist[v], dist[u] + w(u,v))
4. 重複 2–3

時間複雜度:O(V²)(陣列版)→ 二元堆積 O(E log V)
正確性不變式:每次標記 u 時,dist[u] 已是全域最短
(因為任何繞過其他未定點的路徑只會更長 —— 邊權非負是關鍵前提!)

證明要點:貪心選擇性質成立的前提是 \(w(u,v) \ge 0\); 負邊權即失效,需改用 Bellman–Ford。這是「理論前提決定演算法 適用範圍」的教科書案例。

案二:信號量與併發(1965)#

T.H.E. 分時系統中,多個行程搶資源如何不撞車?Dijkstra 發明 信號量(semaphore)——一個原子操作計數器:

P(s): while s==0 wait; s--     (取得)
V(s): s++                      (釋放)

以 P/V 兩個原語操作表達互斥與同步,成為 OS 理論基石 (1983 UNIX 案、1992 Lampson 案均在其延長線上)。 他隨後提出哲學家進餐問題,作為死結(deadlock)的標準試金石。

案三:GOTO 有害論(1968)#

《Go To Statement Considered Harmful》:程式的正確性推理需要 控制流與文字順序對應。GOTO 使「靜態文字」與「動態執行」 脫鉤,歸納推理失效。解方:序列、選擇、循環三種結構——

  { P } S { Q }   的 Hoare 式推理只在結構化控制下可組合
  seq:{P}A{R} 且 {R}B{Q} ⟹ {P} A;B {Q}

理論評析#

Dijkstra 的核心哲學:程式不是寫給機器跑的,是寫給人讀的; 正確性應由構造獲得,而非事後測試。 這條線直通 Hoare 邏輯、 模型檢查(2007 案)與 Pnueli 時態邏輯(1996 案)。

後果#

  • 「structured programming」成為所有主流語言的預設形態。
  • 他的手寫備忘錄 EWD 系列(數百篇)是計算機科學最優美的 思想文獻。名言:「程式測試只能證明錯誤存在,不能證明錯誤不存在。」

關聯案件#

→ 1980-C.A.R.-Hoare與程式語言理論及CSP、1996-Amir-Pnueli與時態邏輯、1983-Ritchie-Thompson與UNIX作業系統