国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
你如何成為L(zhǎng)isp程序員

問(wèn)題之:你是如何成為 Lisp 程序員的?

答:我成為 Lisp 程序員的道路曲折而漫長(zhǎng)。我曾于 2007 年 10 月 3 日在自己的日記中總結(jié)了自己的學(xué)習(xí)經(jīng)歷,現(xiàn)抄錄于此。

最早在 2000 年 5 月,斯托曼院士訪華時(shí)告訴我,Lisp (或者它的現(xiàn)代變種 Scheme)是功能最強(qiáng)大的編程語(yǔ)言,他本人就是一位高級(jí)的 Lisp 程序員,他還精通 C,GNU Emacs 就是采用 C 和 Lisp 兩者開(kāi)發(fā)的。我當(dāng)時(shí)已經(jīng)掌握了 C,但不會(huì)用 Lisp,但是我完全相信他說(shuō)的都是真的。于是,一心想成為編程

高手的我,決定學(xué)習(xí)和掌握這門(mén)編程語(yǔ)言。我從 2000 年下半年開(kāi)始學(xué)習(xí) Lisp。下面總結(jié)的學(xué)習(xí)經(jīng)歷大致按照時(shí)間先后順序排出:

有必要先說(shuō)明一點(diǎn),在我遇到斯托曼院士之前,我在上大學(xué)時(shí)曾經(jīng)閱讀過(guò)一本關(guān)于人工智能的著作,《Artificial Intelligence --- Making machines "think"》,
作者是 Neill Graham,這本書(shū)的最后一章(第14章)是關(guān)于 Lisp 語(yǔ)言的簡(jiǎn)介,
所以我對(duì)人工智能和 Lisp 的概念并不完全陌生。這本書(shū)前面的章節(jié)都很好理解,但是在這最后一章,我遇到了很大困難。我花了許多時(shí)間試圖明白其中的道理,不過(guò)最后成效不彰,現(xiàn)在回想起來(lái),究其緣故,最主要的就是我沒(méi)有一個(gè)適當(dāng)?shù)纳蠙C(jī)練習(xí)環(huán)境,在讀了許多書(shū)中的東西后,當(dāng)時(shí)我感覺(jué)似乎明白了其道理,但是實(shí)際上并沒(méi)有真正理解清楚。不過(guò),有兩點(diǎn)在我看來(lái)無(wú)疑是確定的:一、Lisp 早已經(jīng)成為人工智能研究項(xiàng)目的首選(或者說(shuō)是默認(rèn)的)編程工具,在人工智能領(lǐng)域沒(méi)有其他語(yǔ)言能撼動(dòng)其領(lǐng)導(dǎo)地位。二、對(duì)于具有表結(jié)構(gòu)的數(shù)據(jù)操作,對(duì)于列表(list)頭元素(pair 的 car 的部分)的處理采用遞歸方式比較好,而對(duì)于眾多的體元素(pair 的 cdr 的部分)則采用迭代的方式處理效率更好。

斯托曼院士回國(guó)后,我首先在計(jì)算機(jī)上嘗試用 Emacs Lisp 編程,
它是嵌入在 GNU Emacs 文本編輯器中的解釋器。在龐大的 Lisp 家譜中,
Emacs Lisp 不是 Common Lisp,而是早期的 MacLisp 的一個(gè)直系后代,
同時(shí)在一些方面作了簡(jiǎn)化和強(qiáng)化。同時(shí)我開(kāi)始閱讀 Robert Chassell 所著 《Introduction to Emacs Lisp Programming》,Robert Chassell 是斯托曼院士早年結(jié)識(shí)的戰(zhàn)友,也是自由軟件基金會(huì)的合創(chuàng)人之一,他很早就使用 GNU Emacs,而且使用 Emacs Lisp 程序定制 GNU Emacs,斯托曼友善地把 Robert Chassell 介紹給我認(rèn)識(shí)。 這本書(shū)既是自由文檔(可以從 GNU 的網(wǎng)站自由下載),又是自由軟件基金會(huì)出版社(GNU Press)的出版物。等我讀完了這本書(shū)之后,我覺(jué)得這本書(shū)實(shí)在太美妙了,作者的文筆十分了不起(即使對(duì)于想學(xué)習(xí)英文寫(xiě)作的人,幫助也應(yīng)該很大),把這本書(shū)介紹給其他人是完全值得的。我于是找了兩位翻譯人員(毛文濤博士和呂芳女士),把它譯成了中文,我則擔(dān)任了全書(shū)的編輯和審校工作。中文版質(zhì)量很高,我很滿意,它作為一本很偉大的編程入門(mén)書(shū)籍十分適合廣大讀者自學(xué)(我認(rèn)為讀者應(yīng)該搞到一本閱讀)。我至今還想自己動(dòng)手翻譯這本書(shū)的第三版,可惜如今我很難再找到當(dāng)年那么多的時(shí)間做編輯和審校之類(lèi)的工作了。

