NIKLAUS WIRTH 1984 ACM A.M. TURING 獎得主
瑞士聯邦理工學院 (ETH) 的 Niklaus Wirth 在 Association 於十月於 San Francisco 舉行的年會上榮獲 1984 年 ACM A.M. Turing 獎,以表彰他在開發一系列創新的電腦語言方面所做的傑出工作:Euler、ALGOL-W、Modula 和 Pascal。特別是 Pascal,在教學上變得非常重要,並為未來在電腦語言、系統和架構領域的研究奠定了基礎。Wirth 語言的標誌是其簡潔性、設計的經濟性以及高品質的工程,這使得語言的標記法看起來像是演算法思維的自然延伸,而不是外加的形式主義。
Wirth 在語言設計方面的能力輔以精湛的寫作能力。在 Communications of the ACM 1971 年 4 月號中,Wirth 發表了一篇關於 Structured Programming 的開創性論文("Pro-gram Development by Stepwise Refinement"),該論文推薦採用程式的 top-down 建構(即逐步細化程式存根,直到程式完全精確闡述)。由此產生的優雅而強大的闡述方法即使在 Structured Programming 的熱潮退卻後,至今仍是引人入勝的讀物。後來發表的兩篇論文,"Toward a Discipline of Real-Time Programming" 和 "What Can We Do About the Unnecessary Diversity of Notation"(分別發表於 CACM 1974 年 8 月和 11 月號),體現了 Wirth 對於尋求適當語言形式主義的持續和專注探索。
Turing Award 是 Association 對計算社群技術貢獻的最高認可,旨在紀念英國數學家 Alan M. Turing,他定義了電腦原型 Turing machine,並在第二次世界大戰期間協助破解德國密碼。
Wirth 於 1963 年在 University of California ht Berkeley 獲得博士學位,並在 Stanford University 擔任助理教授直至 1967 年。自 1968 年起,他在 ETH Zurich 擔任教授;從 1982 年到 1984 年,他擔任 ETH 電腦科學系 (Informatik) 主任。Wirth 近期的工作包括結合 Modula-2 語言設計和開發個人電腦 Lilith。在他的演講中,Wirth 簡述了他主要專案的歷史,並得出結論,強調指導他工作的原則。
February 1985 Volume 28 Number 2 Communications of the ACM 159
圖靈獎演講
從程式語言設計到電腦建構
從 NELIAC(透過 ALGOL 60)到 Euler 和 ALGOL W,再到 Pascal 和 Modula-2,最終到 Lilith,Wirth 對於尋找適合系統程式設計的適當形式主義的探索產生了引人入勝的見解和令人驚訝的結果。
NIKLAUS WIRTH
能夠獲得 Turing Award 是一種巨大的榮幸,獲得多年來工作的讚賞既令人欣慰也令人鼓舞。我謹代表 ACM 感謝將這項殊榮頒予我。特別巧合的是,我在我的職業生涯開始的 San Francisco 獲獎。
在我收到獲獎通知後不久,喜悅的心情就被必須發表 Turing 演講的意識沖淡了一些。對於一個工程師而不是演說家或傳教士來說,這項義務引起了一些明顯的焦慮。它提出的問題中最重要的是:人們對這樣的演講有何期待?有些人希望對個人的工作獲得技術見解,或期望評估其相關性或影響。另一些人希望聽到其背後思想是如何產生的。還有些人期望專家對未來趨勢、事件和產品發表聲明。還有人希望對當前籠罩著我們的現狀進行坦率的評估,或是讚美我們技術的巨大進步,或是哀嘆其癌變般的副作用和誇張。
在猶豫不決期間,我查閱了一些先前的 Turing 演講,發現一份關於個人工作歷史的簡要報告是完全可以接受的。為了不僅僅是娛樂,我將嘗試總結我認為自己從過去所學到的東西。坦白說,這個選擇非常適合我,因為我既不假裝比大多數人更了解未來,也不喜歡事後被證明是錯的。此外,就當前成就和不當行為進行說教並非我的主要強項。這並不意味著我對當前的計算景象沒有擔憂,尤其是它與商業主義之間的紛亂爭吵。
早期計算經驗
誠然,當我在 1960 年進入計算領域時,它既沒有像現在這樣受到商業關注,也沒有進入學術課程。在我於 Swiss Federal Institute of Technology (ETH) 學習期間,我唯一聽說電腦的地方是在 Ambros P. Speiser 開設的一門選修課上,他後來成為 IFIP 主席。由他開發的電腦 ERMETH 對普通學生來說幾乎無法接觸,因此我進入計算領域的啟蒙被推遲到我在加拿大 Laval University 參加數值分析課程。但遺憾的是,Alvac III E 機器大部分時間都出了故障,程式設計練習只能停留在紙上,形式是未經測試的十六進制代碼序列。
我的下一次嘗試稍微成功一些:在 Berkeley,我接觸了 Harry Huskey 的得意機器,Bendix G-15 電腦。儘管 Bendix G-15 通過產生結果帶來了一些成功的感覺,但程式設計藝術的核心似乎是巧妙地在磁鼓上分配指令。如果你忽略了這門藝術,你的程式運行速度可能會慢一百倍。但教育意義是清楚的:你不能忽略哪怕最小的細節。沒有辦法通過簡單地購買更多記憶體來掩蓋設計中的缺陷。回想起來,最吸引人的特點是機器的每一個細節都可見且可以理解。沒有什麼是隱藏在複雜電路、矽片或神奇作業系統中的。
轉向軟體與語言
另一方面,很明顯,未來的電腦必須更容易程式化。因此,我放棄了研究如何設計硬體的想法,轉而研究如何更優雅地使用它。我很幸運加入了一個研究小組,該小組正在開發——或者更確切地說,是改進——一個編譯器及其在 IBM 704 上的使用。該語言稱為 NELIAC,是 ALGOL 58 的一種方言。這種「語言」的好處很快就顯而易見,而將程式自動翻譯成機器碼的任務提出了具有挑戰性的問題。這正是一個人在攻讀博士學位時所尋找的東西。編譯器本身是用 NELIAC 編寫的,是一個極其錯綜複雜的爛攤子。這個主題似乎由 1% 的科學和 99% 的巫術組成,這種傾斜必須改變。顯然,程式應該按照與電子電路相同的原則來設計,即清晰地細分為僅有少量線路跨越邊界的零件。只有通過一次理解一個零件,才有希望最終理解整個程式。
這次嘗試受到了 ALGOL 60 報告出現的強勁推動。ALGOL 60 是第一種清晰定義的語言;其語法甚至以嚴格的形式主義進行了規範。這個教訓是,清晰的規範是可靠和有效實現的必要而非充分條件。與 ALGOL 的共同設計者之一 Aadrian van Wijngaar-den 的接觸更清晰地突出了中心主題:ALGOL 的原則能否進一步濃縮和結晶?
程式語言設計的冒險
因此,我的程式語言冒險開始了。第一個實驗導致了一篇學術論文和語言 Euler——一次穿越語言特性叢林的開荒之旅。結果是學術上的優雅,但實用性不大——幾乎是後來的資料類型化和結構化程式語言的對立面。但它確實為編譯器的系統設計奠定了基礎,希望在不損失清晰度的情況下擴展以容納更多設施。
Euler 引起了 IFIP 工作組的注意,該工作組正在規劃 ALGOL 的未來。由數值數學家設計並為數值數學家設計的語言 ALGOL 60 具有系統的結構和簡潔的定義,受到數學訓練人員的讚賞,但缺乏編譯器和工業支援。為了獲得認可,其應用範圍必須擴大。工作組承擔了提出後繼語言的任務,並很快分裂成兩個陣營。一方面是雄心勃勃的人,他們想在語言設計上樹立另一個里程碑;另一方面是那些認為時間緊迫、擴展 ALGOL 60 會是富有成效努力的人。我屬於後者,並提交了一份提案,但未獲採納。此後,該提案在 Tony Hoare(同一小組成員)的貢獻下得到改進,並在 Stanford University 的第一台 IBM 360 上實現。該語言後來被稱為 ALGOL W,並在幾所大學用於教學。
在此龐大的實現工作中的一個小插曲值得一提。新的 IBM 360 只提供了 assembler code 和當然的 FORTRAN。我和我的研究生都不特別喜歡它們作為設計編譯器的工具。因此,我鼓起勇氣定義了另一種語言,用來描述 ALGOL 編譯器:它是 ALGOL 與 assembler 所提供的設施之間的折衷,它是一種具有 ALGOL 語句結構和宣告的機器語言。值得注意的是,該語言在幾週內就定義出來;我在 Burroughs B-5000 電腦上四個月內編寫了 cross compiler,一位勤奮的學生在相同時間內將其移植到 IBM 360 上。這個準備工作大大加快了 ALGOL 的工作進度。儘管原本設想是為了滿足我們自己的即時需求並在此後廢棄,但它很快就擁有了自己的發展動力。PL360 在許多地方成為一種有效的工具,並啟發了為其他機器進行類似的開發。
具有諷刺意味的是,PL360 的成功也印證了 ALGOL W 的失敗。ALGOL 的應用範圍已經擴大,但作為系統程式設計的工具,它仍然存在明顯的缺陷。用單一語言解決許多需求的困難已經顯現出來,目標本身也受到了質疑。大約在此時發布的 PL/1 提供了進一步的證據來支持這一論點。瑞士軍刀的想法有其優點,但如果過度使用,刀子就會變成磨盤。此外,ALGOL-W 編譯器的體積增長超出了人們可以輕鬆掌握、心智上理解整個程式的範圍。尋求更簡潔且更適合系統程式設計的形式主義的願望並未實現。系統程式設計需要一個產生高效率代碼的高效率編譯器,並且該代碼運作時沒有固定的、隱藏的、龐大的所謂 run-time package。ALGOL-W 和 PL/1 都未能實現這一目標,原因在於語言複雜且目標電腦不夠理想。
Pascal 的設計與影響
1967 年秋天,我回到了瑞士。一年後,我得以組建一個由三名助理組成的團隊來實現後來被稱為 Pascal 的語言。擺脫了獲得委員會共識的限制,我得以專注於包含我認為必要的特性,並排除那些我認為其實現工作量與最終效益不符的特性。嚴格人力有限的限制有時反而是一種優勢。
偶爾有人聲稱 Pascal 是作為一種教學語言設計的。雖然這是正確的,但其用於教學並非唯一目標。事實上,我不相信在教學中使用對於任何實際任務都不足夠的工具和形式主義。以今天的標準來看,Pascal 對於程式設計大型系統顯然存在不足,但 15 年前,它代表了期望與實用之間的合理折衷。在 ETH,我們於 1972 年在程式設計課程中引入了 Pascal,實際上是克服了相當大的反對意見。事實證明它很成功,因為它讓教師能夠更專注於結構和概念,而非特性和怪癖,也就是說,更專注於原則而非技術。
我們的第一個 Pascal 編譯器是為 CDC 6000 電腦系列實現的。它是用 Pascal 本身編寫的。不需要 PL6000,我認為這是一個實質性的進步。儘管如此,生成的代碼明顯劣於 FORTRAN 編譯器為相應程式生成的代碼。速度是一個基本且易於衡量的標準,我們相信高階語言概念只有在性能損失消失或至少減少時,才能在工業界被接受。考慮到這一點,我們啟動了第二次努力——基本上是一人努力——來產生高品質的編譯器。這個目標由 Urs Ammann 在 1974 年實現,之後這個編譯器被廣泛分發,如今在許多大學和工業界使用。然而代價很高;生成好的(即即使不是最優的)代碼所需的工作量與語言和機器之間的不匹配成正比,而 CDC 6000 顯然不是為高階語言設計的。
再次具有諷刺意味的是,主要的效益卻出現在我們最沒有預料到的地方。在 Pascal 的存在為人所知後,幾個人向我們尋求協助,希望在各種其他機器上實現 Pascal,他們強調是為了教學,而速度並非壓倒性的重要。於是,我們決定提供一個為我們自己設計的機器生成代碼的編譯器版本。這個代碼後來被稱為 P-code。P-code 版本很容易構建,因為新的編譯器是作為逐步細化結構化程式設計的一個重要練習而開發的,因此前幾個細化步驟可以不做修改地採用。Pascal-P 在許多使用者中傳播該語言方面取得了巨大成功。如果我們有預知這場運動規模的智慧,我們會投入更多精力仔細設計和記錄 P-code。事實上,這只是為了滿足需求而集中進行的附帶工作。這表明即使有最好的意圖,人們也可能錯誤地選擇目標。
但 Pascal 真正獲得廣泛認可是在 Ken Bowles 在 San Diego 發現 P-system 可以很好地在新型微型電腦上實現之後。他開發一個包含集成編譯器、檔案管理器、編輯器和除錯器的合適環境的努力帶來了突破:Pascal 向成千上萬的新電腦使用者開放,他們沒有習以為常的習慣或被保持與過去軟體相容的衝動所束縛。
多程式設計與 Modula
同時,我結束了 Pascal 的工作,並決定研究引人入勝的多程式設計新主題,Hoare 在此奠定了可敬的基礎,Brinch Hansen 以其 Concurrent Pascal 引領了方向。試圖為多程式設計學科提煉具體規則的嘗試很快讓我將其表達為一小組程式設計設施。為了真正測試這些規則,我將它們嵌入一個片段式語言中,其名稱源於我的主要目標:程式系統的模組化。模組後來證明是這種語言的主要資產;它賦予了資訊隱藏的抽象概念具體形式,並結合了一種在單程式設計和多程式設計中同樣重要的方法。此外,Modula 包含表達併發程序及其同步的設施。
Xerox 休假與工作站概念
到 1976 年,我對程式語言和為現有電腦構建好的編譯器的令人沮喪的任務有些厭倦了,這些電腦是為老式的「手工」編碼設計的。幸運的是,我有機會在 Palo Alto 的 Xerox Corporation 研究實驗室度過一個休假年,在那裡,強大的個人工作站概念不僅誕生,而且付諸實踐。我不再與許多人共享一台龐大的、單一的電腦,並通過一根 3KHz 頻寬的電纜爭奪資源,而是使用放在我辦公桌下、通過 15MHz 通道連接的自己的電腦。任何事物增加 5000 倍的影響是不可預見的;它是壓倒性的。最令人振奮的感覺是,在為電腦工作了 16 年後,電腦現在似乎為我工作了。我第一次借助電腦處理日常信函和報告撰寫,而不是為別人使用而規劃新的語言、編譯器和程式。另一個啟示是,Mesa 語言的編譯器,其複雜性遠超 Pascal,可以在這樣的工作站上實現。這些新的工作條件在數量級上遠遠高於我在國內所經歷的,因此我決定嘗試也在那裡建立這樣的環境。
決定建造系統:Lilith
我最終決定深入研究硬體設計。這一決定得到了我對現有電腦架構的舊有的厭惡的加強,這些架構讓傾向於系統簡潔性的編譯器設計者生活艱難。設計和建造一個完整的電腦系統——包括硬體、微碼、編譯器、作業系統和程式公用程式——的想法很快在我腦海中形成——一個不受與 PDP-11 或 IBM 360,或 FORTRAN、Pascal、UNIX,或任何其他當前流行或委員會標準相容的限制的設計。
Lilith 專案:團隊與原則
但是,解放的感覺不足以在技術專案中取得成功。勤奮工作、決心、對本質和短暫事物的敏感感覺以及一部分運氣都是不可或缺的。第一個幸運的偶然事件是來自一位硬體設計者的電話,詢問是否有可能來我們大學學習軟體技術並獲得博士學位。為什麼不教他軟體,讓他教我們硬體呢?不久,我們兩人就成為一個有效的團隊,Richard Ohran 很快對新設計如此興奮,以至於他幾乎完全忘記了軟體和博士學位。這對我來說影響不大,因為我正忙於設計硬體部分;規範微碼和巨集碼,並對後者的解釋器進行程式設計;規劃整個軟體系統;特別是程式設計文本編輯器和圖形編輯器,兩者都利用了新的高解析度點陣圖顯示器和稱為 Mouse 的小奇蹟作為指向設備。這項程式設計高度互動公用程式的練習需要研究和應用與傳統編譯器和作業系統設計截然不同的技術。
整個專案如此多樣化且複雜,以至於開始它似乎是不負責任的,特別是考慮到我們只有少量兼職助理,平均約七人。最大的威脅是它會花費太長時間,無法維持我們兩位熱情者的堅持,也無法讓那些尚未體驗過工作站概念威力的人同樣熱情。為了將專案保持在合理的範圍內,我堅持了三條原則:目標是一個由單一使用者操作並用單一語言程式設計的單處理器電腦。值得注意的是,這些基石與當時的趨勢完全相反,當時的趨勢傾向於研究多處理器配置、分時多使用者作業系統以及你能集合的盡可能多的語言。
在單一語言的限制下,我面臨著一個困難的選擇,其影響將是廣泛的,即選擇一種語言。在現有語言中,沒有一種看起來有吸引力。它們既不能滿足所有要求,對編譯器設計者來說也並不特別吸引人,他知道任務必須在合理的時間內完成。特別是,該語言必須滿足我們在結構化設施方面的所有願望,這些願望基於 Pascal 的十年經驗,並且必須滿足迄今為止只能通過 assembler 編碼處理的問題。長話短說,選擇是設計一個結合了成熟的 Pascal 和實驗性的 Modula 的後代,即 Modula-2。模組是將通過冗餘檢查實現安全性的高階抽象要求與允許訪問特定電腦個別設施的低階設施這兩種矛盾需求結合在一起的關鍵。它讓程式設計師可以在系統的少數小部分中封裝低階設施的使用,從而保護他免於在意想不到的地方落入陷阱。
Lilith 專案成果
Lilith 專案證明,設計一個單一語言系統不僅可能,而且有利。從設備驅動程式到文本和圖形編輯器,所有東西都用同一種語言編寫。作業系統模組與使用者程式模組之間沒有區別。事實上,這種區別幾乎消失了,隨之消失的還有龐大的、笨重的駐留代碼塊的負擔,沒有人想要它,但每個人都不得不接受它。此外,Lilith 專案證明了良好匹配的硬體/軟體設計的好處。這些好處可以通過速度來衡量:Modula 程式執行時間的比較顯示,Lilith 通常優於 VAX 750,而 VAX 750 的複雜性和成本是 Lilith 的數倍。它們也可以通過空間來衡量:Modula 程式在 Lilith 上的代碼比在 PDP-11、VAX 或 68000 上的代碼短 2 到 3 倍,比在 NS 32000 上的代碼短 1.5 到 2 倍。此外,由於其指令集不匹配,這些微處理器的編譯器中生成代碼的部分比 Lilith 複雜得多。這個長度因素必須乘以較差的密度因素,這給現代微處理器宣傳的對高階語言的適用性投下了陰影,並揭示這些說法被誇大了。這些設計將被複製數百萬次的預期令人沮喪,因為它們僅憑數量就成為了我們的標準構建塊。不幸的是,半導體技術的進步如此之快,以至於架構的進步被掩蓋,似乎變得不那麼相關了。競爭迫使製造商在證明其有效性之前很久就將新設計固化在晶片中。而且,笨重的軟體至少可以修改,最多可以替換,而如今複雜性已經下降到晶片本身。而且我們幾乎沒有希望在將複雜性應用於硬體時比應用於軟體時更好地掌握它。
在這道柵欄的兩側,複雜性已經並將繼續對許多人保持強烈的吸引力。確實,我們生活在一個複雜的世界中,並努力解決本質上複雜的問題,這些問題往往需要複雜的機制。然而,這不應削弱我們對優雅解決方案的渴望,這些解決方案因其清晰性和有效性而令人信服。簡單、優雅的解決方案更有效,但比複雜的解決方案更難找到,而且需要更多時間,我們常常認為這是無法負擔的。
學到的原則
在結束之前,讓我嘗試提煉一下所提到的專案的一些共同特徵。一種很少被像在計算中這樣有效使用的非常重要的技術是引導法 (bootstrap)。我們幾乎在每個專案中都使用了它。在開發一個工具時,無論是程式語言、編譯器還是電腦,我都以這樣一種方式設計它,使其對下一步驟有利:開發 PL360 是為了實現 ALGOL W;Pascal 是為了實現 Pascal;Modula-2 是為了實現整個工作站軟體;而 Lilith 則提供一個適合我們所有未來工作的環境,範圍從程式設計到電路文件和開發,從報告準備到字體設計。引導法是從個人努力中獲益以及從個人錯誤中吸取教訓的最有效方式。
這使得及早區分本質和短暫變得強制。我一直努力確定並專注於那些本質的、能夠帶來無可置疑好處的東西。例如,在程式語言中包含一個連貫一致的資料類型宣告方案,我認為是本質的,而 for 語句的各種細節,或者編譯器是否區分大小寫字母,則是短暫的問題。在電腦設計中,我認為尋址模式的選擇以及提供完整一致的(有符號和無符號)算術指令集(包括對溢位的適當陷阱)是至關重要的;相比之下,多通道優先中斷機制的細節則相當邊緣化。更重要的是確保短暫的事物永遠不會影響核心設施的系統性、結構化設計。相反,短暫的事物必須適當地添加到現有的、結構良好的框架中。
拒絕包含各種「可能也很好」的設施的壓力有時很難。取悅別人的願望與一致設計目標相互干擾的危險非常真實。我一直努力權衡收益與成本。例如,在考慮包含一個語言特性或編譯器對一個相當頻繁的結構進行特殊處理時,必須權衡其收益與其實現及其存在的額外成本,這會導致系統更大。語言設計者在這方面常常失敗。我很高興承認 Ada 的某些特性在 Module-2 中沒有對應物,偶爾可能有益,但同時,我質疑它們是否值得付出代價。代價是巨大的:首先,儘管兩種語言的設計都始於 1977 年,但 Ada 編譯器直到現在才開始出現,而我們從 1979 年起就一直在使用 Module。其次,Ada 編譯器據說是非常龐大的程式,由數十萬行代碼組成,而我們最新的 Module 編譯器只有約五千行。我秘密地承認,這個 Module 編譯器已經達到了可理解複雜性的極限,我完全無法為 Ada 構建一個好的編譯器。但即使可以忽略構建不必要的大型系統所需的工作量和容納其代碼所需的記憶體成本,真正的成本隱藏在無數程式設計師試圖絕望地理解和有效使用它們的無形努力中。
所概述的專案的另一個共同特徵是工具的選擇。我相信工具應與產品相稱;它必須盡可能簡單,但不應更簡單。如果一個專案的很大一部分時間都花在掌握工具上,那麼這個工具實際上是事倍功半的。在 Euler、ALGOL W 和 PL360 專案中,人們投入了大量精力開發表驅動的 bottom-up 語法分析技術。後來,我回歸到簡單的 recursive-descent, top-down 方法,它易於理解且毫無疑問足夠強大,只要語言的語法選擇得當。在 Lilith 硬體的開發中,我們只使用了一個好的示波器;很少需要邏輯狀態分析儀。這是因為處理器採用了相對系統化、沒有技巧的概念。
每一個專案首先都是一個學習實驗。只有在發明時才能學得最好。只有通過實際進行開發專案,我才能對內在的困難有足夠的了解,並對可以掌握內在細節有足夠的信心。我從未將語言設計與其實現分開,因為如果沒有來自其編譯器構建的回饋,嚴格的定義對我來說似乎是自以為是且不專業的。因此,我參與了編譯器、電路、文本和圖形編輯器的構建,這涉及微程式設計、大量高階程式設計、電路設計、板級佈局,甚至電線纏繞。這可能看起來很奇怪,但我只是更喜歡親自動手實踐,而不是團隊管理。我還學到,研究人員更容易接受一個事實上、親力親為的團隊成員的領導,而不是一個組織專家,無論他是工業界的經理還是大學教授。我試著記住,以身作則通常是最有效的方法,有時也是唯一的方法。
結論與致謝
最後,這些專案中的每一個都是由熱情和成功的渴望推動的,因為知道這項努力是值得的。這或許是最重要,也是最難以捉摸和微妙的先決條件。我很幸運有團隊成員受到熱情的感染,這是我感謝他們所有寶貴貢獻的機會。我誠摯地感謝所有參與者,無論是直接參與團隊工作,還是間接形式的測試我們的成果並提供回饋,通過批評或鼓勵貢獻想法,或組建使用者社群。沒有他們,無論是 ALOGL W,還是 Pascal,還是 Module-2,還是 Lilith,都不會成為今天的樣子。這個 Turing Award 也表彰了他們的貢獻。
Author's Present Address: Niklaus Wirth, Xerox Research Center, 3333 Coyote Hill Road. Palo Alto. CA 94304.
Permission to copy without fee all or part of this material is granted provided that the copies are not made or distributed for direct commer-cial advantage, the ACM copyright notice and the title of the publication and its date appear, and notice is given that copying is by permission of the Association for Computing Machinery. To copy otherwise, or to republish, requires a fee and/or specific permission.
164 Communications of the ACM February 1985 Volume 28 Number 2