一百年后,人類怎樣編程?轉(zhuǎn):一百后
2021-07-23
一百年后,人類將如何編程?轉(zhuǎn):一百年后,人類如何編程? 2011 年 3 月 30 日 13:37:35 一百年后的人類生活很難預(yù)測(cè),只有少數(shù)事情是確定的。到時(shí)候汽車就有了低空飛行的能力,城市規(guī)劃規(guī)定會(huì)放寬,樓房可以建上百層,大街上整天都看不到太陽,所有的女人都學(xué)會(huì)了自我-防御。本文只想討論一個(gè)細(xì)節(jié):一百年后,人們將使用什么語言來開發(fā)軟件?為什么這個(gè)問題值得思考?原因不是我們最終會(huì)使用這些語言,而是幸運(yùn)的話,從現(xiàn)在開始我們將能夠使用這些語言。我認(rèn)為編程語言就像生物物種。有一個(gè)進(jìn)化背景。許多分支最終將成為進(jìn)化的死胡同。這種現(xiàn)象已經(jīng)發(fā)生了。該語言流行了一段時(shí)間,但似乎沒有后續(xù)語言繼承其思想。就像尼安德特人一樣,進(jìn)化之路走到了盡頭。我預(yù)測(cè) Java 也會(huì)這樣做。有人寫道:“你怎么能說Java不會(huì)成功?它已經(jīng)成功了?!蔽艺J(rèn)為這取決于您的成功標(biāo)準(zhǔn)。如果標(biāo)準(zhǔn)是相關(guān)書籍的出版數(shù)量,或者認(rèn)為學(xué)習(xí)Java可以找到工作的大學(xué)生數(shù)量,那么Java確實(shí)成功了。當(dāng)我說Java不會(huì)成功時(shí),我的意思是它和那個(gè)一樣,進(jìn)化之路已經(jīng)走到了盡頭。
這只是我的猜測(cè),可能不正確。這里的重點(diǎn)不是看Java,而是建議編程語言有一個(gè)進(jìn)化的上下文,從而引導(dǎo)讀者思考某種語言在整個(gè)進(jìn)化過程中的位置在哪里?提出這個(gè)問題,不是為了讓后人感嘆我們一百年這么聰明,而是為了找到進(jìn)化的脊梁。它會(huì)激勵(lì)我們選擇接近主干的語言,這對(duì)當(dāng)前的編程是最有利的。在任何時(shí)候,選擇進(jìn)化的主干都可能是最好的解決方案。如果您不幸選擇了錯(cuò)誤的人并成為尼安德特人,那就太糟糕了。你的對(duì)手克魯馬努會(huì)不時(shí)攻擊你并偷走你所有的食物。這就是為什么我想在一百年后找出編程語言。我不想下錯(cuò)賭注。編程語言的進(jìn)化與生物的進(jìn)化還是有區(qū)別的,因?yàn)椴煌种У恼Z言會(huì)趨同。例如,該分支似乎與 的繼任者會(huì)合。理論上,不同的生物物種也可能會(huì)匯合,但可能性非常低,所以很可能從來沒有真正發(fā)生過。編程語言可能有聚合的一個(gè)原因是它的概率空間比較小,另一個(gè)原因是它的變異不是隨機(jī)的。語言設(shè)計(jì)者總是有意識(shí)地借鑒其他語言的設(shè)計(jì)思想。對(duì)于語言設(shè)計(jì)者來說,識(shí)別編程語言的進(jìn)化路徑特別有用,因?yàn)檫@樣他們就可以相應(yīng)地設(shè)計(jì)語言。這時(shí),認(rèn)清進(jìn)化的主心骨,不僅有助于識(shí)別現(xiàn)有的優(yōu)秀語言,還可以作為設(shè)計(jì)語言的指南。
任何編程語言都可以分為兩大組成部分:一組基本操作符(起到公理的作用)和除操作符以外的其他部分(原則上這部分可以用基本操作符表示)。我認(rèn)為基本運(yùn)算符是語言長期存在的最重要因素。其他因素不是決定性的。這有點(diǎn)像買房子首先要考慮地段。其他地方的問題以后會(huì)有辦法彌補(bǔ),但地理位置不能改變。仔細(xì)選擇公理是不夠的,但要控制其規(guī)模。數(shù)學(xué)家總是認(rèn)為公理越少越好,我認(rèn)為他們已經(jīng)達(dá)到了這一點(diǎn)。您仔細(xì)檢查語言的核心并考慮可以丟棄哪些部分。這至少是一個(gè)非常有用的培訓(xùn)。在我漫長的職業(yè)生涯中,我發(fā)現(xiàn)冗余的代碼會(huì)導(dǎo)致更多的冗余代碼。不僅是軟件,像我這種懶惰性格的人,我發(fā)現(xiàn)這個(gè)命題在床底下和房間角落里也是有效的。一塊垃圾會(huì)產(chǎn)生更多的垃圾。我的判斷是,只有那些內(nèi)核最小、最干凈的編程語言才會(huì)存在于進(jìn)化的主干上。語言的核心設(shè)計(jì)得越小越干凈,它的生命力就越頑強(qiáng)。當(dāng)然,猜測(cè)人們一百年后會(huì)使用什么編程語言本身就是一個(gè)很大的假設(shè)。也許一百年后,人類將不再編程,或者不再告訴計(jì)算機(jī)他們想要做什么,而計(jì)算機(jī)將自動(dòng)執(zhí)行。然而,到目前為止,計(jì)算機(jī)智能并沒有取得太大進(jìn)展。
我想一百年后,人們?nèi)匀粫?huì)使用相同的程序來控制計(jì)算機(jī)。今天可能有一些問題需要我們編程來解決,那個(gè)時(shí)候也不需要編程,但是我想會(huì)有很多和今天一樣的編程任務(wù)。您可能認(rèn)為只有自以為是的人才能預(yù)測(cè)一百年后的技術(shù)。但是,請(qǐng)不要忘記,軟件開發(fā)的歷史已經(jīng)走過了 50 年。在過去的 50 年里,編程語言的進(jìn)化非常緩慢,所以期待一百年后的語言并不是一個(gè)徒勞的想法。編程語言進(jìn)化緩慢的原因在于它們不是真正的技術(shù)。語言只是一種書寫方式,而程序則是一種嚴(yán)格遵守規(guī)則的描述,以書面形式記錄計(jì)算機(jī)應(yīng)該如何解決您的問題。因此,編程語言的進(jìn)化速度更像是數(shù)學(xué)符號(hào)的進(jìn)化速度,而不是現(xiàn)實(shí)技術(shù)(例如交通或通信技術(shù))的進(jìn)化速度。數(shù)學(xué)符號(hào)的演變是緩慢的漸進(jìn)變化,而不是真正技術(shù)的跨越式發(fā)展。不管一百年后計(jì)算機(jī)會(huì)是什么樣子,我們基本上可以得出結(jié)論,它們會(huì)運(yùn)行得更快。如果摩爾定律仍然成立,一百年后,計(jì)算機(jī)的速度將是現(xiàn)在 18 倍的 74 倍 10 倍(準(zhǔn)確地說是 73 786 976 294 838 206 464 倍)。很難想象。但實(shí)際上,更現(xiàn)實(shí)的預(yù)測(cè)并不是速度會(huì)提升這么多,而是摩爾定律最終不會(huì)成立。
不管是什么,如果每18個(gè)月翻一番,最后很可能會(huì)達(dá)到極限。但毫無疑問,當(dāng)時(shí)的計(jì)算機(jī)比現(xiàn)在快得多。即使最終只快了 100 萬倍,它也會(huì)從根本上改變編程的基本規(guī)則。如果其他條件不變,現(xiàn)在被認(rèn)為慢(也就是效率不高)的語言,未來會(huì)有更大的發(fā)展空間。屆時(shí),仍然會(huì)有一些應(yīng)用程序需要高運(yùn)行速度。我們希望計(jì)算機(jī)解決的一些問題實(shí)際上是計(jì)算機(jī)本身造成的。例如,計(jì)算機(jī)處理視頻的速度取決于生成這些視頻的另一臺(tái)計(jì)算機(jī)。此外,還有一些問題需要無限快的處理能力,比如圖像渲染、加解密、模擬運(yùn)算等。由于現(xiàn)實(shí)中有些應(yīng)用程序本身效率較低,而其他應(yīng)用程序會(huì)耗盡硬件提供的所有計(jì)算能力,那么擁有更快的計(jì)算機(jī)意味著編程語言必須處理更極端的情況,涵蓋更廣泛的效率要求。我們已經(jīng)看到這種情況發(fā)生。如果按照幾十年前的標(biāo)準(zhǔn)來衡量,一些用新語言開發(fā)的流行應(yīng)用程序會(huì)非常驚人地浪費(fèi)硬件資源。編程語言不光有這種現(xiàn)象,其實(shí)是大勢(shì)所趨。隨著科技的發(fā)展,每一代人都在做上一代人覺得浪費(fèi)的事情。 30 年前的人們看到我們今天這么隨意地打長途電話會(huì)感到震驚。
100年前的人,如果看到一個(gè)普通的包裹,還可以享受從波士頓寄出,經(jīng)過孟菲斯,一天到達(dá)紐約的待遇,會(huì)更加震驚。我已經(jīng)預(yù)測(cè)到,一旦硬件的性能在未來得到極大的提升,將會(huì)發(fā)生什么。新增加的計(jì)算能力將被破壞。當(dāng)我學(xué)習(xí)編程時(shí),計(jì)算機(jī)仍然很少見。記得當(dāng)時(shí)用的電腦型號(hào)是TRS-80,內(nèi)存只有4K。為了將程序加載到內(nèi)存中,我不得不刪除源代碼中的所有空格。一想到那些效率極低的軟件,重復(fù)一些愚蠢的計(jì)算,消耗硬件的全部計(jì)算能力,就覺得難以忍受。然而,我的反應(yīng)是錯(cuò)誤的。我就像一個(gè)出身貧寒的窮孩子。我不愿意聽到我要花錢。即使我把錢用在重要場合(比如去醫(yī)院),我也很難接受。某些廢物確實(shí)令人作嘔。例如,有些人討厭 SUV(運(yùn)動(dòng)型多功能車)。即使他們使用可再生清潔能源,他們也無法改變他們的看法,因?yàn)镾UV來自一個(gè)令人作嘔的想法(如何讓小卡車看起來更有男子氣概)。然而,并不是所有的浪費(fèi)都是壞的。如今電信基礎(chǔ)設(shè)施如此發(fā)達(dá),隨著時(shí)間的推移撥打長途電話有點(diǎn)問題。如果你有足夠的資源,你可以把長途電話和本地電話當(dāng)作一回事,一切都會(huì)變得更容易。
廢物可分為好廢物和壞廢物。我感興趣的是好的浪費(fèi),這意味著用更多的錢來獲得更簡單的設(shè)計(jì)。那么,問題就變成了我們?nèi)绾尾拍艹浞掷眯掠布鼜?qiáng)大的性能并最??有利地“浪費(fèi)”它們?對(duì)速度的追求是人類內(nèi)心深處根深蒂固的渴望。當(dāng)您將計(jì)算機(jī)視為小工具時(shí),您會(huì)不禁希望程序盡可能快地運(yùn)行。抑制這種欲望需要付出很大的努力。在設(shè)計(jì)編程語言時(shí),我們應(yīng)該有意識(shí)地問自己,什么時(shí)候可以放棄一些性能來換取一點(diǎn)便利。許多數(shù)據(jù)結(jié)構(gòu)存在的原因與計(jì)算機(jī)的速度有關(guān)。例如,今天的許多語言都有字符串和列表。從語義的角度來看,字符串或多或少可以理解為列表的一個(gè)子集,其中每個(gè)元素都是一個(gè)字符。那么,為什么我們需要將字符串作為數(shù)據(jù)類型分開呢?完全沒有必要這樣做。只是為了提高效率,所以字符串才會(huì)存在。但是,這種旨在加快運(yùn)算速度,卻讓編程語言的語義變得非常復(fù)雜的行為,是非常不可取的。編程語言設(shè)置字符串似乎是過早優(yōu)化的一個(gè)例子。如果我們將一門語言的核心設(shè)想為基本公理的集合,那么在核心中添加額外的公理只是為了提高效率,并不會(huì)帶來表達(dá)能力的提升。這絕對(duì)是一件壞事。是的,效率很重要,但我認(rèn)為修改語言設(shè)計(jì)并不是提高效率的正確方式。
正確的做法應(yīng)該是將語言的語義與語言的實(shí)現(xiàn)分開。從語義上講,不需要列表和字符串同時(shí)存在,僅列表就足夠了。在實(shí)現(xiàn)中,編譯器進(jìn)行了優(yōu)化,使其在必要時(shí)將字符串視為連續(xù)字節(jié)。對(duì)于大多數(shù)程序來說,速度并不是最關(guān)鍵的因素,所以你通常不需要擔(dān)心這種硬件層面的微觀管理。隨著計(jì)算機(jī)的速度越來越快,這一點(diǎn)變得越來越明顯。在設(shè)計(jì)語言時(shí),對(duì)實(shí)現(xiàn)的限制更少,也會(huì)使程序更加靈活。語言規(guī)范的變化不僅是不可避免的,而且也是合理的。通過編譯器的處理,按照以前的規(guī)范開發(fā)的軟件將照常運(yùn)行,提供了靈活性。 (論文)這個(gè)詞來自法語動(dòng)詞,意思是“試一試”。在這個(gè)原始意義上,一篇文章是你寫一篇文章并試圖找出一些東西。軟件也是如此。我認(rèn)為一些最好的軟件就像論文一樣,這意味著當(dāng)作者真正開始編寫這些軟件時(shí),他們不知道最終會(huì)產(chǎn)生什么結(jié)果。 Lisp 語言黑客早就明白數(shù)據(jù)結(jié)構(gòu)靈活性的價(jià)值。當(dāng)我們編寫程序的第一個(gè)版本時(shí),我們經(jīng)常以列表的形式處理所有內(nèi)容。因此,這些初始版本的效率可能出奇地低。您必須克制以抵制優(yōu)化它們。這就像吃牛排,所以你必須保持克制,以免去想牛排是從哪里來的,至少對(duì)我來說是這樣。是這樣的。
一百年后程序員最需要的編程語言是允許您毫不費(fèi)力地編寫程序的第一個(gè)版本的編程語言,即使以這種方式效率低得驚人(至少從我們今天的角度來看)。他們會(huì)說他們想要的是一種易于學(xué)習(xí)的編程語言。低效的軟件并不意味著糟糕的軟件。一種讓程序員無用的語言真的很糟糕。浪費(fèi)程序員時(shí)間而不是浪費(fèi)機(jī)器時(shí)間才是真正的低效率。隨著計(jì)算機(jī)越來越快,這將變得越來越明顯。我認(rèn)為放棄字符串類型是一個(gè)可以接受的想法。 Arc 語言已經(jīng)做到了這一點(diǎn),而且似乎運(yùn)行良好。一些過去難以用正則表達(dá)式描述的操作,現(xiàn)在可以用回歸函數(shù)非常簡單地表達(dá)。這種數(shù)據(jù)結(jié)構(gòu)扁平化的趨勢(shì)將如何發(fā)展?我非常努力地想象所有的可能性,結(jié)果連我自己都感到震驚。例如,數(shù)組會(huì)消失嗎?畢竟數(shù)組只是哈希表的一個(gè)子集,其特點(diǎn)是數(shù)組的鍵都是整數(shù)向量。此外,哈希表本身會(huì)被列表替換嗎?還有比這更驚人的預(yù)測(cè)。從邏輯上講,實(shí)際上沒有必要為整數(shù)設(shè)置單獨(dú)的表示,因?yàn)樗鼈円部梢钥醋魇橇斜?,整?shù)n可以用n個(gè)元素的列表來表示。這樣也可以完成數(shù)學(xué)運(yùn)算,但是效率無法承受。編程語言的發(fā)展會(huì)不會(huì)拋棄整數(shù)這一基本數(shù)據(jù)類型?我并不是要你認(rèn)真思考這個(gè)問題,而是要開闊你對(duì)未來的思考。
我只是提出一個(gè)假設(shè)的情況:如果一股不可抗拒的力量遇到一個(gè)不動(dòng)的物體,會(huì)發(fā)生什么。專門針對(duì)本文:當(dāng)一種難以想象的低效語言遇到一種難以想象的強(qiáng)大硬件時(shí)會(huì)發(fā)生什么。我認(rèn)為放棄整數(shù)類型沒有任何問題。未來相當(dāng)長。如果我們想減少語言核心中基本公理的數(shù)量,我們不妨看得更遠(yuǎn)一些,想想如果時(shí)間變量 t 趨于無窮大會(huì)發(fā)生什么。一百年是一個(gè)很好的參考指標(biāo)。如果你覺得一個(gè)想法在一百年后可能仍然不能被接受,那么它可能在一千年后仍然不能被接受。讓我說清楚,我并不是說所有整數(shù)運(yùn)算都使用列表來實(shí)現(xiàn)編程語言的發(fā)展,而是語言的核心(不涉及任何編譯器實(shí)現(xiàn))可以這樣定義。實(shí)際上,任何執(zhí)行數(shù)學(xué)運(yùn)算的程序都可能以二進(jìn)制形式表示數(shù)字,但這是編譯器的優(yōu)化,而不是語言內(nèi)核語義的一部分。另一種消耗硬件性能的方法是在應(yīng)用軟件和硬件之間設(shè)置許多軟件層。這也是我們看到的一個(gè)趨勢(shì),很多新興語言都被編譯成字節(jié)碼。比爾伍茲曾經(jīng)對(duì)我說,根據(jù)經(jīng)驗(yàn),每增加一層解釋,軟件的運(yùn)行速度就會(huì)慢一個(gè)數(shù)量級(jí)。但是,額外的軟件層可以使編程變得靈活。 Arc 語言的初始版本就是一個(gè)極端的例子。它的層數(shù)很多,運(yùn)行速度很慢,但確實(shí)帶來了相應(yīng)的好處。
Arc 是典型的“”() 解釋器,是在 Lisp 的基礎(chǔ)上開發(fā)的,很像 John 在他的經(jīng)典 Lisp 論文中定義的 eval 函數(shù)。 Arc解釋器只有幾百行代碼,所以很容易理解和修改。我們使用的 Lisp 版本是,它本身是在另一個(gè)字節(jié)碼解釋器的基礎(chǔ)上開發(fā)的。因此,我們總共有兩層解釋器。頂層的效率低得驚人,但語言本身是可用的。我承認(rèn)它幾乎不可用,但它確實(shí)有效。即使對(duì)于應(yīng)用程序,使用多層開發(fā)也是一種非常強(qiáng)大的技術(shù)。自底向上的編程方式是將軟件分成若干層,每一層都可以作為其上一層的開發(fā)語言。這種方法傾向于生成更小、更靈活的程序。它也是通向軟件可重用性 () - 圣杯的最佳途徑。根據(jù)定義,語言是可重用的。在編程語言的幫助下,您的應(yīng)用程序以這種多層形式開發(fā)的越多,其可重用性就越好。可重用性的概念或多或少與 1980 年代出現(xiàn)的面向?qū)ο缶幊逃嘘P(guān)。無論你如何尋找證據(jù),都不可能將這兩件事完全分開。一些使用面向?qū)ο缶幊涕_發(fā)的軟件確實(shí)是可以復(fù)用的,但這并不是因?yàn)樗褂昧嗣嫦驅(qū)ο缶幊?,而是因?yàn)樗拈_發(fā)方式是自下而上的。
以函數(shù)庫為例。它們是可重用的,因?yàn)樗鼈兪钦Z言的一部分,而不是因?yàn)樗鼈兪褂妹嫦驅(qū)ο蠡蚱渌幊谭椒?。順便說一句,我不認(rèn)為面向?qū)ο缶幊淘谖磥頃?huì)消亡。我覺得,除了某些特定的領(lǐng)域,這種編程方式實(shí)際上并沒有給優(yōu)秀的程序員帶來多少好處,但對(duì)大公司卻有著不可抗拒的吸引力。面向?qū)ο缶幊虨槟峁┝艘环N可持續(xù)開發(fā)亂碼代碼的方法。通過不斷的打補(bǔ)丁,讓你一步步把軟件做大。大公司總是傾向于以這種方式開發(fā)軟件。我預(yù)計(jì)一百年后也是如此。既然我們?cè)谡務(wù)撐磥恚敲醋詈谜務(wù)摬⑿杏?jì)算(),因?yàn)樗坪醪⑿杏?jì)算是為未來而存在的。不管你怎么想,并行計(jì)算似乎是未來生活的一部分。未來會(huì)實(shí)現(xiàn)嗎?在過去的二十年里,人們一直在說并行計(jì)算即將到來。但是,到目前為止,它并沒有對(duì)編程實(shí)踐產(chǎn)生太大影響。這是真的嗎?芯片設(shè)計(jì)人員必須考慮到這一點(diǎn),為多 CPU 計(jì)算機(jī)開發(fā)系統(tǒng)軟件的程序員也必須考慮到這一點(diǎn)。然而,真正的問題是,并行計(jì)算可以達(dá)到什么抽象級(jí)別?會(huì)不會(huì)影響一百年后開發(fā)應(yīng)用軟件的程序員?還是只是編譯器作者需要考慮的東西,在應(yīng)用軟件的代碼中無處可尋?一種可能是,在大多數(shù)可以使用并行計(jì)算的情況下,人們會(huì)放棄使用并行計(jì)算。
盡管我的一般預(yù)測(cè)是未來的軟件將浪費(fèi)大部分新硬件性能,但并行計(jì)算是一個(gè)特例。我估計(jì)隨著硬件性能的驚人提升,如果你明確說你想要并行計(jì)算,你肯定可以得到它,但你通常不會(huì)使用它。這意味著,除了一些特殊的應(yīng)用,一百年后的并行計(jì)算不會(huì)是那種大規(guī)模并行計(jì)算()。我期望對(duì)于普通程序員來說,一切更像是fork一個(gè)進(jìn)程,然后讓多個(gè)進(jìn)程在后臺(tái)并行運(yùn)行。這是在編程的非常后期階段要做的事情。它是對(duì)程序的優(yōu)化,類似于你想如何開發(fā)一個(gè)特定的數(shù)據(jù)結(jié)構(gòu)來替換現(xiàn)有的數(shù)據(jù)結(jié)構(gòu)。程序的第一個(gè)版本通常會(huì)忽略并行計(jì)算提供的各種好處,就像您在編程開始時(shí)忽略特定數(shù)據(jù)結(jié)構(gòu)的好處一樣。除了一些特定的應(yīng)用軟件,并行計(jì)算在一百年內(nèi)不會(huì)很流行。如果應(yīng)用軟件真的大量使用并行計(jì)算,那就是過早的優(yōu)化。一百年后會(huì)有多少編程語言?從最近來看,出現(xiàn)了大量的新語言。硬件性能的提升是原因之一,這讓程序員可以根據(jù)使用目的在運(yùn)行速度和編程便利性之間做出不同的權(quán)衡。如果這是未來的趨勢(shì),強(qiáng)大的硬件只會(huì)在一百年內(nèi)增加語言的數(shù)量。然而,另一方面,一百年內(nèi)可能只有幾種通用語言。
部分原因是基于我的樂觀。我相信以后,如果你的作品真的很優(yōu)秀,你可能會(huì)選擇一種易于開發(fā)的語言。用這種語言編寫的軟件第一版運(yùn)行速度很慢,只有編譯器優(yōu)化后運(yùn)行速度才會(huì)提高。既然我這么樂觀,那我就得做出預(yù)測(cè)了。有些語言可以達(dá)到機(jī)器的最高效率,而另一些語言則很慢,只能運(yùn)行。兩者之間存在巨大差距。我預(yù)測(cè),在一百年后,這個(gè)差距的每一個(gè)點(diǎn)都會(huì)有相應(yīng)的編程語言。因?yàn)檫@個(gè)差距越來越大,所以性能分析器()會(huì)變得越來越重要。目前,性能分析并未受到太多關(guān)注。許多人似乎仍然認(rèn)為,提高程序速度的關(guān)鍵在于開發(fā)能夠生成更快代碼的編譯器。代碼效率和機(jī)器性能之間的差距越來越大。我們會(huì)越來越清楚地看到,提高應(yīng)用軟件運(yùn)行速度的關(guān)鍵是要有一個(gè)好的性能分析器來幫助指導(dǎo)程序開發(fā)。我說以后可能只有幾種常用的語言,但具體領(lǐng)域使用的“小眾語言”()不算在內(nèi)。我認(rèn)為這些嵌入式語言的想法非常好,肯定會(huì)蓬勃發(fā)展。但我判斷這些“小眾語言”會(huì)被設(shè)計(jì)成相當(dāng)薄的一層,讓用戶一眼就能看到底層的通用語言,從而減少學(xué)習(xí)時(shí)間和使用成本。
誰來設(shè)計(jì)這些未來的語言?過去 10 年最令人興奮的趨勢(shì)之一是開源語言的興起,例如 Perl 和 Ruby。語言設(shè)計(jì)已被黑客接管。目前尚不清楚這是好是壞,但發(fā)展勢(shì)頭令人鼓舞。例如,Perl 有一些很棒的創(chuàng)新。然而,它也包含一些可怕的想法。這對(duì)于充滿侵略性和大膽探索的語言來說也是正常的。按照目前的變化速度,可能只有天知道 Perl 一百年后會(huì)是什么樣子。有句話說,如果你自己做不到,那就當(dāng)老師。這在語言設(shè)計(jì)領(lǐng)域并非如此。我認(rèn)識(shí)的一些最優(yōu)秀的黑客正在擔(dān)任教授。但是,老師也有很多事情是做不到的。研究職位對(duì)黑客施加了一些限制。在任何學(xué)術(shù)領(lǐng)域,都有一些題目可以做,有些則不能做。不幸的是,這兩種主題的區(qū)別通常取決于它們寫完后是否看起來很深,而不是它們對(duì)軟件行業(yè)的發(fā)展是否重要。也許最極端的例子是文學(xué)。文學(xué)研究者的任何成果對(duì)文學(xué)創(chuàng)作者幾乎沒有影響。雖然科學(xué)狀態(tài)要好一些,但研究人員可以做的主題和可以幫助設(shè)計(jì)好的語言的主題之間的交叉點(diǎn)小得令人沮喪。 (Olin 曾對(duì)這一點(diǎn)表示不滿,他說對(duì)了。
) 例如,關(guān)于變量類型的論文似乎層出不窮,盡管靜態(tài)類型語言似乎無法真正支持宏(在我看來,不支持宏的語言不值得使用)。新語言更多以開源項(xiàng)目的形式出現(xiàn),而不是研究項(xiàng)目。這是語言發(fā)展的趨勢(shì)。另一個(gè)發(fā)展趨勢(shì)是,新語言的設(shè)計(jì)者更多是需要使用它們的應(yīng)用軟件作者,而不是編譯器作者。這似乎是一個(gè)好趨勢(shì),我希望它會(huì)繼續(xù)下去。一百年后的物理學(xué)基本上是無法預(yù)測(cè)的。但是計(jì)算機(jī)語言是不同的。從理論上講,設(shè)計(jì)一種能在一百年內(nèi)吸引用戶的新語言似乎是可能的。設(shè)計(jì)一種新語言的方法之一是直接編寫你想編寫的程序,而不管是否存在編譯器,或者是否有支持它的硬件。這是假設(shè)您可以使用無限的資源。無論是今天還是一百年后,這樣的假設(shè)似乎都有道理。你應(yīng)該寫什么程序?無論你想要什么,只要你能用最少的努力寫出來。但請(qǐng)注意,這必須是在您的想法不受當(dāng)前使用的編程語言影響時(shí)。這種影響無處不在編程語言的發(fā)展,必須付出巨大的努力來克服。您可能會(huì)認(rèn)為,對(duì)于像人類這樣的懶惰生物來說,喜歡以最省力的方式編寫程序是很自然的。但實(shí)際上,我們的思想可能往往僅限于某種現(xiàn)有的語言,只采用這種語言的更簡單的形式,其對(duì)我們思想的抑制作用將是驚人的。
新語言必須靠自己去發(fā)現(xiàn),而不是靠讓你自然沉淪的心態(tài)。使用程序的長度作為它消耗的工作量的近似指標(biāo)是一種非常有用的技術(shù)。這里的程序長度當(dāng)然不是指字符數(shù),而是各種句法元素的總長度,基本上就是整個(gè)解析樹的大小。可能不是說最短的程序就是編寫最省力的程序,但是當(dāng)你想把程序?qū)懙煤啙嵍皇撬缮r(shí),你就離省力的目標(biāo)更近了,你的生活也會(huì)變得更好。所以,設(shè)計(jì)一門語言的正確方法就變成了,看一個(gè)程序,然后問問自己,你能不能把它寫得更短?事實(shí)上,一百年后用想象的語言編寫程序,這件事的可靠性取決于你對(duì)語言核心的估計(jì)是否足夠正確。常規(guī)排序,現(xiàn)在就可以寫了。但是,很難預(yù)測(cè)一百年后該語言將使用什么庫。圖書館所針對(duì)的許多領(lǐng)域可能根本不存在。例如,如果 SETI@home 項(xiàng)目成功,我們將需要一個(gè)用于聯(lián)系外星人的圖書館。當(dāng)然,如果外星文明高度發(fā)達(dá),已經(jīng)達(dá)到了以XML格式交換信息的地步,那么就不需要新的函數(shù)庫了。在另一個(gè)極端,我認(rèn)為今天你可以設(shè)計(jì)一個(gè)一百年后的語言核心。事實(shí)上,在某些人看來,大多數(shù)語言核心是在 1958 年設(shè)計(jì)的。
如果一百年后我們可以使用一種編程語言,我們會(huì)用它來編程嗎?觀察過去,了解現(xiàn)在。如果今天的編程語言可以用在1960年,那個(gè)時(shí)候的人會(huì)用嗎?在某些方面,答案是否定的。今天的編程語言所依賴的硬件在1960年并不存在。比如在這樣的語言中,正確的縮進(jìn)()在書寫時(shí)是非常重要的,但是1960年的計(jì)算機(jī)沒有顯示器,只有打印機(jī)終端,所以寫的不是很流暢。但是,如果排除這些因素(您可以假設(shè)我們只是在紙??上編程),那么 1960 年代的程序員會(huì)喜歡使用當(dāng)前語言進(jìn)行編程嗎? ,我想他們會(huì)的。一些缺乏想象力并且深受早期編程語言思想影響的人可能會(huì)覺得不可能。 (沒有指針運(yùn)算,怎么復(fù)制數(shù)據(jù)?沒有g(shù)oto語句,流程圖怎么實(shí)現(xiàn)?)但我認(rèn)為當(dāng)時(shí)最聰明的程序員一定能夠輕松使用今天的大多數(shù)語言,假設(shè)他們能拿到。如果一百年后我們現(xiàn)在可以擁有一種編程語言,那么它至少可以用來編寫出色的偽代碼。我們會(huì)用它來開發(fā)軟件嗎?因?yàn)橐话倌旰蟮囊环N編程語言需要為某些應(yīng)用程序生成快速的代碼,所以它生成的代碼很可能可以在我們的硬件上運(yùn)行,而且速度是可以接受的。與一百年后的用戶相比,我們可能需要對(duì)這種語言做更多的優(yōu)化,但總的來說,它仍然應(yīng)該給我們帶來凈收益。
現(xiàn)在,我們的兩個(gè)觀點(diǎn)是:1)一種一百年后理論上可以設(shè)計(jì)到今天的編程語言; 2)((如果今天能設(shè)計(jì)出這樣的語言,很可能是適合編程,可以產(chǎn)生更好的結(jié)果。如果我們把這兩個(gè)觀點(diǎn)聯(lián)系起來,那么就得出了一些有趣的可能性。為什么不嘗試 a a from now? When When you your , it's good to keep this goal in mind. When to , one to is to the car , not by the body with the line on the , but By at a in the . Even if your is only a few away, this is . I we do the same when a .