閱讀完這本書(shū)之后,我意識(shí)到如果想使用 Emacs Lisp 開(kāi)發(fā)非玩具級(jí)別的實(shí)際應(yīng)用程序,那么根據(jù)作者的推薦,自由軟件基金會(huì)出版的《GNU Emacs Lisp Reference Manual》是必不可少的工具書(shū),我打印了這份文檔的第 2.4 版本,厚厚的共四本。后來(lái)這份文檔正式出版,從 GNU 網(wǎng)站上訂購(gòu)的圖書(shū)升級(jí)到了 2.6 版本,針對(duì)的是 GNU Emacs version 21。我不太認(rèn)同 Eric Raymond 在他的名著 《The Art of Unix Programming》中對(duì) Emacs Lisp 的評(píng)論,他以為 Emacs Lisp 只能為 Emacs 編輯器本身編寫(xiě)控制程序,而趕不上其他腳本語(yǔ)言全面。實(shí)際上,我認(rèn)為只要熟悉了 Emacs Lisp 的細(xì)節(jié),其他任何腳本語(yǔ)言能完成的工作,都可以使用 Emacs Lisp 程序完成。我親眼看見(jiàn)斯托曼院士在 GNU Emacs 內(nèi)完成電子郵件的編輯、收發(fā)等工作,不用 Eric Raymond 開(kāi)發(fā)的 fetchmail 程序一樣干得很好。我自己也利用 Emacs Lisp 編寫(xiě)過(guò) CGI 應(yīng)用程序,效果也不錯(cuò)。

Bob Glickstein 曾經(jīng)寫(xiě)過(guò)一本《Writing GNU Emacs Extensions》,可以配合 Robert Chassell 的書(shū)與《GNU Emacs Lisp Reference Manual》,作為補(bǔ)充讀物。

讀了 Robert Chassell 的書(shū)之后,我開(kāi)始花時(shí)間閱讀 David Touretzky 博士所著的 《Common Lisp: A Gentle Introduction to Symbolic Computation》,這本書(shū)可以從互聯(lián)網(wǎng)上自由下載,讀者可以自行在萬(wàn)維網(wǎng)上 google 得到它。 這也是一本偉大的 Lisp 著作,內(nèi)容已經(jīng)是基于 Common Lisp 的,但是作者并沒(méi)有特意強(qiáng)調(diào)這一點(diǎn)。我把下載的 PDF 文件打印出來(lái),自己動(dòng)手把打印出的文檔紙張裝訂成了兩卷手冊(cè)。  我從這本書(shū)中得到的最大收獲是我充分認(rèn)識(shí)到 Lisp 中的一切都是對(duì)象:數(shù)字原子(numeric atoms)和符號(hào)原子(symbolic atoms)都是對(duì)象。數(shù)字原子求值返回它自身的值,而符號(hào)原子則有名稱(name)、類(lèi)型(type)、值(value)、秉性表(plist)和綁定表(bindlist)。這五個(gè)字段可以放入一個(gè)數(shù)據(jù)結(jié)構(gòu)中,并在實(shí)現(xiàn)中以 C 語(yǔ)言的 struct 表達(dá)。

在閱讀這些材料的同時(shí),我又從網(wǎng)上找到了 Gary Knott 教授編寫(xiě)的一份文檔,《Interpreting Lisp》,這份文檔篇幅不長(zhǎng),從來(lái)沒(méi)有正式出版成書(shū)。在這份文檔中,作者利用 C 語(yǔ)言編寫(xiě)了一個(gè)微小的 Lisp 實(shí)現(xiàn),非常接近于最初的 Lisp 實(shí)現(xiàn)。最可貴的是他將實(shí)現(xiàn)的源代碼和盤(pán)托出。從這本書(shū)中,我清晰地看到了如何構(gòu)造 Lisp 對(duì)象的結(jié)構(gòu),我開(kāi)始認(rèn)識(shí)到內(nèi)存垃圾收集算法的重要性。在理解了 David Touretzky 博士所著的 《Common Lisp: A Gentle Introduction to Symbolic Computation》介紹的 Lisp 對(duì)象的結(jié)構(gòu)基礎(chǔ)上,我明白了書(shū)中圖示的 Lisp 對(duì)象中若僅在結(jié)構(gòu)設(shè)計(jì)時(shí)安排五個(gè)字段是不夠的,還需要有供垃圾回收(GC,Garbage CCollector)模塊操作的字段才行。

