Lisp如何成為上帝自己的程式語言
這是Sinclair Target一篇文章,在Hackernews上引起大量 ofollow,noindex" target="_blank">討論 。正好 保羅艾倫去世了 ,一股計算機歷史的懷舊味道開始瀰漫開來,老人們現在可以出來蹦躂一下了。
當程式員討論不同程式語言的相對優點時,總是從不同方面談論,一種語言可能適合於系統程式設計,另一種語言可能更適合將其他程式粘合在一起完成一些臨時任務。語言具有不同的優勢,不考慮特定用例場景,一味聲稱自己的語言比其他語言更好,只會引發尖銳的辯論(如:PHP是世界上最好的語言?)
但是有一種語言似乎激發了一種特殊的普遍崇敬:Lisp。鍵盤十字軍會抨擊任何敢於暗示某種語言比其他語言更好,但是會承認Lisp處於另一個層面。
Lisp超越了用判斷其他語言好壞的標準了,因為普通程式設計師從未使用Lisp來構建過任何實用的東西,而且可能永遠不會,但是對Lisp的敬仰卻是如滔滔長江,Lisp通常有一些神祕屬性,每個人最喜歡的webcomic, xkcd。
至少有兩種描述Lisp方式:在一個漫畫中,某個豬腳獲得某種Lisp啟蒙,他似乎能夠理解宇宙的基本結構。在另一個漫畫,一個長袍、衰老的程式設計師把一堆括號遞給他的弟子,說括號是“發達文明時代的優雅武器”,暗示Lisp擁有原力的所有神祕力量。
另一個很好的例子是Bob Kanefsky對一首名為“God Lives on Terra”歌曲的模仿。他的模仿於20世紀90年代中期寫成並被稱為“永恆的火焰”,描述了上帝如何使用Lisp創造世界。以下是摘錄,但可以在GNU Humor Collection中找到完整的歌詞集:
我認為這個“Lisp Is Arcane Magic”文化模因是迄今為止最離奇,最迷人的事情。Lisp在象牙塔中被炮製作為人工智慧研究的工具,程式設計師會敦促對方“在你死之前嘗試Lisp” , 就好像它是某種令人放鬆的迷幻。
雖然Lisp現在是廣泛使用的第二古老的程式語言,僅比Fortran更年輕,甚至僅僅一年。
想象一下,如果您的工作是推廣新的程式語言。如果你能說服每個人你的新語言具有神聖的力量,那不是很好嗎?但你怎麼會這樣做?程式語言如何被稱為隱藏知識的神祕字型呢?
Lisp怎麼會這樣?
理論A:公理語言
Lisp的建立者John McCarthy最初並不打算讓Lisp成為計算原理的優雅昇華。但是,經過一兩個幸運的見解和一系列的改進之後,達到了Lisp的成就。保羅格雷厄姆認為:McCarthy“為程式設計做出貢獻類似於歐幾里德為幾何學所做的事情。” 人們可能會在Lisp中看到更深層次的含義,因為McCarthy其實部分地構建了Lisp,從根本上說,很難說他是發明了還是發現了它。
McCarthy在1956年達斯茅斯夏季人工智慧研究專案中開始考慮創造一種語言。夏季研究專案實際上是一個持續的,為期數週的學術會議,這是人工智慧領域的第一次。McCarthy當時是達特茅斯數學助理教授,他在提出這一事件時實際上創造了“人工智慧”一詞。大約十人左右參加了會議,有Allen Newell和Herbert Simon。
Newell和Simon一直在努力構建一個能夠在命題演算中生成證明的系統。他們意識到在計算機的本機指令集級別工作時很難做到這一點,所以他們決定建立一種語言 - 或者,正如他們所說的那樣,是一種“虛擬碼” - 這將有助於他們更自然表達他們的“邏輯理論機器”的運作,他們的語言,稱為“資訊處理語言”的IPL,更像是一種高階彙編方言,而不是我們今天所說的程式語言。Newell和Simon或許指的是Fortran,他指出當時正處於開發階段的其他“虛擬碼”是用標準數學符號表示方程式“專注”的,他們的語言專注於將命題演算中的句子表示為符號表達式列表。IPL中的程式基本上利用一系列組合語言巨集來操縱和評估這些列表中的一個或多箇中的表示式。
McCarthy認為:在Fortran風格的語言中使用代數表示式會很有用。所以他不太喜歡IPL。但他認為符號列表是模擬人工智慧問題的好方法,特別是涉及演繹的問題。這是麥卡錫建立代數列表處理語言的願望,這種語言類似於Fortran,但也能夠處理像IPL這樣的符號列表。
當然,Lisp今天不像Fortran。在接下來的幾年裡,麥卡錫關於理想的列表處理語言看起來應該是什麼樣的想法發生了變化。他的想法在1957年開始發生變化,當時他開始為Fortran的國際象棋遊戲程式編寫例程。長期接觸Fortran使McCarthy確信其設計存在一些不足之處,其中主要是尷尬的IF陳述。
在1958年的夏天,當McCarthy麥卡錫設計一個可以實現差異化的程式時,他意識到他的“真實”條件表示式使得編寫遞迴函式更容易,更自然。9差異化問題還促使麥卡錫設計了maplist 函式,該函式將另一個函式作為引數並將其應用於列表中的所有元素。10這對於區分任意多項的總和很有用。
這些東西都不能在Fortran中表達出來,因此,在1958年秋天,McCarthy讓一些學生開始實施Lisp。由於麥卡錫現在是麻省理工學院的助理教授,這些都是麻省理工學院的學生。當麥卡錫和他的學生將他的想法轉化為執行程式碼時,他們進行了更改,進一步簡化了語言。最大的變化涉及Lisp的語法。麥卡錫原本打算用這種語言包含一些名為“M表示式”的東西,這將是一層語法糖,使得Lisp的語法類似於Fortran。雖然M表示式可以轉換為S表示式 - Lisp眾所周知的括號括起來的基本列表--S表示式實際上是一個用於機器的低階表示。唯一的問題是是麥卡錫用方括號表示M表示式,11因此,Lisp團隊堅持使用S表示式,使用它們不僅代表資料列表,還代表函式應用程式。麥卡錫和他的學生也進行了一些其他的簡化,包括切換到字首表示法和記憶體模型更改,這意味著該語言只有一種真實型別。
1960年,麥卡錫發表了他關於Lisp的著名論文,稱為“符號表達式的遞迴函式及其機器計算。”到那時,這種語言已被削減到如此程度以至於麥卡錫意識到他具有“優雅的數學”的特徵。系統“而不僅僅是另一種程式語言。他後來寫道,對Lisp進行的許多簡化使其“變成了一種描述可計算函式的方式,比圖靈機器或遞迴函式理論中使用的一般遞迴定義更加整潔。” 因此,他在論文中提出了這一點。 Lisp既可以作為工作程式語言,也可以作為研究遞迴函式行為的形式。
麥卡錫通過建立一個非常小的規則集來向他的讀者解釋Lisp。保羅格雷厄姆後來在他的文章“利斯的根源”中使用更易讀的語言回顧了麥卡錫的步驟。保羅格雷厄姆能夠使用七個原始運算子,兩個不同的函式符號以及根據原始運算子定義的六個高階函式來解釋Lisp。Lisp可以通過如此小的一系列基本規則來指定,這無疑有助於它的神祕性。Lisp的設計幾乎似乎都受到計算邏輯的影響。Lisp與像“遞迴函式理論”這樣深奧的領域的原始聯絡應該讓Lisp今天有如此多的聲望也就不足為奇了。
理論B:未來的機器
根據著名名的黑客字典,Lisp在建立二十年後成為人工智慧研究的“母語”。早期,Lisp迅速傳播,可能是因為它的常規語法使得在新機器上實現它相對簡單。後來,研究人員會繼續使用它,因為它處理符號表達的能力很強,這在很多人工智慧具有象徵意義的時代非常重要。Lisp被用於開創性的人工智慧專案,如SHRDLU自然語言程式,Macsyma代數系統和ACL2邏輯系統。
然而,到了20世紀70年代中期,人工智慧研究人員的電腦容量已經耗盡。PDP-10,特別是每個人最喜歡的人工智慧工作機器 - 具有18位地址空間,對於Lisp AI程式來說越來越不足。許多人工智慧程式也應該是互動的,並且要求在分時系統上表現良好的互動式程式具有挑戰性。最初由麻省理工學院的Peter Deutsch提出的解決方案是設計一臺專門用於執行Lisp程式的計算機。
這些Lisp機器,將為每個使用者提供針對Lisp優化的專用處理器。他們最終還會提供完全用Lisp編寫的開發環境,供硬核Lisp程式設計師使用。Lisp機器是在微型計算機時代尾部的一個尷尬時刻設計的,但在微機革命全面開花之前,是程式設計精英的高效能個人計算機。
有一段時間,似乎Lisp機器將成為未來的潮流。幾家公司成立並開始將這項技術商業化。這些公司中最成功的一家名為Symbolics,由麻省理工學院人工智慧實驗室的資深人士創辦。在整個20世紀80年代,Symbolics生產了一系列被稱為3600系列的計算機,這些計算機在AI領域和需要高效能運算的行業中很受歡迎。3600系列計算機具有大螢幕,點陣圖圖形,滑鼠介面以及 強大的圖形和動畫軟體。這些令人印象深刻的機器能夠令人印象深刻。
結果,Symbolics機器非常昂貴。1983 年,Symbolics 3600的售價為110,000美元.因此,大多數人只能驚歎於Lisp機器的強大功能以及他們從遠處看Lisp寫作操作員的魔力。但奇蹟是他們做到了。從1979年到20世紀80年代末,Byte Magazine多次使用Lisp和Lisp機器。在1979年8月的期刊上,該雜誌的編輯特別讚揚了麻省理工學院正在開發的“機器記錄”和“高階作業系統”的新機器,聽起來很有前途,他們會製作前兩年 - 相比之下,Apple II,Commodore PET和TRS-80的推出看起來很無聊。半年後,1985年,一本Byte雜誌撰稿人描述了為“複雜,超級強大的Symbolics 3670”編寫Lisp程式,並敦促他的讀者學習Lisp,聲稱它既是“大多數AI工作人員的首選語言”,也很快成為通用程式語言。
我問保羅麥克喬斯,他為山景城的計算機歷史博物館做了大量的Lisp 儲存工作,關於人們第一次開始談論Lisp時,好像它是來自高維生物的禮物。他說,語言的固有屬性無疑與它有很大關係,但他也說Lisp與20世紀60年代和70年代強大的人工智慧應用程式之間的緊密聯絡也可能有所幫助。當Lisp機器在20世紀80年代開始購買時,麻省理工學院和斯坦福等地以外的一些人接觸到了Lisp的力量,並且傳說也在增長。今天,Lisp機器和Symbolics幾乎沒有人記住,但它們幫助保持了Lisp的神祕感,直到20世紀80年代後期。
理論C:學習程式設計
1985年,麻省理工學院教授Harold Abelson和Gerald Sussman以及Sussman的妻子Julie Sussman發表了一本名為“計算機程式的結構和解釋 ”的教科書。該教科書使用語言Scheme(一種Lisp方言)向讀者介紹了程式設計。
二十年來,這本書被用於教授麻省理工學院作為入門程式設計課程。我的預感是SICP(這本書標題通常縮寫)大約是Lisp的“神祕因素”.SICP採用了Lisp並展示瞭如何用它來說明計算機程式設計領域中深刻的、幾乎是哲學的概念。這些概念足夠普遍,任何語言都可以使用,但SICP的作者選擇了Lisp。因此,Lisp的聲譽因這本奇異而精彩的書的名聲而得到了增強,這本書引起了幾代程式設計師的興趣(也成了 一個非常奇怪的模因))。Lisp一直是“麥卡錫優雅的形式主義”; 現在它也是“那種教你隱藏程式設計祕密的語言。”
關於SICP究竟有多奇怪,值得關注一段時間,因為我認為這本書的古怪和Lisp的怪異在今天得到了混淆。奇怪的是從書的封面開始。它描繪了一個靠近桌子的巫師或煉金術士,準備執行某種巫術。一方面,他拿著一套卡鉗或一個指南針,另一方面他拿著一個刻有“eval”和“apply”字樣的地球儀。他對面的一個女人在桌子上示意; 在背景中,希臘字母lambda漂浮在半空中,散發著光芒。

