托尼·霍爾逝世:他發明了讓無數程序員頭疼的null

托尼·霍爾逝世:他發明了讓無數程序員頭疼的null

文章圖片

托尼·霍爾逝世:他發明了讓無數程序員頭疼的null

文章圖片

托尼·霍爾逝世:他發明了讓無數程序員頭疼的null

文章圖片


今天 , 計算機科學博客 Computational Complexity 披露了一則消息:圖靈獎得主、快速排序算法發明人、null 引用的提出者托尼·霍爾(Tony Hoare)于 2026 年 3 月 5 日在英國劍橋安然離世 , 享年 92 歲 。


圖 |(來源:Computational Complexity)

如果你寫過代碼 , 那么一定遇到過它:一個讓程序突然崩潰、屏幕上跳出紅色報錯的元兇——“NullPointerException” , 也就是我們常說的“null” , 代表“無效的 , 缺失的 , 無意義的 , 空值” 。


(來源:Autodesk)

這個讓無數程序員頭疼、讓無數系統宕機的概念 , 正是由霍爾在 1965 年親手引入 。 他后來稱之為“價值十億美元的錯誤” , 并在 2009 年的一場軟件大會上公開為它致歉 。

但他的一生也成就無數 , 霍爾是快速排序算法、霍爾邏輯、CSP 并發理論的奠基者 , 也是 20 世紀最具影響力的計算機科學家之一 。

從古典學到計算機:一段意外的旅程

托尼·霍爾 , 全名查爾斯·安東尼·理查德·霍爾(Charles Antony Richard Hoare) , 1934 年 1 月 11 日出生于錫蘭(今斯里蘭卡)科倫坡 。 父親是英國殖民地公務員 , 母親出身茶園主家庭 。 他在英國接受教育 , 先后就讀于牛津龍校和坎特伯雷國王學校 , 隨后進入牛津大學默頓學院 。 有趣的是 , 他主修的既不是數學也不是工程 , 而是古典文學與哲學 。

1956 年從牛津畢業后 , 霍爾在皇家海軍服役 18 個月 , 期間系統學習了俄語 。 這段語言訓練后來成為他人生的關鍵轉折:他以英國文化協會交換生身份前往莫斯科國立大學 , 師從數學家安德烈·柯爾莫哥洛夫 , 參與早期計算語言學與機器翻譯研究 , 由此他真正踏入了計算機科學領域 。


圖 | 托尼霍爾在莫斯科(來源:Not yet ready)

1960 年回國后 , 霍爾加入倫敦埃利奧特兄弟有限公司(Elliott Brothers Ltd) , 正式開啟編程生涯 。 訃告作者吉姆·邁爾斯(Jim Miles)在回憶文章中提到 , 霍爾曾擔任早期計算機的“演示員” , 足跡遍布全球 , 尤其是蘇聯 。 在那個年代 , 既精通俄語又懂計算機原理的人 , 實在鳳毛麟角 。

就在倫敦工作期間 , 霍爾完成了一件改變算法史的事 。

當時公司要求他實現一種排序算法 。 霍爾完成任務后告訴老板 , 自己其實知道一種更快的方法 。 老板半信半疑 , 回應說:“我賭你六便士 , 你做不到 。 ”但結果 , 快速排序(Quicksort)果真更快 , 賭注也如實兌現 。

霍爾晚年多次向朋友講述這段往事 , 每次都繪聲繪色 。 邁爾斯回憶 , 自己曾好奇這個“賭注”究竟是比喻還是真事 , 霍爾明確確認:那六便士他真的拿到了 。

快速排序發明于 1959 至 1960 年間 , 霍爾當時年僅 26 歲 。 這個算法至今仍是全球使用最廣泛的排序算法之一 , 幾乎出現在所有計算機科學的基礎教材中 。 毫不夸張地說 , 如今你每天使用的絕大多數軟件系統 , 都在某處運行著快速排序 。

憑借這項貢獻 , 以及他在編程語言理論、操作系統、并發模型等領域的系列成就 , 霍爾于 1980 年獲得計算機科學最高榮譽:ACM 圖靈獎 , 表彰他“在編程語言定義和設計方面的基礎性貢獻” 。 2001 年 , 他因對計算機科學的杰出貢獻獲封爵士 。