在 2001-2002 期間,我開(kāi)始接觸 Scheme。在此之前的 2000 年 8 月,Rorbert Chassell 曾來(lái)中國(guó)訪問(wèn),我們?cè)谖靼矔r(shí),他向我介紹了 Scheme 是我應(yīng)該關(guān)注的語(yǔ)言。Scheme 于 1985 年誕生于 MIT,發(fā)明人有兩位:一位是 Gerald Sussman 教授,他是自由軟件基金會(huì)的董事會(huì)成員之一,另一位是 Guy J.Steele 博士,下面即將更多地提到。我首先使用了 Dorai Sitaram 所著的教材《Teaching Yourself Scheme in Fixnum Days》,這份文檔可以從網(wǎng)絡(luò)自由下載,不過(guò)坦率地說(shuō),這本書(shū)教材不太適合初學(xué)者,閱讀它的人至少應(yīng)該具有很多基礎(chǔ)知識(shí)或者經(jīng)驗(yàn)才行。我并沒(méi)有從這本書(shū)從獲得太多的幫助,對(duì) Scheme 的基本概念也沒(méi)有搞清楚,特別是連續(xù)(Continuation)之類(lèi)的概念沒(méi)有理解。不過(guò),收獲還是有很多,我意識(shí)到 Scheme 是一個(gè)非常優(yōu)美的 Lisp 變種,它繼承了源自 Algol60 和早期 Lisp 兩者的特點(diǎn)。這份教材的最后還列舉出了一個(gè)具體的編程實(shí)例,講授如何利用 Scheme 編寫(xiě) CGI 程序?,F(xiàn)在我看來(lái),在 CGI 編程等領(lǐng)域, Perl 和 PHP 等腳本語(yǔ)言獲得廣泛應(yīng)用簡(jiǎn)直就是鉆了 Lisp 社團(tuán)不善營(yíng)銷(xiāo)的空子。

到了 2001 夏天,我從美國(guó)獲得了《Structure and Interpretation of Computer Programs》的教師手冊(cè),是我的朋友 James Gray 幫我買(mǎi)的,他是我一個(gè)很好的朋友,不過(guò)我這里要善意地埋怨一下,他做事有些馬大哈,我原來(lái)希望他給我搞到這本書(shū)的學(xué)生用書(shū),沒(méi)有想到他卻寄來(lái)了教師手冊(cè),我想他在買(mǎi)書(shū)時(shí)沒(méi)有仔細(xì)區(qū)分一下,而此著作的教師手冊(cè)和學(xué)生用書(shū)的封面都采用了同一圖案,作者和 MIT 出版社的編輯的確很優(yōu)秀,他們?cè)跔I(yíng)銷(xiāo)本書(shū)時(shí)非常成功,后來(lái)專門(mén)還開(kāi)設(shè)了一個(gè)網(wǎng)站推廣本書(shū)和相關(guān)的教學(xué)材料,網(wǎng)上公布了教材的全部?jī)?nèi)容,加上兩位作者課堂教學(xué)的視頻錄像。 教師手冊(cè)價(jià)格比較便宜,James 在購(gòu)買(mǎi)時(shí)要么沒(méi)有仔細(xì)辨認(rèn)清楚,要么就是幫我省錢(qián),才寄來(lái)了這本教師手冊(cè)。我當(dāng)時(shí)沒(méi)有學(xué)生手冊(cè),也就沒(méi)有繼續(xù)學(xué)習(xí) Scheme。不過(guò)話說(shuō)回來(lái),James 寄給我的教師手冊(cè)我一直都留在我手頭,后來(lái)對(duì)于我在黑客道教學(xué)中講授 Scheme 幫助極大,在這里還是應(yīng)該深深地感謝 James Gray。

