John Backus 如何讓程式語言走向高階?FORTRAN、BNF 與函數式程式設計的長期影響
Q:John Backus 是誰? 他是 FORTRAN、編譯器技術與 BNF 語法表示法的重要先驅,後來也參與函數式程式設計思想的發展。
Q:FORTRAN 解決了什麼問題? 它讓科學與工程人員能用較接近數學與問題領域的語言表達計算,再由編譯器轉換成機器可執行形式,降低手寫機器碼的負擔。
Q:高階語言為什麼改變軟體工程? 它把程式意圖、資料結構與控制流程從硬體細節中抽離,使程式更容易閱讀、移植、維護與由不同人共同修改。
Q:編譯器在這條路徑中扮演什麼角色? 編譯器分析原始程式、建立中間表示、最佳化並產生目標碼;高階抽象能否落地,取決於編譯器正確性、效能與工具鏈。
Q:BNF 是什麼? BNF(Backus–Naur Form)用形式化規則描述語法,讓語言結構能被精確討論、實作與檢查,不是某一種程式語言本身。
Q:BNF 和編譯器有什麼關係? 語法規則可作為 parser 與語言工具的共同規格,幫助人與機器判斷程式是否符合語法;語法正確仍不代表語意、效能或結果一定正確。
Q:函數式程式設計和 FORTRAN 是同一條技術嗎? 不完全是。FORTRAN 主要推動科學計算與編譯器實用化,函數式思想關注函數、組合、狀態與副作用;Backus 的長期影響跨越不同語言範式。
Q:這些思想對今日 AI/資料工程有何啟示? 清楚的語法、抽象層、編譯器與可驗證中間表示,仍是讓人類意圖可靠映射到硬體、分散式系統與加速器的基礎。
Q:文章中的 John Backus 圖片能證明什麼? 圖片用於人物識別;它不單獨證明 FORTRAN 的全部設計、BNF 的唯一歸屬、編譯器效能或函數式程式設計的所有後續影響。
John Backus 的工作位置
John Backus 常被縮成「FORTRAN 之父」,但這個稱呼如果沒有技術細節,就無法解釋他的影響為何延續到編譯器、語法描述和函數式程式設計。更好的問題是:在程式仍像對機器做逐字指令的年代,工程師如何把科學家的數學意圖交給編譯器?當一種語言要被不同機器和不同團隊使用,語法又如何從散文說明變成可以檢查的規則?
IBM 的人物資料記錄 Backus 在 1950 年加入公司,先接觸 SSEC,後來參與 IBM 704、Speedcoding 與 FORTRAN;Computer History Museum 則把 FORTRAN、電腦系統理論、軟體專案管理和 BNF 並列為他的貢獻。這些工作不是一張互不相干的履歷,而是同一個設計方向的不同尺度:降低寫程式的成本、讓編譯器處理重複細節、再讓語言本身能被精確描述。
本文不把 Backus 寫成單人發明家。FORTRAN 是 IBM 團隊歷經多年設計和實作的結果,BNF 也在 ALGOL 的國際合作中由 Backus 提出方法、Peter Naur 進一步整理。理解他的角色,必須把個人洞見、團隊勞動、機器限制和後來標準化分開;只有這樣,讀者才看得出高階語言不是一句漂亮語法,而是一條從需求、翻譯、最佳化到相容性驗證的工程鏈。
FORTRAN、BNF 與函數式程式的工程工作
FORTRAN 的出發點是科學使用者不應再用低階指令逐格管理數值。程式設計師可以寫變數、算式、迴圈和陣列,編譯器則負責把它們翻譯成 IBM 704 能執行的指令。高階並不代表抽象到不必在意硬體,而是把常見的資料與控制模式寫成穩定語言,再由工具在目標機器上安排暫存器、記憶體和算術操作。
編譯器需要先讀懂文字,再建立可供後續階段處理的結構。詞法分析把字元分成識別字、數字和運算子,語法分析依照規則組成算式、指派和迴圈,接著語義檢查確認型別、名稱和控制流沒有矛盾。這條管線讓錯誤能在接近來源的位置被指出,也讓最佳化階段不必重新猜測程式設計師原本想表達什麼。
FORTRAN 的數值和陣列設計反映當時科學計算的工作負載。矩陣與向量需要連續存取、重複運算和浮點表示,編譯器若能辨認迴圈的界線,就可能安排更有效率的指令順序。這種自動化有清楚邊界:編譯器只能依照語言規則推導不會改變結果的變換,遇到別名、精度或輸入輸出副作用時,便需要保守處理。高階語言的便利因此建立在語義契約上。
把編譯器視為翻譯器還不夠,因為它也要處理資源取捨。大型程式若每一行都產生冗餘指令,科學計算便會受到速度和記憶體限制;若最佳化過度而忽略浮點誤差,結果又可能失去可信度。Backus 團隊面對的是一個完整的平衡:讓程式容易寫、讓編譯器有可行的分析空間、讓生成碼符合 IBM 704 的能力,並以實際範例反覆校對。
高階語言還改變了錯誤的形狀。低階程式常把位址、跳躍和暫存器錯誤直接暴露給作者;FORTRAN 則把許多細節交給編譯器,錯誤轉而可能出現在名稱拼寫、維度、型別、迴圈邊界和數值假設。這要求編譯器提供有用診斷,也要求使用者理解語言的預設行為。抽象若沒有可讀錯誤訊息和清楚文件,便只是在把困難移到另一個地方。
Backus 的另一條路線是語言結構的形式描述。BNF 用非終結符、終結符和產生規則表示一個語句如何由更小部件組成;例如,指派可以由變數、等號和算式構成,算式又可遞迴地包含運算子和括號。這種表示不是執行語意本身,卻能讓編譯器作者、標準委員會和工具開發者對「哪些字串算合法」有同一份可比對文本。
原始論文、標準與專案脈絡
IBM 的歷史資料把 1953 年描述為 Backus 組織小團隊尋找更容易使用的程式語言的起點,Computer History Museum 則說團隊經過約四年努力產生 FORTRAN,並成為科學與工程領域的全球標準。這些年份和評價要放在機器條件裡理解:當時每個程式都要付出高昂的人工時間,編譯器本身也必須在有限的記憶體和速度中完成翻譯。
Computer History Museum 的口述史讓團隊關係更立體。Backus 回憶核心成員約八人,Irv Ziller 等人逐步加入,管理層給予相對寬鬆的空間,團隊可以反覆討論困難問題。這不是把回憶當成完整會議紀錄,而是提醒我們:語言設計需要編譯器、範例、測試和同儕審查共同推進,不能只看一位領導者的最初想法。
BNF 的形成也不宜寫成一個人單方面完成的標準。口述史中 Backus 說自己把一份描述方法帶到 ALGOL 會議,Peter Naur 在整理語言時採用並改進它;他還說在此之前,語言常靠英文敘述和範例說明。這段回憶揭示的是協作和時機:一個簡潔的形式化方法能在需要比較、實作和審查時迅速取得價值,但名稱與最終標準仍屬共同工作。
BNF 的產生規則只描述句法,並不自動說明變數是否已宣告、數值是否溢位或函式呼叫會產生什麼副作用。編譯器因此還需要符號表、型別檢查、作用域規則和執行期語義。把語法圖誤當成完整語言規格,會讓人低估測試與文件的工作;正確的做法是把句法、靜態語義、動態語義和實作限制分成可驗證的層。
Backus 後來在函數式程式設計上的批判,則把視線從如何逐步命令機器拉到如何組合計算。函數級語言希望用函數組合和資料變換描述程式,而不是把每一次更新寫成命令;這能揭示並行與重用的可能性,也可能讓輸入輸出、狀態和效能成本更難直觀掌握。口述史中他承認這條路線既有成果也有未解問題,這種保留比把它包裝成取代所有命令式語言更準確。
現代開發與今日影響
現代編譯器仍沿用 Backus 時代建立的分層思考。前端把來源轉成抽象語法樹和中間表示,中端以資料流和控制流做檢查與最佳化,後端再配合目標處理器生成指令。即使語言加入泛型、非同步函式或借用檢查,工程師仍需要讓每個階段的輸入輸出可觀察,否則一個錯誤的轉換會在最後才以難懂的機器碼差異出現。
BNF 的精神也延伸到 DSL、設定檔和 API 契約。團隊可以先寫出命令、欄位和巢狀結構的文法,再為每條規則建立解析測試;當語法變更時,版本化的產生規則能提醒使用者哪些輸入仍相容。這不表示所有格式都要採用純 BNF,重點是把原本只存在於口頭約定的語法,轉成工具與人都能審查的明確規格。
科學軟體仍從 FORTRAN 的數值傳統受益。氣候模型、流體模擬和高效能運算需要陣列布局、向量化、平行迴圈和可重現的浮點計算;高階語言讓研究者表達模型,編譯器和函式庫則把計算映射到 CPU 或加速器。今日的挑戰是把效能最佳化和數值可信度一起測量,不能只看執行時間而忽略不同平台的誤差。
函數式思想在資料處理、串流和並行系統中也很常見。把轉換寫成沒有隱藏狀態的函數,能使測試、快取和重試更容易;但一旦涉及檔案、網路或共享資源,系統仍要明確處理副作用、取消和錯誤傳播。Backus 的提醒不是要求所有程式都變成純函數,而是促使設計者問:哪些狀態真的必要,哪些依賴可以用組合與資料流表達。
編譯器工具鏈還把團隊協作的成本納入設計。格式化器、靜態分析器、語法高亮、語言伺服器和自動補全,都依賴對語言文法與語義的共同理解;若規格不清,工具之間便會出現不同解析結果。把語法規則、錯誤診斷、相容性案例和版本記錄放在同一條驗證流程中,能讓語言演進不只靠作者記憶,而由可重跑的工具證據支持。
爭議、限制與常見誤讀
「FORTRAN 之父」是一個有用但不完整的入口。IBM 稱 FORTRAN 是第一個廣泛使用的高階語言,Computer History Museum 則強調團隊經過多年努力;這些說法不等於 FORTRAN 是歷史上第一個高階語言,也不等於 Backus 一人完成設計。更精確的寫法是指出它在科學與工程使用上的廣泛採用,以及 Backus 在團隊方向、編譯器和語言設計中的領導角色。
BNF 也常被誤說成完整的語言定義。它能清楚描述括號、關鍵字、運算子和巢狀結構,卻不能單靠產生規則保證型別、資源限制、浮點精度或執行期副作用。若團隊只更新文法而不更新語義、測試和工具,使用者仍會遇到「語法合法但行為錯誤」的問題。文法是規格的一層,不是所有規格的替代品。
把 FORTRAN 的編譯最佳化直接當成今日編譯器的全部方法也不恰當。當年的 IBM 704、記憶體與浮點硬體形成特定約束,今日處理器有快取、向量單元、分支預測和多核心;相同的迴圈可能需要不同布局和排程。可延續的是先定義語義不變量,再讓編譯器在證明安全的範圍內最佳化,而不是迷信某個歷史語法會在所有機器上最快。
Backus 對函數式程式設計的批判也不該被讀成對函數的否定。口述史記錄他認為函數式路線有成果,但沒有涵蓋所有需求,尤其是與狀態、輸入輸出和其他計算模型整合的問題。這是一個設計取捨,而不是二選一的教條;現代語言常把不可變資料、函數組合與命令式資源管理放在同一個程式中,正是對這種限制的實務回應。
口述史還有記憶與回顧的限制。Backus 在 2006 年回看五十年前的工作,能提供動機、團隊互動和自我評價,卻不能取代當時的設計文件、程式版本或會議紀錄。研究者應把口述內容和 IBM、Computer History Museum 的公開人物資料互相校對,對日期、作者和因果使用適當的不確定語氣。好的技術史不是把回憶當成唯一真相,而是讓不同證據彼此限定。
最後,高階語言並沒有消滅低階思考。當程式處理記憶體布局、數值穩定性、並行同步或硬體加速時,開發者仍需理解抽象下方的成本;編譯器能替人做許多重複工作,卻不能替人決定模型是否正確。Backus 的遺產因此不是「再也不用看機器」,而是讓人可以在更高的表達層思考,同時保留一條可檢查的翻譯與驗證路徑。

