跳轉到

2020 Alfred Aho & Jeffrey Ullman —— 編譯器的聖經與語言的數學#

「1977 年出版、1986 年再版的『龍書』,是三代編譯器 工程師的共同啟蒙書。兩位作者證明:語言可以是一門 數學。」

案件檔案#

項目 內容
得主 Alfred V. Aho (1941–)、Jeffrey D. Ullman (1942–)
得獎理由 編譯器理論與程式語言實作的基礎演算法與理論
關鍵詞 龍書、正則表示式、LR 分析、Aho–Corasick

前因#

1970s,編譯器是黑魔法:每家廠商憑經驗手搓。 Knuth(1974 案)已給出 LR(k) 分析的理論(1965),但 從文法到可執行解析器的完整路線圖缺失。Aho 與 Ullman 在貝爾實驗室與普林斯頓的師徒網絡中接案。

線索與推理#

線索一:語言的喬姆斯基階層落地#

Chomsky(1956)的形式語言階層被兩人變成工程工具箱:

語言類 自動機 編譯器用途
正則(3 型) 有限自動機(1976 案的 NFA) 詞法分析(lex)
上下文無關(2 型) 下推自動機 語法分析
上下文有關/遞迴可列舉 圖靈機 語義以上

線索二:龍書(1977/1986《Compilers: Principles, Techniques, and Tools》)#

封面武士屠龍(龍 = 編譯器的複雜性)。體系:

前端:詞法(正則→DFA 最小化,Hopcroft 演算法 1986 案)
     語法(LL/LR:以棧+動作表,線性時間確定解析)
     語義(屬性文法:結點上的方程組求值)
中端:中間表示(IR)+ 資料流最佳化(2006 案的框架)
後端:指令選擇、暫存器分配(1987 案)、排程

把編譯器拆成可獨立證明與替換的階段——工程與理論 的完美介面。yacc/bison(Aho 參與)把 LR 分析自動化: 文法進、解析器出。

線索三:字串比對的經典演算法#

KMP(Knuth–Morris–Pratt, 1977):O(n+m),失配函數
Aho–Corasick(1975):多模式比對
  將所有模式建成 trie + 失配邊 = 確定性自動機
  grep 的多模式引擎、入侵偵測系統的核心

線索四:理論側翼#

Ullman 與 Hopcroft(1986 案)合著自動機經典教科書; 兩人合著《The Theory of Parsing, Translation, and Compiling》(1972–73)——編譯理論的數學總綱。 Ullman 亦是資料庫理論(資料依賴)與複雜度(二分圖、 join 演算法)的貢獻者;Google 的 Sergey Brin 是其 學生。

理論評析#

本案的偵探學:文法 = 生成語法,解析 = 逆向工程。

LL(1):由左至右、最左推導、向前看 1 個符號 → 遞迴下降(1984 案)
LR(1):由左至右、最右推導的逆 → 自底向上、能力最強的確定解析
  Knuth 1965:LR(k) ⊇ 一切確定可解析的 CFG
  實務取捨:LALR(1)(yacc)= 狀態合併的 LR → 表較小

語言設計者若不懂解析複雜度,語言就不可實作—— ALGOL 60(2005 案)的教訓被制度化。

後果#

  • LLVM/GCC/任何現代編譯器的課本骨架;ANTLR/lex/yacc 的理論根。
  • 正則表示式從理論玩具變成世界最廣用的「迷你語言」 (grep、sed、Regex 庫)。

關聯案件#

→ 1974-Donald-Knuth與演算法分析及TAOCP、1986-Hopcroft-Tarjan與演算法及資料結構、2006-Frances-Allen與編譯器最佳化