編程語(yǔ)言的本質(zhì)前言超陆,翻譯

這本書帶給你面對(duì)面的體驗(yàn),關(guān)于計(jì)算機(jī)編程世界的基礎(chǔ)思想:
“程序設(shè)計(jì)語(yǔ)言的解釋器不過(guò)是另外一個(gè)程序”浦马。
聽(tīng)起來(lái)好像是一件很顯而易見(jiàn)的事情时呀,是嗎?但是它的含義卻又是非常深遠(yuǎn)的晶默。如果你是計(jì)算機(jī)領(lǐng)域的理論研究人員谨娜,解釋器的思想實(shí)際上要往回追溯到哥德?tīng)柊l(fā)現(xiàn)的關(guān)于形式化邏輯系統(tǒng)的局限性(哥德?tīng)柌煌陚涠ɡ恚瑘D靈通用機(jī)器(圖靈機(jī))磺陡,馮諾依曼可存儲(chǔ)機(jī)器的基本思想(馮諾依曼機(jī))趴梢。如果你是一個(gè)程序員,掌握了解釋器的思想币他,它會(huì)成為你強(qiáng)大力量的來(lái)源坞靶。它會(huì)顛覆你原有的觀念,造成你在思考程序設(shè)計(jì)時(shí)的一些最根本的改變蝴悉。
在我學(xué)習(xí)解釋器之前彰阴,我曾編寫過(guò)大量的程序,也做過(guò)一些很牢靠的程序辫封。例如硝枉,其中一個(gè)是用PL/I編寫的大型數(shù)據(jù)錄入和信息檢索系統(tǒng)。當(dāng)我順利完成這個(gè)系統(tǒng)時(shí)倦微,我意識(shí)到PL/I是由一群有紛爭(zhēng)的編程語(yǔ)言設(shè)計(jì)人員編寫的一系列修修補(bǔ)補(bǔ)的語(yǔ)法規(guī)則妻味。我感覺(jué)我的系統(tǒng)不是很適應(yīng)這些規(guī)則,從而導(dǎo)致它理解起來(lái)十分困難欣福,更別提那本(超級(jí))巨大的參考手冊(cè)了责球,最后只從里面選兩三個(gè)能用的特性來(lái)編程。這樣的經(jīng)歷讓我的腦子出現(xiàn)了一個(gè)組織編程語(yǔ)言的基本結(jié)構(gòu)拓劝,我本來(lái)可能會(huì)想到重新組織一下這個(gè)語(yǔ)言的設(shè)計(jì)雏逾,但是我從沒(méi)這樣去思考過(guò)。我不知道如何創(chuàng)建嵌入式的語(yǔ)言幫助我自己的開(kāi)發(fā)郑临,所以這個(gè)完整的程序看起來(lái)是一個(gè)又龐大栖博,又復(fù)雜的鑲嵌物,一片套著一片厢洞,而不是一系列的語(yǔ)言以便在這些系統(tǒng)的部分間可伸縮地組合起來(lái)仇让。如果你不理解解釋器典奉,你也會(huì)這樣寫程序,你當(dāng)然可以是一個(gè)稱職的編碼人員丧叽,可遺憾的是卫玖,你沒(méi)辦法成為一個(gè)大師。
程序員應(yīng)該學(xué)習(xí)解釋器的原因有三個(gè)踊淳。
首先假瞬,你需要一部分技術(shù),它們屬于解釋器技術(shù)的一部分迂尝,可能并不是完整且通用的解釋器或者語(yǔ)言脱茉,但是解釋器的實(shí)現(xiàn)實(shí)際上是一樣的思路。大多數(shù)人們使用的靈活又復(fù)雜的計(jì)算機(jī)軟件系統(tǒng)垄开,例如計(jì)算機(jī)繪圖工具和信息檢索系統(tǒng)芦劣,包含某些解釋器用來(lái)構(gòu)建交互。這些程序可能包含復(fù)雜卻獨(dú)特的操作--渲染屏幕的某些區(qū)域说榆,執(zhí)行數(shù)據(jù)庫(kù)查詢--但是解釋器賦予了你組合這些獨(dú)特的操作到方便的模式里面的能力虚吟。你可以使用一個(gè)操作的結(jié)果作為另一個(gè)操作的輸入嗎?你可以給一系列的操作命名嗎签财?這些名稱是局部的還是全局的呢串慰?你可以參數(shù)化一系列的操作,然后把名字交給它的輸出嗎唱蒸?等等邦鲫。無(wú)論這些特殊操作如何復(fù)雜和突出,它通常都是這類系統(tǒng)的質(zhì)量得到保證的內(nèi)部決定因素神汹。在程序中找出這些特定的行為是簡(jiǎn)單的事情庆捺,但是組合起來(lái)是很丑陋的;再往回看我那個(gè)PL/I數(shù)據(jù)庫(kù)系統(tǒng)真的是非常糟糕的組合屁魏。
第二滔以,即使程序本身不是作為解釋器的一部分,它也擁有一些類似解釋器的地方氓拼。觀察計(jì)算機(jī)輔助設(shè)計(jì)系統(tǒng)你画,你會(huì)發(fā)現(xiàn)幾何定義語(yǔ)言,幾何交互解釋器桃漾,基于規(guī)則的控制解釋器坏匪,還有一個(gè)面向?qū)ο蟮恼Z(yǔ)言解釋器在工作。設(shè)計(jì)復(fù)雜程序最強(qiáng)大的方法就是一系列語(yǔ)言的組合撬统,每一種語(yǔ)言提供了一種關(guān)注點(diǎn)适滓,用到這些編程元素不同的工作方式。把合適的編程語(yǔ)言用于對(duì)應(yīng)的目的恋追,理解到使用每種語(yǔ)言的權(quán)衡利弊:這就是解釋器需要研究的地方凭迹。
第三個(gè)原因則是為了了解解釋器是一種直接關(guān)系到編程語(yǔ)言結(jié)構(gòu)的編程技術(shù)颅崩,它正在變得越來(lái)越重要。現(xiàn)在的軟件工程化蕊苗,設(shè)計(jì)和組織里面,面向?qū)ο笫沁@樣一種趨勢(shì)的例子沿彭。不可避免的朽砰,我們的軟件會(huì)越來(lái)越復(fù)雜--直接從語(yǔ)言層面考慮問(wèn)題也許會(huì)是一個(gè)比較好的處理復(fù)雜性的辦法。再次考慮最基本的問(wèn)題:解釋器本身也只是一個(gè)程序喉刘。但是這個(gè)程序是用某些語(yǔ)言編寫而成的瞧柔,解釋器的解釋器又是另外一些語(yǔ)言編寫而成...也許在程序和程序語(yǔ)言之間的距離是一種遐想,未來(lái)的程序可能并不是某種語(yǔ)言編寫而成的應(yīng)用程序睦裳,而是為了某一個(gè)新的應(yīng)用程序創(chuàng)建一門新的編程語(yǔ)言造锅。
Friedman和Wand已經(jīng)做出了里程碑的工作,他們的書會(huì)改變編程語(yǔ)言課程的面貌廉邑。他們不只是告訴你解釋器是什么樣哥蔚;他們將它展示給你看。本書的核心是一次編程語(yǔ)言界的旅行蛛蒙,從一個(gè)高度抽象的語(yǔ)言糙箍,逐漸深入到語(yǔ)言內(nèi)部的特性直到狀態(tài)機(jī)。你毫無(wú)疑問(wèn)可以運(yùn)行這些代碼牵祟,研究它深夯,修改它,然后改變某些解釋器的句柄和作用域诺苹,控制流等等咕晋。
在使用解釋器學(xué)習(xí)語(yǔ)言的執(zhí)行機(jī)制之后,作者會(huì)展示如何將相同的想法用于分析程序而無(wú)需運(yùn)行收奔。在接下來(lái)的兩章里掌呜,它們展示了如何實(shí)現(xiàn)類型檢查和推導(dǎo),以及這些功能如何與現(xiàn)代的面向?qū)ο笳Z(yǔ)言交互坪哄。
這種方法之所以吸引人的部分原因在于站辉,作者選擇了一個(gè)很好的工具--scheme語(yǔ)言,它結(jié)合了lisp的詞法作用域损姜,垃圾回收和數(shù)據(jù)抽象功能饰剥,還有algol的塊結(jié)構(gòu)。但是強(qiáng)大的工具還得要在大師的手上摧阅。本書中的實(shí)例解釋器是杰出的模型汰蓉。當(dāng)然,由于它們是可運(yùn)行的模型棒卷,因此我確信考量這些解釋器顾孽,研究的人會(huì)發(fā)現(xiàn)自己站在未來(lái)幾年許多編程系統(tǒng)的核心層面祝钢。
這不是一本輕松的書,掌握解釋器并不容易若厚,這是有充分理由的拦英。與普通的應(yīng)用程序員相比,語(yǔ)言設(shè)計(jì)者是站在高于用戶的層次看待問(wèn)題测秸。在設(shè)計(jì)應(yīng)用程序的時(shí)候疤估,你要考慮人們可能想要實(shí)現(xiàn)的各種功能以及實(shí)現(xiàn)方式,他們可能會(huì)使用它們霎冯。你的語(yǔ)言應(yīng)該是靜態(tài)的铃拇,還是動(dòng)態(tài)的,還是混合沈撞?需要繼承嗎慷荔?它的參數(shù)是引用傳遞還是值傳遞?續(xù)延應(yīng)該是明確的還是隱式的缠俺?這完全取決于你期望使用語(yǔ)言的方式显晶,各個(gè)功能應(yīng)該是易于編寫的,并且還能夠承載更復(fù)雜的任務(wù)壹士。
另外吧碾,解釋器的確是很微妙的程序。簡(jiǎn)單的更改內(nèi)部的代碼會(huì)使得你的解釋器行為產(chǎn)生巨大的差異墓卦。不要以為你可以輕松看懂并且預(yù)測(cè)這些程序倦春,世界上很少有人可以看一看新的解釋器就能知道它將會(huì)發(fā)生什么,即使在很簡(jiǎn)單的程序上落剪。所以學(xué)習(xí)這些程序最好的辦法就是運(yùn)行它們睁本,這些代碼是有效的,嘗試解釋一些簡(jiǎn)單的表達(dá)式忠怖,然后是更加復(fù)雜的表達(dá)式呢堰。添加錯(cuò)誤消息,修改解釋器凡泣,嘗試設(shè)計(jì)自己的變體枉疼,試著真正掌握這些程序,不只是對(duì)它們的工作模棱兩可鞋拟。
如果這樣做骂维,您將改變對(duì)編程的看法以及對(duì)自己作為程序員的看法。 您會(huì)發(fā)現(xiàn)自己是語(yǔ)言的設(shè)計(jì)師贺纲,而不僅僅是語(yǔ)言的用戶航闺,是選擇語(yǔ)言組合規(guī)則的人,而不僅僅是其他人選擇的規(guī)則的追隨者。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末潦刃,一起剝皮案震驚了整個(gè)濱河市侮措,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乖杠,老刑警劉巖分扎,帶你破解...
    沈念sama閱讀 212,657評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異胧洒,居然都是意外死亡畏吓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,662評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門略荡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人歉胶,你說(shuō)我怎么就攤上這事汛兜。” “怎么了通今?”我有些...
    開(kāi)封第一講書人閱讀 158,143評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵粥谬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我辫塌,道長(zhǎng)漏策,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,732評(píng)論 1 284
  • 正文 為了忘掉前任臼氨,我火速辦了婚禮掺喻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘储矩。我一直安慰自己感耙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,837評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布持隧。 她就那樣靜靜地躺著即硼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屡拨。 梳的紋絲不亂的頭發(fā)上只酥,一...
    開(kāi)封第一講書人閱讀 50,036評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音呀狼,去河邊找鬼裂允。 笑死,一個(gè)胖子當(dāng)著我的面吹牛哥艇,可吹牛的內(nèi)容都是我干的叫胖。 我是一名探鬼主播,決...
    沈念sama閱讀 39,126評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼她奥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瓮增!你這毒婦竟也來(lái)了怎棱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,868評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绷跑,失蹤者是張志新(化名)和其女友劉穎拳恋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體砸捏,經(jīng)...
    沈念sama閱讀 44,315評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谬运,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,641評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垦藏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梆暖。...
    茶點(diǎn)故事閱讀 38,773評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掂骏,靈堂內(nèi)的尸體忽然破棺而出轰驳,到底是詐尸還是另有隱情,我是刑警寧澤弟灼,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布级解,位于F島的核電站,受9級(jí)特大地震影響田绑,放射性物質(zhì)發(fā)生泄漏勤哗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一掩驱、第九天 我趴在偏房一處隱蔽的房頂上張望芒划。 院中可真熱鬧,春花似錦欧穴、人聲如沸腊状。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,859評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缴挖。三九已至,卻和暖如春焚辅,著一層夾襖步出監(jiān)牢的瞬間映屋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工同蜻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棚点,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,584評(píng)論 2 362
  • 正文 我出身青樓湾蔓,卻偏偏與公主長(zhǎng)得像瘫析,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,676評(píng)論 2 351