John Backus 的重要貢獻:把高階語言變成可翻譯的工程
John Backus 的歷史位置,不只是「FORTRAN 之父」這個稱號,而是他在 IBM 團隊中把科學家的數值意圖、編譯器的翻譯能力與語言的形式描述接在一起。IBM 官方人物資料適合核對他在 IBM 704、FORTRAN、Speedcoding 與 BNF 的工作;Computer History Museum 的人物頁和館藏頁則補足團隊、ALGOL 委員會、軟體專案管理與人物保存的脈絡。這些來源要一起讀,才不會把團隊成果壓縮成單人神話。
他的第一項重要貢獻,是讓高階語言足以承擔科學計算的實際工作。1950 年代的程式設計仍需要大量面向機器的細節,Backus 帶領的 FORTRAN 團隊把算式、變數、迴圈與陣列交給編譯器處理,讓使用者能更接近問題本身。這不是「抽象取代硬體」,而是重新分配責任:人描述模型,編譯器負責重複翻譯,工程師仍需檢查效能、數值誤差與機器限制。
| 貢獻面向 | 工程做法 | 歷史界線 |
|---|---|---|
| FORTRAN | 把科學數值計算提升到可讀、可編譯的高階表示 | 成果來自 IBM 團隊,不是 Backus 單人完成 |
| 編譯器與最佳化 | 讓高階表示能在早期硬體上產生可接受的執行效率 | 早期最佳化不能直接等同今日編譯器流水線 |
| BNF | 用形式規則描述語言文法,減少語法歧義 | Backus 與 Peter Naur 的角色和 ALGOL 協作需分開說明 |
| 函數式程式設計 | 探索以組合與轉換描述問題,而非只列逐步命令 | FP 的影響是研究與思想傳承,不等於現代語言由他直接設計 |
FORTRAN:把數學表達接到 IBM 704
FORTRAN 的關鍵不在於語法看起來像數學,而在於它讓編譯器第一次被要求大規模、可靠地處理高階程式。科學使用者可以寫算式、迴圈、陣列和函式,編譯器再將它們轉成目標機器的操作。這條翻譯路徑需要語法分析、符號管理、記憶體安排、程式碼生成與最佳化,也需要用真實數值問題驗證結果。
早期硬體條件讓這項工作更困難。記憶體、浮點運算、輸入輸出與編譯時間都有限,團隊不能只追求語言漂亮,還必須讓使用者願意等待編譯、相信結果並能在不同計算任務上重用程式。FORTRAN 因此改變了人與機器的分工:人不必逐行指定機器步驟,但仍須理解演算法和產生程式的成本。
把 FORTRAN 說成「完全消除低階思考」是不準確的。數值穩定性、陣列布局、輸入輸出、浮點誤差與效能仍然回到使用者身上;高階語言降低的是重複編碼成本,不是所有模型與硬體問題的難度。
BNF:讓語言文法從散文變成可檢查規則
Backus-Naur Form 的價值,是把程式語言的句法用形式產生式說清楚。讀者可以看到一個非終結符如何展開成其他符號,編譯器作者可以依照規則建立 parser,教材和標準文件也能引用同一種結構。語法因此不再只靠自然語言描述「大概可以怎麼寫」,而能被互相檢查。
BNF 也提醒我們,形式化不會自動解決所有問題。它主要描述句法,型別、語意、執行期行為、錯誤恢復和標準版本仍需要其他規格。Backus 在 ALGOL 國際合作中的角色、Peter Naur 對 ALGOL 60 報告的整理,以及後來各種 EBNF 方言,都應保留歷史分工。精確的文法是基礎,不是完整語言實作本身。
從 FORTRAN 到函數式程式設計
Backus 後來對函數式程式設計的探索,延伸了他對「如何降低逐步命令負擔」的關注。FP 風格傾向以函數組合、變換和代數關係描述問題,讓程式可以從較高層次推導。這種思路與 FORTRAN 的數值傳統不是簡單的互相取代,而是同一位研究者在不同年代面對不同表達成本的回應。
高階組合同樣有代價:讀者需要理解新的抽象,編譯器要保留可接受的效率,除錯工具要能追蹤轉換,團隊還要建立共同詞彙。Backus 的重要性在於他把「程式設計可以更接近問題」變成研究議題,不在於他預先決定了 Java、Python 或 Haskell 的全部方向。
團隊工程、失敗與歷史敘事
FORTRAN 是 IBM 團隊長期設計與實作的成果,團隊成員包括編譯器、數值方法、測試、文件與專案協調人員。Backus 的領導和想法很重要,但若只說他獨自發明一切,就會忽略 Lois Haibt、Harlan Herrick、Roy Nutt、Peter Sheridan 等人的實作與協作,也會誤讀 IBM 機器和使用者社群的作用。人物史的價值正在於把個人決策放回制度和團隊。
Backus 對失敗與反覆試驗的態度,也不應被改寫成「快速試錯就一定成功」。編譯器和語言設計的失敗可能造成錯誤結果、相容性成本或多年維護負擔;合理的試驗需要版本、測試資料、數值基準和清楚的回退方法。這個界線讓他的創新精神仍然能和可靠工程並存。
比較閱讀與今日可用的研究方法
可以把 Backus 與Niklaus Wirth 以語言簡潔、編譯器與教育建立可理解工具鏈並讀:兩人都把語言規格拉回可實作的編譯器,但對語言大小、系統與教學的取捨不同。也可與Margaret Hamilton 把有限資源與異常恢復納入飛行軟體比較,觀察可靠度不只來自抽象層,而要靠測試、團隊和任務邊界完成。
資料來源與編輯界線
本文以IBM 官方 John Backus 人物頁核對 FORTRAN、IBM 704、Speedcoding、BNF 與函數式程式設計脈絡,以Computer History Museum 人物頁核對團隊、ALGOL 合作和人物貢獻,以CHM 館藏入口補充原始資料查證路徑,並以CHM 官方 John Backus 原始圖檔核對文中照片。照片只用於人物辨識與 attribution,不是 IBM 704、FORTRAN 編譯器或 BNF 的技術證明。
John Backus 的重要貢獻可以濃縮成三件事:讓 FORTRAN 把科學計算帶入高階語言;讓 BNF 把程式語言文法變成可檢查的形式規則;再以函數式程式設計研究更高層次的問題表達。他留下的不是「抽象越高越好」的口號,而是要求語言設計同時回答使用者、編譯器、硬體、團隊與驗證的問題。
KEEP READING
接著讀什麼?
從同一主題繼續閱讀,或回到 YOLO LAB 的完整文章索引,找到下一個值得投入時間的問題。


發表迴響