不久(2003年),我買(mǎi)了一本 Patrick Winston 教授所著的《Common Lisp》第三版, 作者是麻省理工學(xué)院人工智能實(shí)驗(yàn)室的主任(斯托曼早年就是他手下的兵),在美國(guó)的人工智能研究領(lǐng)域名氣很大,我就是沖著他的名氣才買(mǎi)此書(shū)的。閱讀完之后,我覺(jué)得這位教授名副其實(shí),而不像我在國(guó)內(nèi)見(jiàn)到的一些人徒有虛名,拿不出真東西。這是一本介紹 Common Lisp 的極好教材。后來(lái) Hans Hagen (ConTeXt 排版軟件包的主要作者之一)告訴我這本書(shū)的合著者  Berthold Klaus Paul Horn 在 TeX 社團(tuán)名氣也很大,的確如此,從本書(shū)的排版質(zhì)量即可看出許多名堂來(lái),排版樣式一看就是典型的 TeX 風(fēng)格。 作為中文 TeX 用戶俱樂(lè)部(CTUG)的主席,我已經(jīng)知道,國(guó)內(nèi)學(xué)術(shù)界(我指的是數(shù)學(xué)界和計(jì)算機(jī)科學(xué)技術(shù)界)很少有人精通 TeX 排版系統(tǒng),鮮有人能使用它排版自己的講義或著作。

讀了這本書(shū)之后,我感覺(jué)自己必須閱讀 Common Lisp 的語(yǔ)言參考手冊(cè),許多問(wèn)題必須在看到語(yǔ)言規(guī)范(這是基本的尺度)之后才能搞清楚。 Guy L. Steele 博士寫(xiě)過(guò)這樣的手冊(cè),而且他寫(xiě)了兩次,第一個(gè)版本是在 Common Lisp 標(biāo)準(zhǔn)化之前完成的,第二個(gè)版本是在標(biāo)準(zhǔn)化完成之后寫(xiě)成的,但是網(wǎng)上有人評(píng)論說(shuō)有些該寫(xiě)的東西沒(méi)有寫(xiě)進(jìn)去,此書(shū)是否會(huì)有第三版不得而知。Guy L. Steele 博士是非常著名的語(yǔ)言手冊(cè)的作者,他已經(jīng)為 C、Common Lisp、Java 等編程語(yǔ)言都寫(xiě)過(guò)的語(yǔ)言參考手冊(cè),都非常成功,這些參考手冊(cè)都是一版再版,銷(xiāo)路極好,比位于瑞士的國(guó)家標(biāo)準(zhǔn)化組織(ISO)發(fā)布的非常昂貴的標(biāo)準(zhǔn)文檔銷(xiāo)路好許多。他寫(xiě)的這些語(yǔ)言參考手冊(cè)已經(jīng)成為編寫(xiě)這些語(yǔ)言編譯器作者們的大救星。

大約在同時(shí),我下載了 《On Lisp》,這是 Paul Graham 博士編寫(xiě)的一本優(yōu)秀著作,從中我得到了許多 Lisp 概念的細(xì)節(jié),特別是 Lisp 的 macro 機(jī)制,
以及黑客們?nèi)绾卫?Lisp 思考問(wèn)題。作者介紹的自底向上(bottom up)的方法論對(duì)我觸動(dòng)很大,而作者的講解是非常富于啟發(fā)性的(作者曾專程赴意大利的美術(shù)學(xué)院學(xué)習(xí)過(guò)油畫(huà)創(chuàng)作,所以具有很高的藝術(shù)修養(yǎng))。從那時(shí)開(kāi)始,混合編程(Hybrid Programming)的思想在我頭腦中開(kāi)始成型,我堅(jiān)信 Lisp 將會(huì)成為一種非常長(zhǎng)壽的編程語(yǔ)言,這使我聯(lián)想起斯托曼院士當(dāng)年在四川九寨溝就 GNU Emacs 開(kāi)發(fā)對(duì)我講過(guò)的話。在 GNU Emacs 和 Lisp 背后隱含的方法論是永遠(yuǎn)不會(huì)過(guò)時(shí)的。

2004 年,我真正找到了 Lisp 編程的感覺(jué),覺(jué)得自己開(kāi)始進(jìn)入狀態(tài),
并開(kāi)始使用 Scheme 開(kāi)發(fā)真正的應(yīng)用程序,我編寫(xiě)的程序是一個(gè)網(wǎng)絡(luò)應(yīng)用程序,即一個(gè)網(wǎng)絡(luò)留言板(Web-based bulletin System),在萬(wàn)維網(wǎng)上可以運(yùn)行,
CGI 的模塊是采用 Scheme 寫(xiě)的,Apache 在服務(wù)器上通過(guò) Scheme 的 CGI 程序接上了 PostgreSQL 數(shù)據(jù)庫(kù)。我使用的是 PLT Scheme 的 103 版本,我非常喜歡這個(gè)版本,既簡(jiǎn)單又很干凈,我用 C 語(yǔ)言和 PostgreSQL 提供的 libpg 編寫(xiě)了一個(gè) DA (database adaptor),讓 Scheme 程序可以訪問(wèn) PostgreSQL 數(shù)據(jù)庫(kù)。

