【杭州網(wǎng)站設(shè)計(jì)】一百年后,人類(lèi)怎樣編程?
分享 2011.03.30 瀏覽次數(shù):7559次
【杭州網(wǎng)站設(shè)計(jì)】一百年后,人類(lèi)怎樣編程?
很難預(yù)測(cè)一百年后的人類(lèi)生活,只有少數(shù)幾件事是可以確定的。那時(shí),汽車(chē)將具備低空飛行能力,城市規(guī)劃的法規(guī)將放寬,大樓可以造到幾百層,大街上一天到晚看不見(jiàn)太陽(yáng),女性個(gè)個(gè)都學(xué)過(guò)防身術(shù)。本文只想討論其中的一個(gè)細(xì)節(jié):一百年后,人們使用什么語(yǔ)言開(kāi)發(fā)軟件?
為什么這個(gè)問(wèn)題值得思考?原因不是我們最終會(huì)用上這些語(yǔ)言,而是幸運(yùn)的話,我們從現(xiàn)在開(kāi)始就能用上這些語(yǔ)言。
我認(rèn)為,編程語(yǔ)言就像生物物種一樣,存在一個(gè)進(jìn)化的脈絡(luò),許許多多分支最終都會(huì)成為進(jìn)化的死胡同。這種現(xiàn)象已經(jīng)發(fā)生了。 Cobol語(yǔ)言曾經(jīng)流行一時(shí),但是現(xiàn)在看來(lái)沒(méi)有任何后續(xù)語(yǔ)言繼承它的思想。它就像尼安德特人 一樣,進(jìn)化之路已經(jīng)走到了盡頭。
我預(yù)言 Java也會(huì)如此。有人寫(xiě)信說(shuō):“你怎么能說(shuō) Java不會(huì)成功呢?它已經(jīng)成功了。”我覺(jué)得這要看你的成功標(biāo)準(zhǔn)是什么。如果標(biāo)準(zhǔn)是相關(guān)書(shū)籍的出版量,或者是相信學(xué)會(huì) Java就能找到工作的大學(xué)生數(shù)量,那么 Java確實(shí)已經(jīng)成功了。當(dāng)我說(shuō) Java不會(huì)成功時(shí),我的意思是它和 Cobol一樣,進(jìn)化之路已經(jīng)走到了盡頭。
這只是我的猜測(cè),未必正確。這里的重點(diǎn)不是看衰 Java,而是提出編程語(yǔ)言存在一個(gè)進(jìn)化的脈絡(luò),從而引導(dǎo)讀者思考,在整個(gè)進(jìn)化過(guò)程中,某一種語(yǔ)言的位置到底在哪里?之所以要問(wèn)這個(gè)問(wèn)題,不是為了一百年后讓后人感嘆我們?cè)?jīng)如此英明,而是為了找到進(jìn)化的主干。它會(huì)啟發(fā)我們?nèi)ミx擇那些靠近主干的語(yǔ)言,這樣對(duì)當(dāng)前的編程最有利。
無(wú)論何時(shí),選擇進(jìn)化的主干可能都是最佳方案。要是你不幸選錯(cuò)了,變成了一個(gè)尼安德特人,那就太糟了。你的對(duì)手克魯馬努人時(shí)不時(shí)就會(huì)來(lái)攻打你,把你的食物全部偷走。
這就是我想找出一百年后的編程語(yǔ)言的原因。我不愿意押錯(cuò)賭注。
編程語(yǔ)言的進(jìn)化與生物學(xué)進(jìn)化還是有區(qū)別的,因?yàn)椴煌种У恼Z(yǔ)言會(huì)發(fā)生聚合。比如, Fortran分支看來(lái)正在與 Algol 的繼承者聚合。理論上,不同的生物物種也可能發(fā)生聚合,但是可能性很低,所以大概從來(lái)沒(méi)有真正出現(xiàn)過(guò)。
編程語(yǔ)言之所以可能出現(xiàn)聚合,一個(gè)原因是它的概率空間 比較小,另一個(gè)原因是它的突變不是隨機(jī)的。語(yǔ)言的設(shè)計(jì)者們總是有意識(shí)地借鑒其他語(yǔ)言的設(shè)計(jì)思想。
對(duì)于語(yǔ)言設(shè)計(jì)者來(lái)說(shuō),認(rèn)清編程語(yǔ)言的進(jìn)化路徑特別有用,因?yàn)檫@樣就可以照著樣子設(shè)計(jì)語(yǔ)言了。這時(shí),認(rèn)清進(jìn)化的主干就不僅有助于識(shí)別現(xiàn)存的優(yōu)秀語(yǔ)言,還可以把它當(dāng)作設(shè)計(jì)語(yǔ)言的指南。
任何一種編程語(yǔ)言都可以分成兩大組成部分:基本運(yùn)算符的集合(扮演公理的角色)以及除運(yùn)算符以外的其他部分(原則上,這個(gè)部分可以用基本運(yùn)算符表達(dá)出來(lái))。
我認(rèn)為,基本運(yùn)算符是一種語(yǔ)言能否長(zhǎng)期存在的最重要因素。其他因素都不是決定性的。這有點(diǎn)像買(mǎi)房子的時(shí)候你應(yīng)該先考慮地理位置。別的地方將來(lái)出問(wèn)題都有辦法彌補(bǔ),但是地理位置是沒(méi)法變的。
慎重選擇公理還不夠,還必須控制它的規(guī)模。數(shù)學(xué)家總是覺(jué)得公理越少越好,我覺(jué)得他們說(shuō)到了點(diǎn)子上。
你仔細(xì)審視一種語(yǔ)言的內(nèi)核,考慮哪些部分可以被摒棄,這至少也是一種很有用的訓(xùn)練。在長(zhǎng)期的職業(yè)生涯中,我發(fā)現(xiàn)冗余的代碼會(huì)導(dǎo)致更多冗余的代碼,不僅軟件如此,而且像我這樣性格懶散的人,我發(fā)現(xiàn)在床底下和房間的角落里這個(gè)命題也成立,一件垃圾會(huì)產(chǎn)生更多的垃圾。
我的判斷是,那些內(nèi)核最小、最干凈的編程語(yǔ)言才會(huì)存在于進(jìn)化的主干上。一種語(yǔ)言的內(nèi)核設(shè)計(jì)得越小、越干凈,它的生命力就越頑強(qiáng)。
當(dāng)然,猜測(cè)一百年后人們使用什么編程語(yǔ)言,這本身就是一個(gè)很大的假設(shè)。也許一百年后人類(lèi)已經(jīng)不編程了,或者直接告訴計(jì)算機(jī)想做什么,計(jì)算機(jī)就會(huì)自動(dòng)完成。
不過(guò),到目前為止,計(jì)算機(jī)智能并沒(méi)有取得太大進(jìn)展。我猜測(cè)一百年后,人們還是使用與現(xiàn)在差不多的程序指揮計(jì)算機(jī)??赡苡幸恍┪覀兘裉煨枰幊探鉀Q的問(wèn)題,那時(shí)已經(jīng)不需要編程了,但是我想,那時(shí)還會(huì)存在大量與今天一樣的編程任務(wù)。
你可能認(rèn)為只有那些自以為是的人才會(huì)去預(yù)言一百年后的技術(shù)。但是,請(qǐng)不要忘記,軟件發(fā)展的歷史已經(jīng)走過(guò)了 50年。在這 50年中,編程語(yǔ)言的進(jìn)化其實(shí)是非常緩慢的,因此展望一百年后的語(yǔ)言并不是虛無(wú)縹緲的想法。
編程語(yǔ)言進(jìn)化緩慢的原因在于它們并不是真正的技術(shù)。語(yǔ)言只是一種書(shū)寫(xiě)法,而程序則是一種嚴(yán)格符合規(guī)則的描述,以書(shū)面形式記錄計(jì)算機(jī)應(yīng)該如何解決你的問(wèn)題。所以,編程語(yǔ)言的進(jìn)化速度更像數(shù)學(xué)符號(hào)的進(jìn)化速度,而不像真正的技術(shù)(比如交通或通信技術(shù))的進(jìn)化速度。數(shù)學(xué)符號(hào)的進(jìn)化是緩慢的漸變式變化,而不是真正技術(shù)的那種跳躍式發(fā)展。
無(wú)論一百年后的計(jì)算機(jī)是什么樣子,我們基本上可以斷定它們的運(yùn)行速度一定會(huì)快得多。如果摩爾定律依然成立,一百年后計(jì)算機(jī)的運(yùn)行速度將是現(xiàn)在的 74乘以 10的 18次方倍(準(zhǔn)確地說(shuō)是 73 786 976 294 838 206 464倍)。真是讓人難以想象。不過(guò)實(shí)際上更現(xiàn)實(shí)的預(yù)測(cè)并不是速度會(huì)提高這么多,而是摩爾定律最終將不成立。不管是什么東西,如果每 18個(gè)月就增長(zhǎng)一倍,那么最后很可能會(huì)達(dá)到極限。但那時(shí)的計(jì)算機(jī)比現(xiàn)在快得多大概是毫無(wú)疑問(wèn)的。即使最后只是略微快了 100萬(wàn)倍,也將實(shí)質(zhì)性地改變編程的基本規(guī)則。如果其他條件不變,現(xiàn)在被認(rèn)為運(yùn)行速度慢的語(yǔ)言(即運(yùn)行的效率不高)將來(lái)會(huì)有更大的發(fā)展空間。
那時(shí),依然會(huì)有對(duì)運(yùn)行速度要求很高的應(yīng)用程序。我們希望計(jì)算機(jī)解決的有些問(wèn)題其實(shí)是計(jì)算機(jī)本身引起的。比如,計(jì)算機(jī)處理視頻的速度取決于生成這些視頻的另一臺(tái)計(jì)算機(jī)。此外,還有一些問(wèn)題本身就要求無(wú)限快的處理能力,比如圖像渲染、加密 /解密、模擬運(yùn)算等。
既然在現(xiàn)實(shí)中一些應(yīng)用程序本身的效率較低,而另一些應(yīng)用程序會(huì)耗盡硬件提供的所有運(yùn)算能力,那么有了更快速的計(jì)算機(jī)就意味著編程語(yǔ)言不得不應(yīng)付更多的極端情況,涵蓋更大范圍的效率要求。我們已經(jīng)看到這種情況發(fā)生了。要是以幾十年前的標(biāo)準(zhǔn)衡量,有一些使用新語(yǔ)言開(kāi)發(fā)的熱門(mén)應(yīng)用程序?qū)τ布Y源的浪費(fèi)非常驚人。
不僅編程語(yǔ)言有這種現(xiàn)象,這實(shí)際上是一種普遍的歷史趨勢(shì)。隨著技術(shù)的發(fā)展,每一代人都在做上一代人覺(jué)得很浪費(fèi)的事情。 30年前的人要是看到我們今天如此隨意地使用長(zhǎng)途電話,一定會(huì)感到震驚。 100年前的人要是看到一個(gè)普通的包裹竟然也能享受一天內(nèi)從波士頓發(fā)件、途經(jīng)孟菲斯、抵達(dá)紐約的待遇,恐怕就要更震驚了。
我已經(jīng)預(yù)測(cè)了,一旦未來(lái)硬件的性能大幅提高將會(huì)發(fā)生什么事。新增加的運(yùn)算能力都會(huì)被糟蹋掉。
在我學(xué)習(xí)編程的年代,計(jì)算機(jī)還是稀罕玩意。我記得當(dāng)時(shí)使用的微機(jī)型號(hào)是 TRS-80,它的內(nèi)存只有 4K,為了把 BASIC程序裝入內(nèi)存,我不得不把源碼中的空格全部刪除。我一想到那些極其低效率的軟件,不斷重復(fù)某些愚蠢的運(yùn)算,把硬件的計(jì)算能力全部占用,就感到無(wú)法忍受。但是,我的這種反應(yīng)是錯(cuò)的,我就像某個(gè)出身貧寒的窮孩子,一聽(tīng)到要花錢(qián)就舍不得,即使把錢(qián)用在重要場(chǎng)合(比如去醫(yī)院看?。┒加X(jué)得很難接受。
某些浪費(fèi)確實(shí)令人厭惡。比如有人就很討厭 SUV(運(yùn)動(dòng)型多用途車(chē)),即使它采用可再生的清潔能源也改變不了看法,因?yàn)?SUV來(lái)自一個(gè)令人厭惡的想法(如何使得小貨車(chē)看上去更有男子漢氣概)。但是,并非所有的浪費(fèi)都是壞的。既然如今的電信基礎(chǔ)設(shè)施已經(jīng)如此發(fā)達(dá),再掐著時(shí)間打長(zhǎng)途電話就有點(diǎn)錙銖必較了。如果有足夠的資源,你可以將長(zhǎng)途電話和本地電話視為同一件事,一切會(huì)變得更輕松。
浪費(fèi)可以分成好的浪費(fèi)和壞的浪費(fèi)。我感興趣的是好的浪費(fèi),即用更多的錢(qián)得到更簡(jiǎn)單的設(shè)計(jì)。所以,問(wèn)題就變成了如何才能充分利用新硬件更強(qiáng)大的性能最有利地“浪費(fèi)”它們?
對(duì)速度的追求是人類(lèi)內(nèi)心深處根深蒂固的欲望。當(dāng)你看著計(jì)算機(jī)這個(gè)小玩意,就會(huì)不由自主地希望程序運(yùn)行得越快越好,真的要下一番功夫才能把這種欲望克制住。設(shè)計(jì)編程語(yǔ)言的時(shí)候,我們應(yīng)該有意識(shí)地問(wèn)自己,什么時(shí)候可以放棄一些性能,換來(lái)一點(diǎn)點(diǎn)便利性的提高。
很多數(shù)據(jù)結(jié)構(gòu)存在的原因都與計(jì)算機(jī)的速度有關(guān)。比如,今天的許多語(yǔ)言都同時(shí)有字符串和列表。從語(yǔ)義上看,字符串或多或少可以理解成列表的一個(gè)子集,其中的每一個(gè)元素都是字符。那么,為什么還需要把字符串單列為一種數(shù)據(jù)類(lèi)型呢?完全可以不這么做。只是為了提高效率,所以字符串才會(huì)存在。但是,這種以加快運(yùn)行速度為目的、卻使得編程語(yǔ)言的語(yǔ)義大大復(fù)雜的行為,很不可取。編程語(yǔ)言設(shè)置字符串似乎就是一個(gè)過(guò)早優(yōu)化的例子。
如果我們把一種語(yǔ)言的內(nèi)核設(shè)想為一些基本公理的集合,那么僅僅為了提高效率就往內(nèi)核添加多余的公理,卻沒(méi)有帶來(lái)表達(dá)能力的提升,這肯定是一件很糟的事。沒(méi)錯(cuò),效率是很重要,但是我認(rèn)為修改語(yǔ)言設(shè)計(jì)并不是提高效率的正確方法。
正確做法應(yīng)該是將語(yǔ)言的語(yǔ)義與語(yǔ)言的實(shí)現(xiàn)予以分離。在語(yǔ)義上不需要同時(shí)存在列表和字符串,單單列表就夠了。而在實(shí)現(xiàn)上做好編譯器優(yōu)化,使它在必要時(shí)把字符串作為連續(xù)字節(jié)的形式處理。
對(duì)于大多數(shù)程序,速度不是最關(guān)鍵的因素,所以你通常不需要費(fèi)心考慮這種硬件層面上的微觀管理。隨著計(jì)算機(jī)速度越來(lái)越快,這一點(diǎn)已經(jīng)越發(fā)明顯了。
語(yǔ)言設(shè)計(jì)時(shí),對(duì)實(shí)現(xiàn)方式少作限制還會(huì)使得程序具備更大的靈活性。語(yǔ)言的規(guī)格發(fā)生變化不僅是無(wú)法避免的,也是合理的。通過(guò)編譯器的處理,按照以前規(guī)格開(kāi)發(fā)的軟件就會(huì)照常運(yùn)行,這就提供了靈活性。
essay(論文)這個(gè)詞來(lái)自法語(yǔ)的動(dòng)詞 essayer,意思是“試試看”。從這個(gè)原始意義來(lái)說(shuō),論文就是你寫(xiě)一篇文章,試著搞清楚某件事。軟件也是如此。我覺(jué)得一些最好的軟件就像論文一樣,也就是說(shuō),當(dāng)作者真正開(kāi)始動(dòng)手寫(xiě)這些軟件的時(shí)候,他們其實(shí)不知道最后會(huì)寫(xiě)出什么結(jié)果。
Lisp語(yǔ)言的黑客早就明白數(shù)據(jù)結(jié)構(gòu)靈活性的價(jià)值。我們寫(xiě)程序的第一版時(shí),往往會(huì)把所有事情都用列表的形式處理。所以,這些最初版本可能效率低下得驚人,你必須努力克制自己才能忍住不動(dòng)手優(yōu)化它們,這就好像吃牛排的時(shí)候必須努力克制自己才能不去想牛排是從哪里來(lái)的一樣,至少對(duì)我來(lái)說(shuō)是這樣的。
一百年后的程序員最需要的編程語(yǔ)言就是可以讓你毫不費(fèi)力地寫(xiě)出程序第一版的編程語(yǔ)言,哪怕它的效率低下得驚人(至少按我們今天的眼光來(lái)看是如此)。他們會(huì)說(shuō),他們想要的就是很容易上手的編程語(yǔ)言。
效率低下的軟件并不等于很爛的軟件。一種讓程序員做無(wú)用功的語(yǔ)言才真正稱(chēng)得上很爛。浪費(fèi)程序員的時(shí)間而不是浪費(fèi)機(jī)器的時(shí)間才是真正的無(wú)效率。隨著計(jì)算機(jī)速度越來(lái)越快,這會(huì)變得越來(lái)越明顯。
我覺(jué)得,放棄字符串類(lèi)型已經(jīng)是大家可以接受的想法了。 Arc語(yǔ)言已經(jīng)這樣做了,看上去效果不錯(cuò)。以前用正則表達(dá)式很難描述的一些操作,現(xiàn)在用回歸函數(shù)可以表達(dá)得很簡(jiǎn)單。
這種數(shù)據(jù)結(jié)構(gòu)的扁平化趨勢(shì)會(huì)怎么發(fā)展?我極其努力地設(shè)想各種可能,得到的結(jié)果甚至令我自己都嚇了一跳。比如,數(shù)組會(huì)不會(huì)消失?畢竟數(shù)組只是散列表的一個(gè)子集,其特點(diǎn)就是數(shù)組的鍵全部都是整數(shù)向量。進(jìn)一步說(shuō),散列表本身會(huì)不會(huì)被列表取代呢?
還有比這更驚人的預(yù)言。在邏輯上其實(shí)不需要對(duì)整數(shù)設(shè)置單獨(dú)的表示法,因?yàn)榭梢园阉鼈円部醋髁斜恚麛?shù) n可以用一個(gè) n元素的列表表示。這一樣能完成數(shù)學(xué)運(yùn)算,只是效率低得讓人無(wú)法忍受。
編程語(yǔ)言會(huì)發(fā)展到放棄基本數(shù)據(jù)類(lèi)型之一的整數(shù)這一步嗎?我這樣問(wèn)并不是真的要你嚴(yán)肅思考這個(gè)問(wèn)題,更多的是希望打開(kāi)你對(duì)未來(lái)的思路。我只是提出一種假想的情況:如果一股不可抗拒的力量遇到了一個(gè)不可移動(dòng)的物體,會(huì)發(fā)生什么事。具體就本文而言:一種效率低得不可想象的語(yǔ)言遇到了性能強(qiáng)大得不可想象的硬件,會(huì)發(fā)生什么事。我看不出放棄整數(shù)類(lèi)型有什么不妥。未來(lái)相當(dāng)漫長(zhǎng)。如果我們想要減少語(yǔ)言內(nèi)核中基本公理的數(shù)目,不妨把眼光放得遠(yuǎn)一點(diǎn),想一想如果時(shí)間變量 t趨向無(wú)限會(huì)怎么樣。一百年是一個(gè)很好的參考指標(biāo),如果你覺(jué)得某個(gè)想法在一百年后仍然可能是難以令人接受,那么也許一千年后它也依然難以令人接受。
讓我說(shuō)清楚,我的意思不是說(shuō)所有的整數(shù)運(yùn)算都用列表來(lái)實(shí)現(xiàn),而是說(shuō)語(yǔ)言的內(nèi)核(不涉及任何編譯器的實(shí)現(xiàn))可以這樣定義。在現(xiàn)實(shí)中,任何進(jìn)行數(shù)學(xué)運(yùn)算的程序可能都是以二進(jìn)制形式表示數(shù)字,但是這屬于編譯器的優(yōu)化,而不屬于語(yǔ)言內(nèi)核語(yǔ)義的一部分。
另一種消耗硬件性能的方法就是,在應(yīng)用軟件與硬件之間設(shè)置很多的軟件層。這也是我們已經(jīng)看到的一種趨勢(shì),許多新興的語(yǔ)言就被編譯成字節(jié)碼 。比爾?伍茲曾經(jīng)對(duì)我說(shuō),根據(jù)經(jīng)驗(yàn)判斷,每增加一個(gè)解釋層,軟件的運(yùn)行速度就會(huì)慢一個(gè)數(shù)量級(jí)。但是,多余的軟件層可以讓編程靈活起來(lái)。
Arc語(yǔ)言 最初的版本就是一個(gè)極端的例子,它的層很多,運(yùn)行速度非常慢,但是確實(shí)帶來(lái)了相應(yīng)的好處。 Arc是一個(gè)典型的“元循環(huán)”( metacircular)解釋器,在 Common Lisp的基礎(chǔ)上開(kāi)發(fā),很像約翰?麥卡錫在他經(jīng)典的 Lisp論文中定義的 eval函數(shù)。 Arc解釋器一共只有幾百行代碼,所以很便于理解和修改。我們采用的 Common Lisp版本是 CLisp,它本身是在另一個(gè)字節(jié)碼解釋器的基礎(chǔ)上開(kāi)發(fā)的。所以,我們一共有兩層解釋器,最上面那層效率低下得驚人,但是語(yǔ)言本身是能用的。我承認(rèn)只是勉強(qiáng)可用,但是確實(shí)能用。
即使是應(yīng)用程序,使用多層形式開(kāi)發(fā)也是一種很強(qiáng)大的技巧。自下而上的編程方法意味著要把軟件分成好幾層,每一層都可以充當(dāng)它上面那一層的開(kāi)發(fā)語(yǔ)言。這種方法往往會(huì)產(chǎn)生更小、更靈活的程序。它也是通往軟件圣杯——可重用性( reusability)——的最佳路線。從定義上看,語(yǔ)言就是可以重用的。在編程語(yǔ)言的幫助下,你的應(yīng)用程序越是采用這種多層形式開(kāi)發(fā),它的可重用性就越好。
可重用性這個(gè)概念多多少少與 20世紀(jì) 80年代興起的面向?qū)ο缶幊逃行╆P(guān)聯(lián)。不管怎樣尋找證據(jù),也不可能把這兩件事完全分開(kāi)。某些使用面向?qū)ο缶幊涕_(kāi)發(fā)出來(lái)的軟件確實(shí)具有可重用性,但是這不是因?yàn)樗褂昧嗣嫦驅(qū)ο缶幊?,而是因?yàn)樗拈_(kāi)發(fā)方法是自下而上的。以函數(shù)庫(kù)為例,它們具有可重用性,是因?yàn)樗鼈儗儆谡Z(yǔ)言的一部分,而不是因?yàn)樗鼈儾捎妹嫦驅(qū)ο蠡蛘咂渌幊谭椒ā?/P>
順便說(shuō)一句,我不認(rèn)為面向?qū)ο缶幊虒?lái)會(huì)消亡。我覺(jué)得,除了某些特定的領(lǐng)域,這種編程方法其實(shí)沒(méi)有為優(yōu)秀程序員帶來(lái)很多好處,但是它對(duì)大公司有不可抗拒的吸引力。面向?qū)ο缶幊淌沟媚阌修k法對(duì)一團(tuán)亂碼似的代碼進(jìn)行可持續(xù)性開(kāi)發(fā)。通過(guò)不斷地打補(bǔ)丁,它讓你將軟件一步步做大。大公司總是傾向于采用這樣的方式開(kāi)發(fā)軟件。我預(yù)計(jì)一百年后也是如此。
既然是談?wù)撐磥?lái),最好談?wù)劜⑿杏?jì)算( parallel computation),因?yàn)榭瓷先ゲ⑿杏?jì)算好像就是為未來(lái)而存在的。無(wú)論怎么想,并行計(jì)算似乎都是未來(lái)生活的一部分。
它會(huì)在未來(lái)實(shí)現(xiàn)嗎?過(guò)去二十年,人們都在說(shuō)并行計(jì)算馬上就會(huì)來(lái)臨。但是,到目前為止,它對(duì)編程實(shí)踐并沒(méi)有太大影響。這是真的嗎?芯片設(shè)計(jì)師已經(jīng)不得不把它考慮在內(nèi),為多 CPU計(jì)算機(jī)開(kāi)發(fā)系統(tǒng)軟件的程序員也是如此。
但是,真正的問(wèn)題在于,并行計(jì)算到底能達(dá)到哪個(gè)抽象層次?一百年后它就會(huì)影響到開(kāi)發(fā)應(yīng)用軟件的程序員嗎?或者,它還只是編譯器作者需要考慮的事情,在應(yīng)用軟件的代碼中根本就無(wú)處尋覓?
一種可能是,大多數(shù)可以用到并行計(jì)算的場(chǎng)合,人們都會(huì)放棄使用并行計(jì)算。雖然我總的預(yù)測(cè)是未來(lái)的軟件會(huì)揮霍掉大部分新增的硬件性能,但是并行計(jì)算是一個(gè)特例。我估計(jì)隨著硬件性能得到驚人的提升,如果你明確地說(shuō)想要并行計(jì)算,那么肯定可以得到它,但是通常情況下你不會(huì)用到它。這意味著,除了一些特殊的應(yīng)用程序,一百年后的并行計(jì)算不會(huì)是那種大規(guī)模的并行計(jì)算( massive parallelism)。我預(yù)料,對(duì)于普通程序員來(lái)說(shuō),一切更像對(duì)進(jìn)程進(jìn)行分叉,然后讓多個(gè)進(jìn)程在后臺(tái)并行運(yùn)行。
這是編程進(jìn)行到很后期才要做的事情,屬于對(duì)程序的優(yōu)化,類(lèi)似于你想開(kāi)發(fā)一種特定的數(shù)據(jù)結(jié)構(gòu)來(lái)取代現(xiàn)有的數(shù)據(jù)結(jié)構(gòu)。程序的第一個(gè)版本通常會(huì)忽略并行計(jì)算提供的各種好處,就好像編程開(kāi)始時(shí)會(huì)忽略某種特定的數(shù)據(jù)結(jié)構(gòu)給你帶來(lái)的好處一樣。
除了某些特定的應(yīng)用軟件,一百年后,并行計(jì)算不會(huì)很流行。如果應(yīng)用軟件真的大量使用并行計(jì)算,這就屬于過(guò)早優(yōu)化了。
一百年后會(huì)有多少種編程語(yǔ)言?從最近來(lái)看,出現(xiàn)了大量的新語(yǔ)言。硬件性能提高是一個(gè)原因,這就允許程序員根據(jù)使用目的在運(yùn)行速度和編程便利性之間做出不同的取舍。如果這就是未來(lái)的趨勢(shì),那么一百年后強(qiáng)大的硬件只會(huì)使得語(yǔ)言數(shù)目變得更多。
但是,另一方面,一百年后的常用語(yǔ)言可能只有很少幾種。部分原因是基于我的樂(lè)觀主義,我相信在未來(lái),如果你的作品確實(shí)很出色,你可能選擇的是一種開(kāi)發(fā)起來(lái)很方便的語(yǔ)言。使用這種語(yǔ)言寫(xiě)出來(lái)的軟件第一版的運(yùn)行速度很慢,只有對(duì)編譯器進(jìn)行優(yōu)化設(shè)置后運(yùn)行速度才會(huì)提升。既然我抱有這種樂(lè)觀主義,那么我還要做一個(gè)預(yù)言。有些語(yǔ)言可以達(dá)到機(jī)器的最高效率,另一些語(yǔ)言的效率則慢到剛剛可以運(yùn)行而已,兩者之間存在巨大的差距。我預(yù)言一百年后,這段差距之間的各個(gè)點(diǎn)上都會(huì)有對(duì)應(yīng)的編程語(yǔ)言存在。
因?yàn)檫@段差距正在變得越來(lái)越大,所以性能分析器( profiler)將變得越來(lái)越重要。目前,性能分析并沒(méi)有受到重視。許多人好像仍然相信,程序運(yùn)行速度提升的關(guān)鍵在于開(kāi)發(fā)出能夠生成更快速代碼的編譯器。代碼效率與機(jī)器性能的差距正在不斷加大,我們將會(huì)越來(lái)越清楚地看到,應(yīng)用軟件運(yùn)行速度提升的關(guān)鍵在于有一個(gè)好的性能分析器幫助指導(dǎo)程序開(kāi)發(fā)。
我說(shuō)將來(lái)可能只有很少幾種常用語(yǔ)言,但沒(méi)有把用于特定領(lǐng)域的“小眾語(yǔ)言”( little language)算進(jìn)去。我覺(jué)得,這些嵌入式語(yǔ)言的想法很不錯(cuò),一定會(huì)蓬勃發(fā)展。但是我判斷這些“小眾語(yǔ)言”會(huì)被設(shè)計(jì)成相當(dāng)薄的一層,使得用戶可以一眼看出在底下作為基礎(chǔ)的通用型語(yǔ)言,這樣就減少了學(xué)習(xí)時(shí)間,降低了使用成本。
誰(shuí)來(lái)設(shè)計(jì)這些未來(lái)的語(yǔ)言?過(guò)去 10年最激動(dòng)人心的趨勢(shì)之一就是開(kāi)源語(yǔ)言的崛起,比如 Perl、 Python和 Ruby。語(yǔ)言設(shè)計(jì)已經(jīng)被黑客接管。到目前為止這樣到底是好是壞還看不清楚,但是發(fā)展勢(shì)頭令人鼓舞。比如, Perl就有一些絕妙的創(chuàng)新。不過(guò),它也包含了一些很糟糕的想法。對(duì)于一種充滿進(jìn)取心、大膽探索的語(yǔ)言來(lái)說(shuō),這也是很正常的事。以它現(xiàn)在這種變化的速率,大概只有上帝才知道一百年后 Perl會(huì)變成什么樣。
有一句俗話說(shuō),如果你自己做不到,那就去當(dāng)老師。這在語(yǔ)言設(shè)計(jì)領(lǐng)域不成立,我認(rèn)識(shí)的一些最出色的黑客就在當(dāng)教授。但是,當(dāng)老師的人確實(shí)有很多事情不能做。研究性職位給黑客帶來(lái)了一些限制。在任何學(xué)術(shù)領(lǐng)域,都有一些題目是可以做的,另一些題目是不可以做的。不幸的是,這兩類(lèi)題目的區(qū)別通常取決于它們寫(xiě)成論文后看上去是不是很高深,而不是取決于它們對(duì)軟件業(yè)的發(fā)展是否重要。最極端的例子可能就是文學(xué),文學(xué)研究者的任何成果幾乎對(duì)文學(xué)創(chuàng)作者都毫無(wú)影響。
雖然科學(xué)領(lǐng)域的狀況要稍好一點(diǎn),但是研究者可以做的題目與能夠?qū)υO(shè)計(jì)優(yōu)秀語(yǔ)言有所幫助的題目之間的交集小得令人沮喪。(奧林? 希弗斯曾經(jīng)對(duì)這一點(diǎn)表達(dá)不滿,而且說(shuō)得頭頭是道。)比如,研究變量類(lèi)型的論文好像多得無(wú)窮無(wú)盡,盡管事實(shí)上靜態(tài)類(lèi)型語(yǔ)言看來(lái)無(wú)法真正支持宏(在我看來(lái),一種語(yǔ)言不支持宏,那就不值得使用了)。
新語(yǔ)言更多地以開(kāi)源項(xiàng)目的形式出現(xiàn),而不是以研究性項(xiàng)目的形式出現(xiàn)。這是語(yǔ)言的一種發(fā)展趨勢(shì)。另一種發(fā)展趨勢(shì)是,新語(yǔ)言的設(shè)計(jì)者更多的是本身就需要使用它們的應(yīng)用軟件作者,而不是編譯器作者。這似乎是好的趨勢(shì),我期待它繼續(xù)保持下去。 一百年后的物理學(xué)基本上不可能預(yù)測(cè)。但是計(jì)算機(jī)語(yǔ)言不一樣,現(xiàn)在就動(dòng)手設(shè)計(jì)一種一百年后可以吸引使用者的新語(yǔ)言,這在理論上似乎是可能的。
設(shè)計(jì)新語(yǔ)言的方法之一就是直接寫(xiě)下你想寫(xiě)的程序,不管編譯器是否存在,也不管有沒(méi)有支持它的硬件。這就是假設(shè)存在無(wú)限的資源供你支配。不管是今天還是一百年后,這樣的假設(shè)好像都是有道理的。
你應(yīng)該寫(xiě)什么程序?隨便什么,只要能讓你最省力地寫(xiě)出來(lái)就行。但是要注意,這必須是在你的思維沒(méi)有被當(dāng)前使用的編程語(yǔ)言影響的情況下。這種影響無(wú)處不在,必須很努力才能克服。你也許覺(jué)得,對(duì)于人類(lèi)這樣懶惰的生物,喜歡用最省力的方式寫(xiě)程序是再自然不過(guò)的事情。但是事實(shí)上,我們的思想可能往往會(huì)受限于某種現(xiàn)存的語(yǔ)言,只采用在這種語(yǔ)言看來(lái)更簡(jiǎn)單的形式,它對(duì)我們思想的束縛作用會(huì)大得令人震驚。新語(yǔ)言必須靠你自己去發(fā)現(xiàn),不能依靠那些讓你自然而然就沉下去的思維定勢(shì)。
采用程序的長(zhǎng)度作為它耗費(fèi)工作量的近似指標(biāo)是個(gè)很有用的技巧。這里的程序長(zhǎng)度當(dāng)然不是指字符的數(shù)量,而是指各種句法元素的總長(zhǎng)度,基本上就是整個(gè)解析樹(shù)的大小。也許不能說(shuō)最短的程序就是寫(xiě)起來(lái)最省力的程序,但是當(dāng)你一心想把程序?qū)懙煤?jiǎn)潔而不是松松垮垮時(shí),你就更接近省力這個(gè)目標(biāo),你的日子也會(huì)變得好過(guò)得多。所以,設(shè)計(jì)語(yǔ)言的正確做法就變成了,看著一段程序,然后問(wèn)自己是不是能把它寫(xiě)得更短一點(diǎn)?
實(shí)際上,用想象出來(lái)的一種一百年后的語(yǔ)言來(lái)寫(xiě)程序,這件事情的可靠程度,取決于你對(duì)語(yǔ)言內(nèi)核的估計(jì)是否足夠正確。常規(guī)的排序,你現(xiàn)在就可以寫(xiě)出來(lái)。但是,想要預(yù)測(cè)一百年后的語(yǔ)言使用什么函數(shù)庫(kù)就很難了。很可能許多函數(shù)庫(kù)針對(duì)的領(lǐng)域現(xiàn)在還根本不存在。比如,如果 SETI@home 計(jì)劃成功,我們就需要與外星人聯(lián)系的函數(shù)庫(kù)了。當(dāng)然,如果外星人的文明高度發(fā)達(dá),已經(jīng)到了用 XML格式交換信息的地步,那就不需要新的函數(shù)庫(kù)了。
另一個(gè)極端是,我覺(jué)得今天你就能設(shè)計(jì)出一百年后的語(yǔ)言內(nèi)核。事實(shí)上,在有些人看來(lái),大部分語(yǔ)言內(nèi)核在 1958年就已經(jīng)設(shè)計(jì)出來(lái)了。
如果今天就能使用一百年后的編程語(yǔ)言,我們會(huì)用它編程嗎?觀古而知今。如果 1960年就能使用今天的編程語(yǔ)言,那時(shí)的人們會(huì)用它們嗎?
在某些方面,回答是否定的。今天的編程語(yǔ)言依賴的硬件在 1960年并不存在。比如, Python這樣的語(yǔ)言,正確的縮進(jìn)( indentation)在編寫(xiě)時(shí)很重要,但是 1960年的計(jì)算機(jī)沒(méi)有顯示器,只有打印機(jī)終端,所以編寫(xiě)起來(lái)就不會(huì)很順利。但是,如果把這些因素排除在外(你可以假設(shè),我們只在紙上編程), 20世紀(jì) 60年代的程序員會(huì)喜歡用現(xiàn)在的語(yǔ)言編程嗎?
我想他們會(huì)的。某些缺乏想象力、深受早期編程語(yǔ)言思想影響的人可能會(huì)覺(jué)得不可能。(沒(méi)有指針運(yùn)算,如何復(fù)制數(shù)據(jù)?沒(méi)有 goto語(yǔ)句,如何實(shí)現(xiàn)流程圖?)但是我想,那時(shí)最聰明的程序員一定能輕松地使用今天的大多數(shù)語(yǔ)言,假定他們能得到的話。
如果我們現(xiàn)在就能擁有一百年后的編程語(yǔ)言,那就至少能用來(lái)寫(xiě)出優(yōu)秀的偽碼 。我們會(huì)用它開(kāi)發(fā)軟件嗎?因?yàn)橐话倌旰蟮木幊陶Z(yǔ)言需要為某些應(yīng)用程序生成快速代碼,所以很可能它生成的代碼能夠在我們的硬件上運(yùn)行,速度也還可以接受。相比一百年后的用戶,我們也許不得不對(duì)這種語(yǔ)言做更多的優(yōu)化,但是總的來(lái)看,它應(yīng)該仍然會(huì)為我們帶來(lái)凈收益。
現(xiàn)在,我們的兩個(gè)觀點(diǎn)就是:( 1)一百年后的編程語(yǔ)言在理論上今天就能設(shè)計(jì)出來(lái);( 2)如果今天真能設(shè)計(jì)出這樣一種語(yǔ)言,很可能現(xiàn)在就適合編程,并且能夠產(chǎn)生更好的結(jié)果。如果我們把這兩個(gè)觀點(diǎn)聯(lián)系起來(lái),那就得出了一些有趣的可能性。為什么不現(xiàn)在就動(dòng)手嘗試寫(xiě)出一百年后的編程語(yǔ)言呢?
當(dāng)你設(shè)計(jì)語(yǔ)言的時(shí)候,心里牢牢記住這個(gè)目標(biāo)是有好處的。學(xué)習(xí)開(kāi)車(chē)的時(shí)候,一個(gè)需要記住的原則就是要把車(chē)開(kāi)直,不是通過(guò)將車(chē)身對(duì)齊畫(huà)在地上的分隔線,而是通過(guò)瞄準(zhǔn)遠(yuǎn)處的某個(gè)點(diǎn)。即使你的目標(biāo)只在幾米開(kāi)外,這樣做也是正確的。我認(rèn)為,設(shè)計(jì)編程語(yǔ)言時(shí),我們也應(yīng)該這樣做。
-
杭州網(wǎng)站設(shè)計(jì)公司:品牌網(wǎng)站開(kāi)發(fā)助力企業(yè)成長(zhǎng)
日期:2024-12-20瀏覽次數(shù):807次
-
杭州網(wǎng)站建設(shè)公司:商城網(wǎng)站建設(shè)的六大關(guān)鍵步驟
日期:2024-12-18瀏覽次數(shù):855次
-
杭州網(wǎng)站制作:醫(yī)院網(wǎng)站設(shè)計(jì)與域名備案的復(fù)雜性探討
日期:2024-12-18瀏覽次數(shù):847次
-
杭州網(wǎng)站制作公司:打造安全可靠的醫(yī)院網(wǎng)站
日期:2024-12-11瀏覽次數(shù):1012次
-
杭州網(wǎng)站設(shè)計(jì)公司:數(shù)據(jù)庫(kù)在高端網(wǎng)站制作中的關(guān)鍵作用
日期:2024-12-11瀏覽次數(shù):984次
相關(guān)新聞
整合同類(lèi)新聞,相關(guān)新聞一手掌握
-
茂名網(wǎng)站制作哪家好?原來(lái)大家都選-杭州帷拓
日期:2023-02-08瀏覽次數(shù):1780次
-
茂名網(wǎng)站建設(shè)公司哪家好?【企業(yè)網(wǎng)站開(kāi)發(fā)】
日期:2023-02-08瀏覽次數(shù):1803次
-
運(yùn)動(dòng)健身類(lèi)茂名定制app功能方案
日期:2021-02-24瀏覽次數(shù):2102次
-
茂名app開(kāi)發(fā)周期的決定因素
日期:2021-02-24瀏覽次數(shù):2172次
最新新聞
與互聯(lián)網(wǎng)同行,實(shí)時(shí)掌握網(wǎng)建行業(yè)最新動(dòng)態(tài)
-
2012-10 個(gè)新鮮的 jQuery 插件分享
日期:2011-12-30瀏覽次數(shù):8127次
-
Wap長(zhǎng)春網(wǎng)頁(yè)設(shè)計(jì)需要留意的幾個(gè)要點(diǎn)
日期:2020-10-12瀏覽次數(shù):2033次
-
長(zhǎng)沙網(wǎng)站建設(shè):論域名與網(wǎng)站的聯(lián)系
日期:2020-10-19瀏覽次數(shù):2172次
-
黑河做網(wǎng)站,跨境電商到底有哪些作用?
日期:2020-10-27瀏覽次數(shù):2094次
-
金融類(lèi)app開(kāi)發(fā)設(shè)計(jì)考慮
日期:2021-03-18瀏覽次數(shù):1955次
隨機(jī)新聞
新聞新動(dòng)態(tài),您需要的新聞管家
洞悉市場(chǎng)趨勢(shì)演變讓傳播回歸社會(huì)
免費(fèi)獲取網(wǎng)站建設(shè)與網(wǎng)絡(luò)推廣方案報(bào)價(jià)
-
關(guān)于我們
杭州帷拓科技有限公司,是一家新型的全案網(wǎng)絡(luò)開(kāi)發(fā)公司,作為以互聯(lián)網(wǎng)高端網(wǎng)站建設(shè)、APP開(kāi)發(fā)、小程序開(kāi)發(fā)為核心的專(zhuān)業(yè)網(wǎng)絡(luò)技術(shù)服務(wù)供應(yīng)商,帷拓科技致力于全面分析市場(chǎng)環(huán)境、衡量與預(yù)測(cè)市場(chǎng)需求、整合區(qū)別于行業(yè)競(jìng)爭(zhēng)對(duì)手的絕對(duì)優(yōu)勢(shì),結(jié)合品牌理念深度挖掘項(xiàng)目?jī)?yōu)勢(shì)和產(chǎn)品價(jià)值,提升客戶品牌認(rèn)知、認(rèn)可度。
-
我們的客戶
帷拓科技?xì)v經(jīng)十年沉淀,與國(guó)內(nèi)外上千家客戶達(dá)成合作關(guān)系,其中穩(wěn)定合作的公司有:浙江華為、浙江移動(dòng)、浙江5G產(chǎn)業(yè)聯(lián)盟、浙江省社科院、綠城足球俱樂(lè)部、娃哈哈雙語(yǔ)學(xué)校、健康中國(guó)杭州峰會(huì)、科雷機(jī)電等,帷拓科技始終堅(jiān)持“帷有專(zhuān)業(yè),才能拓展無(wú)限”的服務(wù)理念,堅(jiān)持“認(rèn)真堅(jiān)持細(xì)節(jié)”的優(yōu)質(zhì)服務(wù)理念,不斷完善自身,成就企業(yè),最終實(shí)現(xiàn)共贏。
-
我們的業(yè)務(wù)
帷拓科技主營(yíng)業(yè)務(wù)范圍包含互聯(lián)網(wǎng)高端網(wǎng)站建設(shè)、APP開(kāi)發(fā)、小程序開(kāi)發(fā)、商城網(wǎng)站建設(shè)、公眾號(hào)運(yùn)營(yíng)以及數(shù)字營(yíng)銷(xiāo)等,涵蓋了服務(wù)、房產(chǎn)、數(shù)碼、服裝、物流貿(mào)易等行業(yè),根據(jù)品牌現(xiàn)狀,為每個(gè)客戶量身定制項(xiàng)目整體服務(wù)方案,以敏銳的市場(chǎng)洞察力、創(chuàng)新的市場(chǎng)策劃能力,全面把握市場(chǎng)變化,為客戶實(shí)現(xiàn)從企業(yè)到消費(fèi)者的價(jià)值轉(zhuǎn)換。