“我發明了它 , 我來道歉”

然而 , 讓霍爾在程序員群體中廣為熟知的 , 或許并非那些成就 , 而是一次公開的致歉 。

2009 年 , 在倫敦 QCon 軟件大會上 , 75 歲的霍爾站上臺 , 以一種罕見的姿態 , 向全場數百名工程師正式致歉 。 他稱 null 引用為“價值十億美元的錯誤”(the Billion Dollar Mistake) 。 因為一個小小的 null 在過去四十年間造成了無數錯誤、漏洞和系統崩潰 , 帶來的損失恐怕超過十億美元 。


(來源:InfoQ)

null 到底錯在哪里?要理解這一點 , 得回到 1965 年 。

彼時 , 霍爾正在設計 ALGOL W 語言的引用類型系統 。 他希望系統足夠安全 , 避免程序員因使用不存在的對象而導致程序崩潰 。 但在設計過程中 , 他引入了一個特殊值——null , 用于表示“這個引用目前什么都沒有指向” 。 邏輯上看 , 這似乎是個合理甚至有用的設計 。 但現實中 , 問題卻像滾雪球般擴大 。


因為 null 的本質是“什么都不是” , 所以它基本可以出現在任何需要\"某個東西\"的地方 , 冒充任何類型的引用值 。 而當代碼沒有檢查變量是否為 null 就直接使用時 , 程序就會在運行時崩潰 , 這就是所謂的“空指針解引用” 。

這類錯誤幾乎出現在所有主流編程語言中:Java 會拋出 NullPointerException , C/C++ 可能導致程序崩潰 , JavaScript 甚至同時存在 null 和 undefined 兩個相似概念 , 讓人困惑 。

更嚴重的是 , null 引發的漏洞還被黑客利用 , 成為安全攻擊的突破口 。 在底層系統中 , 如果程序在解引用指針前沒有檢查其是否為空 , 就可能觸發“空指針解引用” 。 在某些情況下 , 攻擊者甚至可以借此操控程序執行流程 , 從而實現提權或代碼執行 。

例如在 Linux kernel 的早期版本中 , 研究人員曾發現多處空指針解引用漏洞 。 由于當時系統允許用戶程序映射地址 0 , 攻擊者可以在該位置放置惡意代碼 , 再觸發內核錯誤 , 從而實現本地提權 。

類似問題也曾出現在 Mozilla Firefox 等瀏覽器軟件中 。 攻擊者通過構造特定網頁觸發空指針訪問 , 輕則導致瀏覽器崩潰 , 重則可能成為更復雜攻擊鏈的一部分 。

而且 , 有些魔幻的是 , null 帶來的麻煩還不只停留在代碼世界里 。
【托尼·霍爾逝世:他發明了讓無數程序員頭疼的null】
在美國 , 至今仍有許多姓 Null 的人 , 他們的日常生活被這個特殊字段攪得一團糟 。 由于 null 的特殊性 , 他們買機票時系統會認定為姓氏欄是空的 , 酒店預訂表單一填完就自動清空 , 簽證申請顯示\"用戶不存在\" 。 弗吉尼亞州的詹妮弗·努爾(Jennifer Null)向媒體承認說 , 越是重要的服務 , 越難跟系統講清楚自己“真實存在” 。

更離奇的遭遇者是約瑟夫·塔塔羅(Joseph Tartaro) 。 2016 年 , 他為了和妻子湊一對“NULL + VOID”的情侶車牌 , 向加州車管所申請了\"NULL\"號牌 。 2018 年他繳納了一張 35 美元的普通罰單 , 系統由此將他的信息與\"NULL\"字段綁定 , 此后 , 全州所有忘記填寫車牌號的空白罰單 , 都自動寄到了他名下 。 從弗雷斯諾到蘭喬庫卡蒙加 , 他從未涉足的城市接連發來罰單 , 累計金額超過 12000 美元 。

他在黑客大會“DEF CON”上公開講述此事 , 演講題目直接叫《去你的 NULL》 。

如何消除 null