老實說,這裡發生了什麼?桌子為什麼有動物腳?為什麼那個女人在桌子上打手勢?墨水池有什麼意義?我們是否應該得出結論,巫師已經解開了宇宙中隱藏的奧祕,而那些神祕的東西包括“eval / apply”迴圈和Lambda微積分?看起來似乎如此。僅此影象就已經做了大量工作來塑造人們今天如何談論Lisp。
但這本書的內容往往同樣奇怪。SICP與您閱讀過的大多數其他電腦科學教科書不同。它的作者在書的前言中解釋說,這本書不僅僅是關於如何用Lisp程式設計 - 而是關於“三個現象的焦點:人類的思想,計算機程式的集合和計算機。” 19後來,他們精心製作,描述他們的信念,即程式設計不應該被視為電腦科學的一門學科,而是應該考慮一個新的符號“程式認識論。” 程式是構建思想的一種新方式,只是偶然地被輸入計算機。本書的第一章簡要介紹了Lisp,但在此之後的大部分內容都是關於更抽象的概念。討論了不同的程式設計正規化,討論了面向物件系統中“時間”和“身份”的本質,並且一度討論了由於對發揮作用的通訊的基本限制而可能如何產生同步問題類似於相對論中光的固定速度。這是令人興奮的事情。
這一切並不是說這本書很糟糕。這是一本很棒的書。它討論了重要的程式設計概念,而不是我讀過的任何其他概念,這些概念我早就想知道但卻沒有完整的語言來描述。令人印象深刻的是,入門程式設計教科書可以如此快速地描述面向物件程式設計的根本缺陷以及最小化可變狀態的函式式語言的好處。令人興奮的是,這會變成對流正規化的討論,也許就像今天的 RxJS,可以給你兩全其美。SICP以一種讓人想起McCarthy最初的Lisp論文的方式提煉出高階程式設計的精髓。閱讀後你要做的第一件事是讓你的程式設計師朋友閱讀它; 如果他們檢視它,看看封面,但是不要讀它,他們帶走的只是一些神祕的,基本的“eval”和“apply”的東西賦予魔術師對動物腳的桌子的特殊權力。他們的鞋子也會給我留下深刻的印象。
但也許SICP最重要的貢獻是將Lisp從奇怪的怪異提升到教育必備。在SICP之前,人們告訴對方學習Lisp作為改進程式設計的一種方式。1979年Lisp雜誌的Byte雜誌證明了這一事實。同樣熱衷於麻省理工學院新Lisp機器的編輯也解釋說這種語言值得學習,因為它“代表了分析問題的不同觀點。” 22但SICP提出的Lisp不僅僅是其他語言的陪襯; SICP使用Lisp作為介紹語言,隱含地說明Lisp是掌握計算機程式設計基礎的最佳語言。當程式設計師今天告訴對方在他們死之前嘗試Lisp時,他們可以說很大程度上是因為SICP。畢竟,Brainfuck語言可能提供了“從中分析問題的不同觀點。”但人們學習Lisp是因為他們知道,在20年左右的時間裡,Lisp的觀點被認為是如此有用,以至於麻省理工學院在其他任何事情之前教給大學生Lisp。
Lisp回來了
在SICP釋出的同一年,Bjarne Stroustrup釋出了第一版“C ++程式語言”,該語言為大眾帶來了面向物件的程式設計。幾年後,Lisp機器市場崩潰,人工智慧冬季開始。在接下來的十年和變革中,C ++和Java將成為未來的語言,Lisp將被冷落。
當然不可能確定人們何時再次開始對Lisp感到興奮。但是,在Y-Combinator聯合創始人和黑客新聞建立者Paul Graham發表了一系列有影響力的文章推動Lisp成為初創公司的最佳語言之後,可能會發生這種情況。例如,在他的文章“擊敗平均數”中,格雷厄姆認為Lisp巨集只是讓Lisp比其他語言更強大。他聲稱在他自己的創業公司Viaweb使用Lisp幫助他比競爭對手更快地開發功能。一些程式設計師至少 被說服了。但是絕大多數程式設計師都沒有轉向Lisp。
相反的是,越來越多的Lisp-y功能已經被整合到每個人最喜歡的程式語言中。Python得到了列表理解。C#得到了Linq。Ruby得到了...好吧,Ruby 是一個Lisp。正如格雷厄姆在2001年所指出的那樣,“預設語言,體現在一系列流行語言中,逐漸演變為Lisp。”
雖然其他語言逐漸變得像Lisp一樣,但Lisp本身也設法保留其神祕的特殊聲譽。很少有人理解但每個人都應該學習的語言。1980年,在Lisp的20週年之際,麥卡錫寫道,Lisp中倖存了下來,只要它有,因為它佔領了“某種程式語言的空間近似區域性最優的。” 這低估了Lisp的真正影響力。Lisp半個多世紀以來一直沒有存活下來,因為程式設計師不情願地承認它是十年後這項工作的最佳工具; 事實上,即使大多數程式設計師根本不使用它,它仍然存在。由於它在人工智慧研究中的起源和應用,也許還有SICP的遺產,Lisp繼續吸引著人們。直到我們可以想象上帝用一些更新的語言創造世界,Lisp不會離開的。