完成了這個(gè)項(xiàng)目之后,好事成雙,我得到了渴望已久的《Structure and Interpretation of Computer Programs》(簡(jiǎn)稱 SICP,或者“紫皮書(shū)”),作者就是 Harold Abelson 教授和 Gerald Sussman 教授。正是這一年,我開(kāi)始利用自己頭腦中形成的數(shù)學(xué)觀點(diǎn),特別是在我的泛系尺度論中表達(dá)的思想,來(lái)認(rèn)真學(xué)習(xí) Scheme,并且主動(dòng)地從中國(guó)古代的陰陽(yáng)太極圖模型來(lái)理解當(dāng)今電子計(jì)算機(jī)系統(tǒng)上的計(jì)算模型。這一過(guò)程延續(xù)了很長(zhǎng)時(shí)間,直到 2005 年的冬天才最終獲得成功! 這期間的許多思想寫(xiě)入了我的著作《自由軟件:新的游戲規(guī)則》第三卷內(nèi)篇的第二章“論尺度”。今后我還準(zhǔn)備花更多的時(shí)間把它擴(kuò)展開(kāi)來(lái),形成一部單行本的著作《泛系尺度論》,在這個(gè)單行本中,我將利用更長(zhǎng)的篇幅把中國(guó)古代的哲理思想、現(xiàn)代數(shù)學(xué)思想和計(jì)算機(jī)編程融為一體,對(duì)整個(gè)計(jì)算理論提出自己完整的一家之言。在黑客道九個(gè)段位中,初段就是講“計(jì)算的本質(zhì)”,里面就納入了我的思想方法和編程經(jīng)驗(yàn)。

2004-2005 年期間,我仔細(xì)地研究了 R5RS 文檔中除了第七章之外的所有內(nèi)容,
收獲巨大。對(duì)于第七章的內(nèi)容,當(dāng)時(shí)仍然有些疑惑,因?yàn)檫@些材料需要理解大量的關(guān)于 lambda calculi 的細(xì)節(jié)和大量的預(yù)備知識(shí),我當(dāng)時(shí)還沒(méi)有找到充分的材料鉆研。另外,在研究 PLT Scheme 的源代碼時(shí),內(nèi)存垃圾回收算法對(duì)我而言,仍然是一大疑難問(wèn)題,顯然,對(duì)于內(nèi)存垃圾回收技術(shù),我還需要學(xué)習(xí)更多的背景材料。

到了 2005 年的年底,我把 R5RS 翻譯成了中文。在完成翻譯的過(guò)程中,我知道了如何利用形式語(yǔ)言和擴(kuò)展的巴科斯-勞爾范式(EBNF)來(lái)定義一門(mén)編程語(yǔ)言的形式句法和語(yǔ)義規(guī)則,以及如何正確理解和讀懂它。

2005-2006期間,我學(xué)習(xí)了其他許多關(guān)于 Lisp 編程的書(shū)籍,包括 Paul Graham 博士的《ANSI Common Lisp》、 Matthew Flatt 等人合著的 《How to Design
Programs》, Brian Harvey 和 Matthew Wright 合著的 《Simply Scheme ---
Introducing Computer Science》(此書(shū)的封面設(shè)計(jì)別出心裁,非常值得回味)、
Daniel Friedmann 和 Matthias Felleisen 合著的 《The Little Schemer》 和
《The Seasoned Schemer》。另外我花了相當(dāng)多的時(shí)間仔細(xì)閱讀 《The Scheme Programming Language, 3e》,這是 R. Dybvig 教授的代表作,他是 Chez Scheme 實(shí)現(xiàn)的設(shè)計(jì)大師。年底我得到了 《Hackers and Painters》(“黑客和畫(huà)家”),這是 Paul Graham 博士所著的散文集,與 Robert Chassell 一樣,他也是一位偉大的作家,他的行文非常容易閱讀,而且這本書(shū)中的內(nèi)容如同其書(shū)名副標(biāo)題一樣,的確收入了許多偉大的想法,這些想法對(duì)于創(chuàng)新公司利用 Lisp 開(kāi)發(fā)創(chuàng)新項(xiàng)目是非常富有啟發(fā)性的。