過去幾十年間 , 語言設計者們紛紛嘗試從根本上解決這個問題 。 Java 后來引入了 Optional 類型 , Kotlin 在語法層面嚴格區分可空類型與非空類型 , Rust 則干脆取消 null , 改用 OptionT枚舉來表示\"有值\"或\"無值\"兩種狀態 , 并由編譯器強制要求程序員處理所有可能情況 。 Swift、Haskell、Elm 等語言也采用了類似思路 。

在這些新語言中 , 一個變量如果可能為空 , 它的類型本身就會明確標注 , 編譯器會拒絕那些忘記做空值檢查的代碼通過編譯 。

這場語言層面的變革 , 在一定程度上由霍爾那次坦誠的公開道歉所推動 。 他的“錯誤” , 反而成為了推動編程語言安全性進步的重要動力 。

瑕不掩瑜:霍爾的其他貢獻

在 null 和快速排序之外 , 霍爾還有許多影響深遠的成就 。

他提出的霍爾邏輯(Hoare Logic) , 是一套用數學方式驗證程序正確性的公理體系 。 簡單來說 , 它允許程序員用嚴格邏輯證明一段代碼“一定會做到它聲稱要做的事” , 而不只是靠測試碰運氣 。 這套理論奠定了形式化驗證領域的基礎 , 今天航空、汽車、核能等安全關鍵領域的軟件認證 , 仍在使用它的衍生工具 。


(來源:Wickopedia)

他發展的 CSP(通信順序進程) , 是描述并發程序行為的形式語言 。 Go 語言的 channel 機制、Erlang 的 Actor 模型 , 都在不同程度上受到 CSP 的影響 。 在多核、多線程計算早已普及的今天 , 這套理論的價值不言而喻 。

他還參與編寫了《結構化編程》一書 , 與迪杰斯特拉等人共同推動\"結構化編程\"思想的普及 , 終結了充斥著 goto 語句的混亂代碼時代 。

1977 年 , 霍爾受聘牛津大學 , 成為編程研究小組負責人 , 后來擔任首位克里斯托弗·斯特拉奇計算教授 , 直至 2000 年退休 。 此后 , 他在劍橋微軟研究院繼續工作 , 將畢生所學貢獻給學術社區 。


圖 | 霍爾相關成就和論文(來源:De Programmatica Ipsum)

邁爾斯的回憶文章中 , 還有一個令人印象深刻的細節 。

晚年時 , 霍爾與友人聊到計算機的未來:關于摩爾定律是否觸頂、量子計算能否破解現有加密算法 。 霍爾沉吟片刻 , 說了一句讓在場所有人都不禁深思的話:

“當然 , 我們擁有的東西根本無法接近政府能接觸到的 。 它們永遠遠遠領先于你能想象的 。 ”

當被追問是否相信量子技術已能破解大素數分解難題時 , 他只是聳了聳肩 。

誰也不知道 , 這是他真實掌握的內幕 , 還是故意用玩笑調侃提問者 。 據邁爾斯形容 , 霍爾極具幽默感 , 完全有能力用一本正經的諷刺把人帶進溝里 , 直到你恍然大悟這是個玩笑 。

邁爾斯還在文章中特別提到了霍爾的謙遜 。 在快速排序的“六便士賭注”故事里 , 有個細節尤為動人:霍爾在提出自己知道更快算法之前 , 老老實實先把公司要求的那個較慢算法完整實現了 。 他認為自己是對的 , 但沒有先叫板 , 而是先完成工作 , 再表達不同意見 。

這種專業精神貫穿了他整個職業生涯 。 霍爾不僅愿意承認別人的貢獻 , 也愿意公開承認自己的錯誤 。 他對 null 的那次道歉 , 在計算機科學界至今仍是一段佳話 , 不僅因為內容本身 , 更因為一位圖靈獎得主愿意就此公開站出來說“我錯了 , 我很抱歉” 。

真正的大師 , 不會因為榮耀而回避錯誤 , 反而正是通過正視錯誤 , 讓整個行業走得更遠 。 霍爾或許就是一個最好的詮釋 。

愿他安息 。

參考鏈接:
1.https://blog.computationalcomplexity.org/2026/03/tony-hoare-1934-2026.html

運營/排版:何晨龍

    推薦閱讀