計(jì)算機(jī)就像小提琴贡避。試想一下痛黎,門(mén)外漢第一次聽(tīng)留聲機(jī)予弧,接著就去拉小提琴。之后湖饱,他定會(huì)說(shuō)掖蛤,小提琴聽(tīng)起來(lái)真糟糕。此類(lèi)情節(jié)井厌,我們?cè)缫褟娜吮局髁x者和絕大多數(shù)計(jì)算機(jī)科學(xué)家口中聽(tīng)聞過(guò)蚓庭。人們常說(shuō),計(jì)算機(jī)程序?qū)μ囟繕?biāo)是有效的仅仆,但缺乏靈活性彪置。可是蝇恶,你既不可能拉好小提琴拳魁,也不可能碼好打字機(jī),除非你學(xué)習(xí)如何使用它們撮弧。
——Marvin Minsky “為什么程序是表達(dá)不求甚解潘懊、囫圇吞棗之想法的良好媒介(Why Programming is a Good Medium for Expressing Poorly?Understood and Sloppily Formulated Ideas)“
本書(shū)是MIT計(jì)算機(jī)科學(xué)的入門(mén)科目。在MIT贿衍,對(duì)于所有主修電子工程或計(jì)算機(jī)科學(xué)的學(xué)生授舟,這是門(mén)必修課,是四門(mén)之一的“公共核心課程”贸辈。其他還包括:兩門(mén)電路和線(xiàn)性系統(tǒng)課程释树、一門(mén)數(shù)字系統(tǒng)設(shè)計(jì)課程。自1978年擎淤,我們便已致力于本課程的開(kāi)發(fā)奢啥。從1980年秋開(kāi)始,每年都在6到7百名學(xué)生中用現(xiàn)在的方式講授本課程的內(nèi)容嘴拢。雖然有些人已使用過(guò)計(jì)算機(jī)桩盲,其中還有少數(shù)人已有大量的軟件或硬件的設(shè)計(jì)經(jīng)驗(yàn),但是絕大多數(shù)學(xué)生先前幾乎都沒(méi)有過(guò)正式的計(jì)算訓(xùn)練席吴。
我們對(duì)這門(mén)計(jì)算機(jī)科學(xué)導(dǎo)論的材料安排反映了兩大關(guān)注點(diǎn)赌结。第一,我們想要建立一種觀(guān)念孝冒,即計(jì)算機(jī)語(yǔ)言不僅是指導(dǎo)計(jì)算機(jī)執(zhí)行操作的手段柬姚,更是表達(dá)方法觀(guān)念的新穎的、規(guī)范的媒介庄涡。因此量承,程序必定是寫(xiě)給人閱讀的,其次才是給機(jī)器執(zhí)行。第二宴合,我們相信焕梅,該層次課程的基本內(nèi)容的著重點(diǎn)不該是特定程序設(shè)計(jì)語(yǔ)言的結(jié)構(gòu)的語(yǔ)法,也不該是計(jì)算特定函數(shù)快速精巧的算法卦洽,更不該是算法的數(shù)學(xué)分析以及計(jì)算理論贞言,而該是用于控制大型軟件系統(tǒng)復(fù)雜度的技巧。
我們的目標(biāo)是阀蒂,學(xué)生完成本課程后可以對(duì)編碼風(fēng)格和編程美學(xué)有良好的感知该窗。他們應(yīng)當(dāng)掌握控制大型系統(tǒng)復(fù)雜度的主要技巧;應(yīng)當(dāng)有能力閱讀50頁(yè)長(zhǎng)的程序——只要程序的書(shū)寫(xiě)風(fēng)格良好;應(yīng)當(dāng)知道程序何時(shí)不必去閱讀蚤霞,何時(shí)不必去理解酗失;應(yīng)當(dāng)有把握修改程序,并保持原作者的本意和風(fēng)格昧绣。
這些技能絕不僅適用于計(jì)算機(jī)編程规肴。我們教授和使用的技巧適用于所用工程設(shè)計(jì)。通過(guò)構(gòu)建抽象來(lái)控制復(fù)雜度夜畴,即適時(shí)隱藏細(xì)節(jié)拖刃;過(guò)建立通用接口來(lái)控制復(fù)雜度,這使我們構(gòu)建系統(tǒng)時(shí)能夠用“拼湊”的方法來(lái)組合規(guī)范的贪绘、易于理解的模塊兑牡;通過(guò)構(gòu)造描述設(shè)計(jì)的新語(yǔ)言來(lái)控制復(fù)雜度,它強(qiáng)調(diào)設(shè)計(jì)的特殊點(diǎn)税灌,弱化其余部分均函。
我們堅(jiān)信“計(jì)算機(jī)科學(xué)”不是科學(xué),并且“計(jì)算機(jī)科學(xué)”的重要性和計(jì)算機(jī)本身無(wú)關(guān)菱涤,這些觀(guān)念根植于本課程的開(kāi)發(fā)過(guò)程苞也。計(jì)算機(jī)革命是思維方式的革命,是思維表達(dá)的革命狸窘。這些改變的本質(zhì)是墩朦,過(guò)程認(rèn)識(shí)論(最好的稱(chēng)謂)的顯露,——從命令式的角度研究知識(shí)的結(jié)構(gòu)坯认,這與傳統(tǒng)數(shù)學(xué)學(xué)科的說(shuō)明式的角度截然不同翻擒。數(shù)學(xué)提供精確處理“what is”的框架。計(jì)算提供精確處理“how to”的框架牛哺。
在教學(xué)過(guò)程中陋气,我們使用程序設(shè)計(jì)語(yǔ)言L(fǎng)isp的一種方言。我們從未正式教這門(mén)語(yǔ)言引润,因?yàn)闆](méi)有必要巩趁。我們只管使用,學(xué)生便可在幾天之內(nèi)通過(guò)實(shí)踐學(xué)會(huì)。這是類(lèi)Lisp語(yǔ)言的一大優(yōu)勢(shì):除了少數(shù)組合復(fù)合表達(dá)式的方法议慰,幾乎沒(méi)有語(yǔ)法結(jié)構(gòu)蠢古。所有規(guī)范化特性能在一小時(shí)內(nèi)講完,就像國(guó)際象棋别凹。一段短時(shí)間后草讶,我們忘掉了該語(yǔ)言的語(yǔ)法細(xì)節(jié)(因?yàn)楸緛?lái)就沒(méi)有),開(kāi)始著手實(shí)際問(wèn)題——理解我們要計(jì)算什么炉菲,如何把問(wèn)題分解為易處理的幾個(gè)部分堕战,如何處理各個(gè)部分。Lisp的另一優(yōu)勢(shì)是拍霜,它支持(非強(qiáng)制)程序模塊化分解的大規(guī)模策略的能力優(yōu)于其他所有語(yǔ)言嘱丢。我們可以構(gòu)造過(guò)程和數(shù)據(jù)抽象,可以使用高階函數(shù)獲得慣用法的通用模式祠饺,可以使用賦值和數(shù)據(jù)轉(zhuǎn)換(data mutation)模擬局部狀態(tài)越驻,可以使用流(stream)和延時(shí)求值(delayed evaluation)鏈接程序的各部分,還可以簡(jiǎn)易實(shí)現(xiàn)嵌入式語(yǔ)言道偷。所有這些都深植于Lisp的交互式環(huán)境伐谈,該環(huán)境極好地支持增量式程序的設(shè)計(jì)、構(gòu)造试疙、測(cè)試和調(diào)試诵棵。我們要感謝世代的Lisp巫師(wizard天才),其中首推John McCarthy祝旷,他設(shè)計(jì)了功能極其強(qiáng)大履澳、設(shè)計(jì)極其優(yōu)雅的實(shí)用工具。
Scheme,我們使用的Lisp方言怀跛,試圖糅合Lisp和Algol的強(qiáng)大功能和優(yōu)雅設(shè)計(jì)距贷。從Lisp那里,獲得元語(yǔ)言的能力吻谋,這源自L(fǎng)isp簡(jiǎn)潔的語(yǔ)法忠蝗,源自L(fǎng)isp將程序作為數(shù)據(jù)對(duì)象的統(tǒng)一表示,源自L(fǎng)isp的數(shù)據(jù)垃圾回收和堆分配機(jī)制漓拾。從Algol那里阁最,獲得靜態(tài)域(lexical scoping)和塊結(jié)構(gòu),這是當(dāng)年Algol委員會(huì)的程序設(shè)計(jì)語(yǔ)言設(shè)計(jì)先驅(qū)贈(zèng)與我們的禮物骇两。在此速种,我希望提及John Reynolds和Peter Landin,他們洞悉了Church的Lambda演算與程序設(shè)計(jì)語(yǔ)言結(jié)構(gòu)間的關(guān)系低千。我們也應(yīng)該感激計(jì)算機(jī)出現(xiàn)之前配阵,在這領(lǐng)域不懈探索的數(shù)學(xué)家們。這些先驅(qū)包括:Alonzo Church、Barkley Rosser棋傍、Stephen Kleenex救拉,以及Haskell Curry。