2006 年 7 月 15 日,我的學(xué)生千俊哲從南韓的漢城大學(xué)帶來(lái)了他學(xué)習(xí)的兩本著作的復(fù)印件:George Springer 和 Daniel P. Friedman 合著的《Scheme and the Art of Programming》,以及 Mark Watson 的 《Programming in Scheme: Learn Scheme through Artificial Intelligence Programs》。前一本的難度在紫皮書(shū)之下,比較好讀,其中許多程序如同棋譜一樣,展現(xiàn)了許多高級(jí)編程技巧,值得反復(fù)思考,我立即在 PLT Scheme 實(shí)現(xiàn)上驗(yàn)證了書(shū)中的大部分代碼;后一本則介紹如何使用 MIT Scheme 來(lái)設(shè)計(jì)人工智能程序,非常精彩。

2006 年 7 月送走了千俊哲之后的夏天,我一直在瑞士蘇黎世度假(八月下旬我還去了西班牙馬德里參加了國(guó)際數(shù)學(xué)家大會(huì)),蘇黎世中央圖書(shū)館(ZB,Zentralbibliothek Zuerich)是一所了不起的圖書(shū)館,現(xiàn)有藏書(shū)一百二十萬(wàn)種。據(jù)說(shuō)列寧當(dāng)年在歐洲流亡時(shí)曾來(lái)到蘇黎世,就睡在這個(gè)圖書(shū)館里讀書(shū)學(xué)習(xí)。八月份時(shí),大多數(shù)瑞士人也在休假,圖書(shū)館的人不多,非常安靜。我在這段時(shí)間從圖書(shū)館中找到了非常多的背景材料,包括 H.P. Barendregt 所著的數(shù)學(xué)經(jīng)典教材 《The Lambda Calculus --- Its Syntax and Semantics》,這本書(shū)于 1981 年由 North Holland 出版社出版,對(duì)這一數(shù)學(xué)分支作了詳盡的介紹,我認(rèn)為對(duì)于這一主題,今后再也無(wú)人可以寫(xiě)得比這本著作更好了。 另外,我找到了第一本關(guān)于 lambda calculus 的著作,是由這個(gè)理論的創(chuàng)始人 Alonzo Church 教授創(chuàng)作的,《The Calculi of Lambda-conversion》 簡(jiǎn)直是無(wú)價(jià)之寶,在這本小冊(cè)子中,作為數(shù)學(xué)家,作者清晰而精煉地闡明了 lambda calculi 的全部?jī)?nèi)容。任何一位想掌握 lambda calculus 的人都應(yīng)該仔細(xì)閱讀本書(shū)。在圖書(shū)館中還找到了 《An Introduction to Lmabda Calculi for Computer Scientists》, 作者是 Chris Hankin。 Matthias Felleisen 和 Matthew Flatt 合寫(xiě)的 《Programming Language and Lambda Calculi》也打印出來(lái)了,并仔細(xì)閱讀了兩遍,這兩人是 PLT Scheme 研發(fā)小組的核心成員。 在蘇黎世中央圖書(shū)館的書(shū)架上,我還看到了 SCIP 紫皮書(shū)的第一版的德文本,書(shū)中的內(nèi)容與英文版第二版大同小異,但是我敏銳地發(fā)現(xiàn),第一版的第四章中沒(méi)有收入 eval 和 apply 兩個(gè)高階算子構(gòu)成的太極推手圖,第二版中則出現(xiàn)了。

我花時(shí)間研究了 《Lisp 1.5 Programmer's Manual》,這是世界上第一份真正意義上正式發(fā)布過(guò)的 Lisp 穩(wěn)定實(shí)現(xiàn)版本的手冊(cè),作者就是 John McCarthy 等人,極具學(xué)術(shù)權(quán)威性,我認(rèn)為任何一位 Lisp 程序員都應(yīng)該閱讀這本手冊(cè)。時(shí)隔多年后,我又開(kāi)始閱讀關(guān)于人工智能方面的著作,《Lisp, Lore and Logic》是 W. Richard Stark 寫(xiě)的,《Artificial Intelligence, theory and practice》 是 Thomas Dean 等人寫(xiě)的,他們都已經(jīng)使用 Common Lisp 來(lái)說(shuō)明問(wèn)題。閱讀時(shí),我參考了前面已經(jīng)提到的 Partrick Winston 教授編寫(xiě)的經(jīng)典教材 《Artificial Intelligence, 3e》。

