為何計(jì)算機(jī)界最高榮譽(yù)圖靈獎(jiǎng)獲得者痛恨BASIC
戴克斯特拉先生是一位經(jīng)常會(huì)被人們拿來(lái)引述的著名計(jì)算機(jī)科學(xué)家,人們談?wù)撟疃嗟氖悄切┍凰羝频淖屓穗y以接受的事實(shí)真相。經(jīng)常被人反復(fù)提到的一個(gè)就是他對(duì)BASIC語(yǔ)言的痛斥,但往往人們談?wù)撨@件事情時(shí)都忘了提到當(dāng)時(shí)的背景——
對(duì)于一個(gè)之前接觸過(guò)BASIC語(yǔ)言的學(xué)生,你基本上不可能教會(huì)他如何正確的編程:因?yàn)樽鳛橐粋€(gè)程序員苗子,他們已經(jīng)腦殘,無(wú)可救藥。 |
戴克斯特拉先生的這番言論是來(lái)告訴大家“如何看出事實(shí)背后可能是對(duì)你有害的真相”——對(duì)有些事實(shí)人們廣為接受,所有沒(méi)有人思考它們,或不屑一顧,或避而不談。戴克斯特拉先生對(duì)于這個(gè)問(wèn)題給出的答案被證明極具轟動(dòng)性。他用這種方式非常有效的挑起了爭(zhēng)論,時(shí)至今日我們?nèi)栽谟懻摗?/p>
人們經(jīng)常會(huì)忘記,在1975年,那時(shí)的編程跟我們?nèi)缃裼泻艽蟮牟煌?。戴克斯特拉先生斥?zé)的Dartmouth Basic——這是一種享有榮耀的匯編語(yǔ)言,它不是我們?nèi)缃袷褂玫腂ASIC語(yǔ)言——
- 變量名稱(chēng)只有一個(gè)字符,或外加一個(gè)數(shù)字
- 盡管有For語(yǔ)法可用,但循環(huán),break,以及其它邏輯都用無(wú)約束的goto語(yǔ)句實(shí)現(xiàn)。
- 空格在表達(dá)式間可有可無(wú)。
- 有子程序。子程序通過(guò)行號(hào)調(diào)用或通過(guò)return轉(zhuǎn)向。
- 所有的參數(shù)都通過(guò)全局變量來(lái)傳遞。
- 26個(gè)用戶(hù)自定義函數(shù)可以排列成FNA—FNZ,里面可以有一行代碼。
- if語(yǔ)句被限制在一行上。
這樣的限制我可以繼續(xù)列下去,但事實(shí)非常明顯:你很難用它寫(xiě)出可讀性好,易于理解的程序。我們?nèi)缃裣氘?dāng)然應(yīng)該有的一些語(yǔ)言特征它都沒(méi)有。這種狀況一直等到BASIC之后的語(yǔ)言發(fā)展起來(lái)才結(jié)束,成為我們?nèi)缃袷熘木幊陶Z(yǔ)言。
當(dāng)我們?cè)趯W(xué)習(xí)第一種編程語(yǔ)言時(shí),你可能會(huì)一直在用其它語(yǔ)言風(fēng)格進(jìn)行編程(“你可以用任何語(yǔ)言寫(xiě)出FORTRAN風(fēng)格代碼”)。程序員的成長(zhǎng)過(guò)程中最難的不是如何獲取新知識(shí),而是如何拋棄陳腐的舊習(xí)慣。
學(xué)會(huì)如何小心的堆起一灘爛泥,這對(duì)你寫(xiě)出結(jié)構(gòu)化的程序不會(huì)帶來(lái)任何幫助。即使今日,你也能很容易的發(fā)現(xiàn)有些人被教育了basic的現(xiàn)代變體——盡管他們對(duì)這種basic老祖先知之甚少。后繼者對(duì)此有很大責(zé)任。
編程很難。荒誕的語(yǔ)言特征讓它變得更難,這無(wú)助于初學(xué)者,同樣也無(wú)助于專(zhuān)家。戴克斯特拉痛恨basic,其實(shí)你也應(yīng)該痛恨它。殘酷的是我們只記住了戴克斯特拉先生尖銳的批評(píng),但卻忘了他對(duì)計(jì)算機(jī)編程卓著的貢獻(xiàn)——這完全是另外一個(gè)話題了。