2007 年初,我開(kāi)始關(guān)注 Scheme 社團(tuán)中尚處于起草狀態(tài)中的 R6RS,這個(gè)文件將成為新的 Scheme 語(yǔ)言規(guī)范。我現(xiàn)在仍然認(rèn)為 Common Lisp 太復(fù)雜、太龐大,回廠大修似乎也不太可能,因?yàn)楣I(yè)界已經(jīng)很好地接受了 Common Lisp,而 Scheme 將是未來(lái)的主流。我開(kāi)始按照這一規(guī)范來(lái)開(kāi)發(fā)自己的 Scheme 實(shí)現(xiàn)版本,這一實(shí)現(xiàn)版本稱為 MNM Scheme。

2007年6月至7月間,我在瑞士蘇黎世的 Campus Zollikerberg 打印了 R5.97RS,
我花了許多時(shí)間理解這一新的規(guī)范,特別是它與前一個(gè)版本(R5RS)的差異。
同時(shí),我重新思考了 PLT Scheme 實(shí)現(xiàn)的源代碼和涉及模塊(modules)、名稱空間(namespaces)、盒子(box)類(lèi)型、define-values 和其他附加在 R5RS 規(guī)范之上的特性與實(shí)現(xiàn)風(fēng)格。

從蘇黎世中央圖書(shū)館借到的另外一本具有重大價(jià)值的著作就是 Richard Jones 和 Rafael Lins 合著的《Garbage Collection》,這本書(shū)極大地幫助我理解了內(nèi)存垃圾回收算法設(shè)計(jì)的細(xì)節(jié)。我從此開(kāi)始真正明白了 Scheme 實(shí)現(xiàn)工作中的最后一個(gè)陰暗角落。對(duì)于一切 Lisp 對(duì)象,內(nèi)存垃圾收集的算法設(shè)計(jì)時(shí)其實(shí)不存在理論上的最優(yōu)算法,算法的效率受到多種因素的影響,而 Lisp 的設(shè)計(jì)者可以根據(jù)自己的設(shè)計(jì)思想來(lái)決定應(yīng)該怎樣回收內(nèi)存垃圾。

這時(shí)的我已經(jīng)成長(zhǎng)為熟練的 C++ 程序員,站在 C++ 程序員的立場(chǎng)看,一切 Lisp 對(duì)象都有類(lèi)型,我可以用 C++ 語(yǔ)言內(nèi)置的類(lèi)(class)來(lái)刻畫(huà)它們(即聲明各種用戶自定義的類(lèi)),一切 Lisp 對(duì)象從存儲(chǔ)空間分配和回收的角度來(lái)看具有共性,所以,這可以利用 C++ 的模板來(lái)表達(dá) Lisp 對(duì)象的存儲(chǔ)管理結(jié)構(gòu),而各個(gè) Lisp 對(duì)象占有的存儲(chǔ)空間大小,則可以利用類(lèi)的構(gòu)造函數(shù)(constructor)和析構(gòu)函數(shù)(destructor)對(duì)內(nèi)存分配和內(nèi)存垃圾回收在模板的支持下進(jìn)行統(tǒng)一的操作。

源自 Lisp 發(fā)展起來(lái)的 GC 是一項(xiàng)“古老”的技術(shù),實(shí)際上它已經(jīng)廣泛地被采用了,Java 這門(mén)當(dāng)今新的商業(yè)編程語(yǔ)言中就有,而且 Java 的 GC 算法設(shè)計(jì)得非常好,我決定在我的 Scheme 實(shí)現(xiàn)中參考它。2007 年 9 月,我在從香港飛往蘇黎世的飛機(jī)上,我閱讀了美國(guó)著名的程序員 Bruce Eckel 所著的 《Thinking in Java》的第四版原著,從作者的介紹中,我結(jié)合從《Garbage Collection》中獲得的知識(shí),我理解了 Java 的內(nèi)存垃圾回收算法的總體思路,并構(gòu)思了如何利用他們的算法來(lái)改進(jìn)我的設(shè)計(jì)。 而在我離開(kāi)蘇黎世回國(guó)的同一天(2007年9月26日),R6RS 技術(shù)委員會(huì)的全體編輯成員決定凍結(jié)對(duì)草案的討論,正式發(fā)布了這一規(guī)范,從那一天起,我實(shí)現(xiàn) MNM Scheme 的步伐也大大加快了。(不過(guò),請(qǐng)讀者留意在委員會(huì)舉辦的投票時(shí),也有許多人投了反對(duì)票,并給出了反對(duì)意見(jiàn),這些意見(jiàn)與支持的意見(jiàn)一起,都是極有研究?jī)r(jià)值的。)

Scheme 的實(shí)現(xiàn)版本非常多,而且自己能否動(dòng)手實(shí)現(xiàn)一個(gè)是考驗(yàn)一個(gè)計(jì)算機(jī)專業(yè)人士學(xué)術(shù)修養(yǎng)深淺的好指標(biāo)(這也是我在黑客道中把第五段的教學(xué)內(nèi)容定為“解釋器的原理與構(gòu)造”的原因之一)。迄今優(yōu)秀的 Scheme 實(shí)現(xiàn)有: PLT Scheme、MIT Scheme、Chez Scheme 等等。我認(rèn)為 PLT Scheme 是非常優(yōu)秀的實(shí)現(xiàn)版本,它是按照 GPL 發(fā)布的自由軟件,值得在這里推薦給廣大讀者。毫不客氣地講,我的 MNM Scheme 也應(yīng)該算一個(gè)。

Common Lisp 的實(shí)現(xiàn)版本很多,拋開(kāi) Franz Lisp 等商業(yè)版本不談,自由軟件社團(tuán)中最有名的兩個(gè)實(shí)現(xiàn)分別是:Bruno Haible 等人從 1992 年以來(lái)一直維護(hù)和開(kāi)發(fā)的 CLISP,以及卡耐基梅隆大學(xué)的小組開(kāi)發(fā) CMU Common Lisp。這兩個(gè) Common Lisp 實(shí)現(xiàn)都很好,我個(gè)人比較喜歡使用 CLISP。目前最好的 Common Lisp 編程著作可推薦 Peter Seibel 寫(xiě)的 《Practical Common Lisp》,這位作者的天分顯然比我高,他原來(lái)是 Java 和 Perl 程序員,2004年才開(kāi)始學(xué)習(xí) Common Lisp,他花了一年的時(shí)間學(xué)習(xí)它,就完全學(xué)會(huì)了,而且在學(xué)習(xí)的同時(shí),邊練習(xí)、邊寫(xiě)書(shū),結(jié)果很豐碩,寫(xiě)出的這本書(shū)就是讀者能看到的結(jié)果,這本書(shū)得到了廣泛的認(rèn)可,它出版后獲得了美國(guó)出版界計(jì)算機(jī)圖書(shū)創(chuàng)作的震撼大獎(jiǎng)。他在一次采訪中提出了一個(gè)新的說(shuō)法:時(shí)代的發(fā)展需要“第二代 Lisp 程序員”,而且每個(gè)程序員都應(yīng)該學(xué)習(xí) Lisp。(讓我再次回憶起斯托曼院士在 2000 年時(shí)對(duì)我說(shuō)過(guò)的話。)

正如讀者在上面所讀到的,成為一位了解 Lisp 一切內(nèi)幕的程序員可真不容易,但是我很高興,因?yàn)槲乙呀?jīng)成功地逾越過(guò)了這個(gè)初看起來(lái)曾經(jīng)非常高的門(mén)檻,我現(xiàn)在已經(jīng)是這樣一位程序員了。學(xué)習(xí) Lisp 給我?guī)?lái)了巨大的樂(lè)趣,如果沒(méi)有這種在編程中產(chǎn)生的樂(lè)趣相伴,我絕對(duì)不會(huì)花這么長(zhǎng)的時(shí)間來(lái)學(xué)習(xí)它。今天,我由衷地自豪,因?yàn)槿绻凑?Peter Seibel 的說(shuō)法和衡量標(biāo)準(zhǔn),我已經(jīng)是第二代優(yōu)秀的 Lisp 程序員群體中的一分子。

上面羅列的學(xué)習(xí)經(jīng)歷對(duì)于一般人而言顯然太長(zhǎng)了,黑客道學(xué)員們則可以站在我的肩膀上,借鑒我的經(jīng)驗(yàn)和教訓(xùn),少走許多彎路、避免走死胡同。值得慶幸的是,我已經(jīng)在黑客道的課程設(shè)計(jì)中自覺(jué)地做了許多工作,凡是參加了黑客道的初段課程學(xué)習(xí)的學(xué)員(S1:“計(jì)算的本質(zhì)”),即可在較短的時(shí)間內(nèi)學(xué)會(huì)掌握 Lisp。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
幾個(gè)免費(fèi)的Scheme(Lisp)解釋器
編程的宗派
(轉(zhuǎn))計(jì)算機(jī)程序的構(gòu)造和解釋 學(xué)習(xí)與了解
學(xué)校只教Java的危險(xiǎn)性
【C 語(yǔ)言經(jīng)典書(shū)籍】
超神們:十五位健在的世界級(jí)程序員
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服