久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

王垠:如何掌握程序語言

 看見就非常 2012-08-14

學(xué)習(xí)程序語言是每個(gè)程序員的必經(jīng)之路,。可是這個(gè)世界上有太多的程序語言,,每一種都號(hào)稱具有最新的“特性”,。所以程序員的苦惱就在于總是需要學(xué)習(xí)各種稀奇古怪的語言,而且必須緊跟“潮流”,,否則就怕被時(shí)代所淘汰。

  作為一個(gè)程序語言的研究者,,我深深的知道這種心理產(chǎn)生的根源,。程序語言里面其實(shí)有著非常簡(jiǎn)單,永恒不變的原理,??吹搅怂鼈儯涂梢栽诤芏痰臅r(shí)間之內(nèi)就能學(xué)會(huì)并且開始使用任何新的語言,,而不是花費(fèi)很多功夫去學(xué)習(xí)一個(gè)又一個(gè)的語言,。

  對(duì)程序語言的各種誤解

  學(xué)習(xí)程序語言的人,經(jīng)常會(huì)出現(xiàn)以下幾種心理,,以至于他們會(huì)覺得有學(xué)不完的東西,,或者走上錯(cuò)誤的道路。以下我把這些心理簡(jiǎn)要分析一下,。

  1. 程序語言無用論,。這是國(guó)內(nèi)大學(xué)計(jì)算機(jī)系的教育常見的錯(cuò)誤。教授們常常對(duì)學(xué)生灌輸:“用什么程序語言不重要,,重要的是算法,。”而其實(shí),,程序語言卻是比算法更加精髓的東西,。任何算法以及它的復(fù)雜度分析,都是相對(duì)于某種計(jì)算模型,,而程序語言就是描述這種計(jì)算模型的符號(hào)系統(tǒng),。算法必須用某種語言表述出來,通常算法設(shè)計(jì)者使用偽碼,,這其實(shí)是不嚴(yán)謹(jǐn)?shù)?,容易出現(xiàn)推理漏洞。算法設(shè)計(jì)再好,,如果不懂得程序語言的原理,,也不可能高效的實(shí)現(xiàn)。即使實(shí)現(xiàn)了,也可能會(huì)在模塊化和可擴(kuò)展性上面有很大問題,。某些算法專家或者數(shù)學(xué)家寫出來的程序極其幼稚,,就是因?yàn)樗麄兒鲆暳顺绦蛘Z言的重要性。

  2. 追求“新語言”,?;镜恼軐W(xué)告訴我們,新出現(xiàn)的事物并不一定是“新事物”,,它們有可能是歷史的倒退,。事實(shí)證明,新出現(xiàn)的語言,,可能還不如早就存在的,。其實(shí),現(xiàn)代語言的多少“新概念”不存在于最老的一些語言里呢,?程序語言就像商品,,每一家都為了拉攏程序員作廣告,而它們絕大多數(shù)的設(shè)計(jì)都可能是膚淺而短命的,。如果你看不透這些東西的設(shè)計(jì),,就會(huì)被它們蒙蔽住。很多語言設(shè)計(jì)者其實(shí)并不真的懂得程序語言設(shè)計(jì)的原理,,所以常常在設(shè)計(jì)中重復(fù)前人的錯(cuò)誤,。但是為了推銷自己的語言和系統(tǒng),他們必須夸夸其談,,進(jìn)行宗教式的宣傳,。

  3. “存在即是合理”。記得某人說過:“不能帶來新的思維方式的語言,,是沒有必要存在的,。”他說的是相當(dāng)正確的,。世界上有這么多的語言,,有哪些帶來了新的思維方式呢?其實(shí)非常少,。絕大部分的語言給世界帶來的其實(shí)是混亂,。有人可能反駁說:“你怎么能說 A 語言沒必要存在?我要用的那個(gè)庫L,,別的語言不支持,,只能用A?!钡亲⒁?,他說的是存在的“必要性”,。如果你把存在的“事實(shí)”作為存在的“必要性”,那就邏輯錯(cuò)亂了,。就像如果二戰(zhàn)時(shí)我們沒能打敗希特勒,,現(xiàn)在都做了他的奴隸,然后你就說:“希特勒應(yīng)該存在,,因?yàn)樗B(yǎng)活了我們,。”你的邏輯顯然有問題,,因?yàn)槿绻麣v史走了另外一條路(即希特勒不存在),,我們會(huì)過上自由幸福的生活,所以希特勒不應(yīng)該存在,。對(duì)比一個(gè)東西存在與不存在的兩種可能的后果,,然后做出判斷,這才是正確的邏輯,。按照這樣的推理,,如果設(shè)計(jì)糟糕的A 語言不存在,,那么設(shè)計(jì)更好的 B 語言很有可能就會(huì)得到更多的支持,,從而實(shí)現(xiàn)甚至超越 L 庫的功能。

  4. 追求“新特性”,。程序語言的設(shè)計(jì)者總是喜歡“發(fā)明”新的名詞,,喜歡炒作。普通程序員往往看不到,,大部分這些“新概念”其實(shí)徒有高深而時(shí)髦的外表,,卻沒有實(shí)質(zhì)的內(nèi)涵。常常是剛學(xué)會(huì)一個(gè)語言 A,,又來了另一個(gè)語言 B,,說它有一個(gè)叫 XYZ 的新特性。于是你又開始學(xué)習(xí)B,,如此繼續(xù),。在內(nèi)行人看來,這些所謂的“新特性”絕大部分都是新瓶裝老酒,。很多人寫論文喜歡起這樣的標(biāo)題:《XYZ:A Novel Method for ...》,。這造成了概念的爆炸,卻沒有實(shí)質(zhì)的進(jìn)步,。

  5. 追求“小竅門”,。很多編程書喜歡賣弄一些小竅門,教你如何讓程序顯得“短小”,。比如它們會(huì)跟你講 "(i++) - (++i)"應(yīng)該得到什么結(jié)果,;或者追究運(yùn)算符的優(yōu)先級(jí),,說這樣可以少打括號(hào);要不就是告訴你“if 后面如果只有一行代碼就可以不加花括號(hào)”,,等等,。殊不知這些小竅門,其實(shí)大部分都是程序語言設(shè)計(jì)的敗筆,。它們帶來的不是清晰的思路,,而是是邏輯的混亂和認(rèn)知的負(fù)擔(dān)。比如 C 語言的 ++ 運(yùn)算符,,它的出現(xiàn)是因?yàn)?C 語言設(shè)計(jì)者們當(dāng)初用的計(jì)算機(jī)內(nèi)存小的可憐,,而 "i++" 顯然比"i=i+1" 少 2 個(gè)字符,所以他們覺得可以節(jié)省一些空間?,F(xiàn)在我們?cè)僖膊蝗蹦屈c(diǎn)內(nèi)存,,可是 ++ 運(yùn)算符帶來的混亂和迷惑,卻流傳了下來?,F(xiàn)在最新的一些語言,,也喜歡耍這種語法上的小把戲。如果你追求這些小竅門,,往往就抓不住精髓,。

  6. 針對(duì)“專門領(lǐng)域”。很多語言沒有新的東西,,為了占據(jù)一方土地,,就號(hào)稱自己適合某種特定的任務(wù),比如文本處理,,數(shù)據(jù)庫查詢,,WEB 編程,游戲設(shè)計(jì),,并行計(jì)算,。但是我們真的需要不同的語言來干這些事情嗎?其實(shí)絕大部分這些事情都能用同一種通用語言來解決,,或者在已有語言的基礎(chǔ)上做很小的改動(dòng),。只不過由于各種政治和商業(yè)原因,不同的語言被設(shè)計(jì)用來占領(lǐng)市場(chǎng),。就學(xué)習(xí)而言,,它們其實(shí)是無關(guān)緊要的,而它們帶來的“學(xué)習(xí)負(fù)擔(dān)”,,其實(shí)差不多掩蓋了它們帶來的好處,。其實(shí)從一些設(shè)計(jì)良好的通用語言,你可以學(xué)會(huì)所有這些“專用語言”的精髓,,而不用專門去學(xué)它們,。

  7. 宗教信仰,。很多人對(duì)程序語言有宗教信仰。這跟人們對(duì)操作系統(tǒng)有宗教信仰很類似,。其實(shí)如果你了解程序語言的本質(zhì),,就會(huì)發(fā)現(xiàn)其實(shí)完全沒必要跟人爭(zhēng)論一些事情。某個(gè)語言有缺點(diǎn),,應(yīng)該可以直接說出來,,卻被很多人忌諱,因?yàn)橹赋鋈秉c(diǎn)總是招來爭(zhēng)論和憎恨,。這原因也許在于程序語言的設(shè)計(jì)不是科學(xué),,它類似于圣經(jīng),它沒法被“證偽”,。沒有任何實(shí)驗(yàn)可以一下子斷定那種語言是對(duì)的,,那種是錯(cuò)的。所以雖然你覺得自己有理,,卻很難讓人信服,。沒有人會(huì)去爭(zhēng)論哪家的漢堡更好,卻有很多人爭(zhēng)論那種語言更好,。因?yàn)楹芏嗳税殉绦蛘Z言當(dāng)成自己的神,,如果你批評(píng)我的語言,你就是褻瀆我的神,。解決的辦法也許是,,不要把自己正在用的語言看得太重要,。你現(xiàn)在認(rèn)為是對(duì)的東西,,也許不久就會(huì)被你認(rèn)為是錯(cuò)的,反之亦然,。

  如何掌握程序語言

  看到了一些常見的錯(cuò)誤心理,,那么我們來談一下什么樣的思維方式會(huì)更加容易的掌握程序語言。

  1. 專注于“精華”和“原理”,。就像所有的科學(xué)一樣,,程序語言最精華的原理其實(shí)只有很少數(shù)幾個(gè),它們卻可以被用來構(gòu)造出許許多多紛繁復(fù)雜的概念,。但是人們往往忽視了簡(jiǎn)單原理的重要性,,匆匆看過之后就去追求最新的,復(fù)雜的概念,。他們卻沒有注意到,,絕大部分最新的概念其實(shí)都可以用最簡(jiǎn)單的那些概念組合而成。而對(duì)基本概念的一知半解,,導(dǎo)致了他們看不清那些復(fù)雜概念的實(shí)質(zhì),。比如這些概念里面很重要的一個(gè)就是遞歸,。國(guó)內(nèi)很多學(xué)生對(duì)遞歸的理解只停留于漢諾塔這樣的程序,而對(duì)遞歸的效率也有很大的誤解,,認(rèn)為遞歸沒有循環(huán)來得高效,。而其實(shí)遞歸比循環(huán)表達(dá)能力強(qiáng)很多,而且效率幾乎一樣,。有些程序比如解釋器,,不用遞歸的話基本沒法完成。

  2. 實(shí)現(xiàn)一個(gè)程序語言,。學(xué)習(xí)使用一個(gè)工具的最好的方式就是制造它,,所以學(xué)習(xí)程序語言的最好方式就是實(shí)現(xiàn)一個(gè)程序語言。這并不需要一個(gè)完整的編譯器,,而只需要寫一些簡(jiǎn)單的解釋器,,實(shí)現(xiàn)最基本的功能。之后你就會(huì)發(fā)現(xiàn),,所有語言的新特性你都大概知道可以如何實(shí)現(xiàn),,而不只停留在使用者的水平。實(shí)現(xiàn)程序語言最迅速的方式就是使用一種像 Scheme 這樣代碼可以被作為數(shù)據(jù)的語言,。它能讓你很快的寫出新的語言的解釋器,。我的 GitHub 里面有一些我寫的解釋器的例子(比如這個(gè)短小的代碼實(shí)現(xiàn)了 Haskell 的 lazy 語義)。

  幾種常見風(fēng)格的語言

  下面我簡(jiǎn)要的說一下幾種常見風(fēng)格的語言以及它們的問題,。

  1. 面向?qū)ο笳Z言

  事實(shí)說明,,“面向?qū)ο蟆边@整個(gè)概念基本是錯(cuò)誤的。它的風(fēng)靡是因?yàn)楫?dāng)初的“軟件危機(jī)”(天知道是不是真的存在這危機(jī)),。設(shè)計(jì)的初衷是讓“界面”和“實(shí)現(xiàn)”分離,,從而使得下層實(shí)現(xiàn)的改動(dòng)不影響上層的功能??墒谴蟛糠置嫦?qū)ο笳Z言的設(shè)計(jì)都遵循一個(gè)根本錯(cuò)誤的原則:“所有的東西都是對(duì)象(Everything is anobject),。”以至于所有的函數(shù)都必須放在所謂的“對(duì)象”里面,,而不能直接被作為參數(shù)或者變量傳遞,。這導(dǎo)致很多時(shí)候需要使用繁瑣的設(shè)計(jì)模式(design patterns) 來達(dá)到甚至對(duì)于 C 語言都直接了當(dāng)?shù)氖虑椤6鋵?shí)“界面”和“實(shí)現(xiàn)”的分離,,并不需要把所有函數(shù)都放進(jìn)對(duì)象里,。另外的一些概念,比如繼承,,重載,,其實(shí)帶來的問題比它們解決的還要多。

  “面向?qū)ο蠓椒ā钡倪^度使用,,已經(jīng)開始引起對(duì)整個(gè)業(yè)界的負(fù)面作用,。很多公司里的程序員喜歡生搬硬套一些不必要的設(shè)計(jì)模式,,其實(shí)什么好事情也沒干,只是使得程序冗長(zhǎng)難懂,。

  那么如何看待具備高階函數(shù)的面向?qū)ο笳Z言,,比如 Python, JavaScript, Ruby, Scala?當(dāng)然有了高階函數(shù),,你可以直截了當(dāng)?shù)谋硎竞芏鄸|西,,而不需要使用設(shè)計(jì)模式。但是由于設(shè)計(jì)模式思想的流毒,,一些程序員居然在這些不需要設(shè)計(jì)模式的語言里也采用繁瑣的設(shè)計(jì)模式,,讓人哭笑不得。所以在學(xué)習(xí)的時(shí)候,,最好不要用這些語言,,以免受到不必要的干擾。到時(shí)候必要的時(shí)候再回來使用它們,,就可以取其精華,,去其糟粕。

  2. 低級(jí)過程式語言

  那么是否 C 這樣的“低級(jí)語言”就會(huì)好一些呢,?其實(shí)也不是,。很多人推崇C,因?yàn)樗梢宰屓私咏暗讓印?,也就是接近機(jī)器的表示,,這樣就意味著它速度快。這里其實(shí)有三個(gè)問題:

   1) 接近“底層”是否是好事,?

   2)“速度快的語言”是什么意思,?

   3) 接近底層的語言是否一定速度快?

  對(duì)于第一個(gè)問題,,答案是否定的,。其實(shí)編程最重要的思想是高層的語義(semantics),。語義構(gòu)成了人關(guān)心的問題以及解決它們的算法,。而具體的實(shí)現(xiàn)(implementation),比如一個(gè)整數(shù)用幾個(gè)字節(jié)表示,,雖然還是重要,,但卻不是至關(guān)重要的。如果把實(shí)現(xiàn)作為學(xué)習(xí)的主要目標(biāo),,就本末倒置了,。因?yàn)閷?shí)現(xiàn)是可以改變的,而它們所表達(dá)的本質(zhì)卻不會(huì)變,。所以很多人發(fā)現(xiàn)自己學(xué)會(huì)的東西,,過不了多久就“過時(shí)”了,。那就是因?yàn)樗麄儗W(xué)習(xí)的不是本質(zhì),而只是具體的實(shí)現(xiàn),。

  其次,,談?wù)Z言的“速度”,其實(shí)是一句空話,。語言只負(fù)責(zé)描述一個(gè)程序,,而程序運(yùn)行的速度,其實(shí)絕大部分不取決于語言,。它主要取決于 1)算法和2)編譯器的質(zhì)量,。編譯器和語言基本是兩碼事。同一個(gè)語言可以有很多不同的編譯器實(shí)現(xiàn),,每個(gè)編譯器生成的代碼質(zhì)量都可能不同,,所以你沒法說“A語言比 B 語言快”。你只能說“A 語言的 X 編譯器生成的代碼,,比 B 語言的 Y 編譯器生成的代碼高效”,。這幾乎等于什么也沒說,因?yàn)?B 語言可能會(huì)有別的編譯器,,使得它生成更快的代碼,。

  我舉個(gè)例子吧。在歷史上,,Lisp 語言享有“龜速”的美名,。有人說“Lisp 程序員知道每個(gè)東西的值,卻不知道任何事情的代價(jià)”,,講的就是這個(gè)事情,。但這已經(jīng)是很久遠(yuǎn)的事情了,現(xiàn)代的 Lisp 系統(tǒng)能編譯出非常高效的代碼,。比如商業(yè)的 Chez Scheme 編譯器,,能在 5 秒鐘之內(nèi)編譯它自己,編譯生成的目標(biāo)代碼非常高效,。它可以直接把 Scheme 程序編譯到多種處理器的機(jī)器指令,,而不通過任何第三方軟件。它內(nèi)部的一些算法,,其實(shí)比開源的 LLVM 之類的先進(jìn)很多,。

  另外一些函數(shù)式語言也能生成高效的代碼,比如 OCaml,。在一次程序語言暑期班上,,Cornell 的 Robert Constable 教授講了一個(gè)故事,說是他們用 OCaml 重新實(shí)現(xiàn)了一個(gè)系統(tǒng),結(jié)果發(fā)現(xiàn) OCaml 的實(shí)現(xiàn)比原來的 C 語言實(shí)現(xiàn)快了 50 倍,。經(jīng)過C 語言的那個(gè)小組對(duì)算法多次的優(yōu)化,,OCaml 的版本還是快好幾倍。這里的原因其實(shí)在于兩方面,。第一是因?yàn)楹瘮?shù)式語言把程序員從底層細(xì)節(jié)中解脫出來,,讓他們能夠迅速的實(shí)現(xiàn)和修改自己的想法,所以他們能夠迅速的找到更好的算法,。第二是因?yàn)?OCaml 有高效的編譯器實(shí)現(xiàn),,使得它能生成很好的代碼。

  從上面的例子,,你也許已經(jīng)可以看出,,其實(shí)接近底層的語言不一定速度就快。因?yàn)榫幾g器這種東西其實(shí)可以有很高級(jí)的“智能”,,甚至可以超越任何人能做到的底層優(yōu)化,。但是編譯器還沒有發(fā)展到可以代替人來制造算法的地步。所以現(xiàn)在人需要做的,,其實(shí)只是設(shè)計(jì)和優(yōu)化自己的高層算法,。

  3. 高級(jí)過程式語言

  很早的時(shí)候,國(guó)內(nèi)計(jì)算機(jī)系學(xué)生的第一門編程課都是 Pascal,。Pascal 是很不錯(cuò)的語言,,可是很多人當(dāng)時(shí)都沒有意識(shí)到。上大學(xué)的時(shí)候,,我的 Pascal 老師對(duì)我們說:“我們學(xué)校的教學(xué)太落后了,。別的學(xué)校都開始教C 或者 C++ 了,我們還在教 Pascal,?!爆F(xiàn)在真正理解了程序語言的設(shè)計(jì)原理以后我才真正的感覺到,原來 Pascal 是比 C 和 C++ 設(shè)計(jì)更好的語言,。它不但把人從底層細(xì)節(jié)里解脫出來,,沒有面向?qū)ο蟮乃季S枷鎖,而且有一些很好的設(shè)計(jì),,比如強(qiáng)類型檢查,,嵌套函數(shù)定義等等??墒怯?jì)算機(jī)的世界真是謬論橫行,,有些人批評(píng) Pascal,把優(yōu)點(diǎn)都說成是缺點(diǎn),。比如 Brain Kernighan 的這篇《Why Pascal is Not My Favorite Programming Language》,現(xiàn)在看來真是謬誤百出。Pascal 現(xiàn)在已經(jīng)幾乎沒有人用了,。這并不很可惜,,因?yàn)樗诲e(cuò)怪的“缺點(diǎn)”其實(shí)已經(jīng)被正名,并且出現(xiàn)在當(dāng)今最流行的一些語言里:Java,Python, C#,, ……

  4. 函數(shù)式語言

  函數(shù)式語言相對(duì)來說是當(dāng)今最好的設(shè)計(jì),,因?yàn)樗鼈儾坏屓藢W⒂谒惴ê蛯?duì)問題的解決,而且沒有面向?qū)ο笳Z言那些思維的限制,。但是需要注意的是并不是每個(gè)函數(shù)式語言的特性都是好東西,。它們的支持者們經(jīng)常把缺點(diǎn)也說成是優(yōu)點(diǎn),結(jié)果你其實(shí)還是被掛上一些不必要的枷鎖,。比如 OCaml 和 SML,,因?yàn)樗鼈兊念愋拖到y(tǒng)里面有很多不成熟的設(shè)計(jì),導(dǎo)致你需要記住太多不必要的規(guī)則,。

  5. 邏輯式語言

  邏輯式語言(比如 Prolog)是一種超越函數(shù)式語言的新的思想,,所以需要一些特殊的訓(xùn)練。邏輯式語言寫的程序,,是能“反向運(yùn)行”的,。普通程序語言寫的程序,如果你給它一個(gè)輸入,,它會(huì)給你一個(gè)輸出,。但是邏輯式語言很特別,如果你給它一個(gè)輸出,,它可以反過來給你所有可能的輸入,。其實(shí)通過很簡(jiǎn)單的方法,可以不費(fèi)力氣的把程序從函數(shù)式轉(zhuǎn)換成邏輯式的,。但是邏輯式語言一般要在“pure”的情況下(也就是沒有復(fù)雜的賦值操作)才能反向運(yùn)行,。所以學(xué)習(xí)邏輯式語言最好是從函數(shù)式語言開始,在理解了遞歸,,模式匹配等基本的函數(shù)式編程技巧之后再來看 Prolog,,就會(huì)發(fā)現(xiàn)邏輯式編程簡(jiǎn)單了很多。

  從何開始

  可是學(xué)習(xí)編程總要從某種語言開始,。那么哪種語言呢,?就我的觀點(diǎn),首先可以從 Scheme 入門,,然后學(xué)習(xí)一些 Haskell (但不是全部),,之后其它的也就觸類旁通了。你并不需要學(xué)習(xí)它們的所有細(xì)枝末節(jié),,而只需要學(xué)習(xí)最精華的部分,。所有剩余的細(xì)節(jié),會(huì)在實(shí)際使用中很容易的被填補(bǔ)上。現(xiàn)在我推薦幾本比較好的書,。

  《The Little Schemer》(TLS):我覺得 Dan Friedman 的 The Little Schemer 是目前最好,,最精華的編程入門教材。這本書很薄,,很精辟,。它的前身叫《The Little Lisper》。很多資深的程序語言專家都是從這本書學(xué)會(huì)了 Lisp,。雖然它叫“The Little Schemer”,,但它并不使用 Scheme 所有的功能,而是忽略了 Scheme 的一些毛病,,直接進(jìn)入最關(guān)鍵的主題:遞歸和它的基本原則,。

  《Structure and Interpretationof Computer Programs》(SICP):TheLittle Schemer 其實(shí)是比較難的讀物,所以我建議把它作為下一步精通的讀物,。SICP 比較適合作為第一本教材,。但是我需要提醒的是,你最多只需要看完前三章,。因?yàn)閺牡谒恼麻_始,,作者開始實(shí)現(xiàn)一個(gè) Scheme 解釋器,但是作者的實(shí)現(xiàn)并不是最好的方式,。你可以從別的地方更好的學(xué)到這些東西,。不過也許你可以看完 SICP 第一章之后就可以開始看 TLS。

  《A Gentle Introduction to Haskell》:對(duì)于 Haskell,,我最開頭看的是 A GentleIntroduction to Haskell,,因?yàn)樗貏e短小。當(dāng)時(shí)我已經(jīng)會(huì)了 Scheme,,所以不需要再學(xué)習(xí)基本的函數(shù)式語言的東西,。我從這個(gè)文檔學(xué)到的只不過是 Haskell 對(duì)于類型和模式匹配的概念。

  過度到面向?qū)ο笳Z言

  那么如果從函數(shù)式語言入門,,如何過渡到面向?qū)ο笳Z言呢,?畢竟大部分的公司用的是面向?qū)ο笳Z言。如果你真的學(xué)會(huì)了函數(shù)式語言,,就會(huì)發(fā)現(xiàn)面向?qū)ο笳Z言已經(jīng)易如反掌,。函數(shù)式語言的設(shè)計(jì)比面向?qū)ο笳Z言簡(jiǎn)單和強(qiáng)大很多,而且?guī)缀跛械暮瘮?shù)式語言教材(比如 SICP)都會(huì)教你如何實(shí)現(xiàn)一個(gè)面向?qū)ο笙到y(tǒng),。你會(huì)深刻的看到面向?qū)ο蟮谋举|(zhì)以及它存在的問題,,所以你會(huì)很容易的搞清楚怎么寫面向?qū)ο蟮某绦颍⑶視?huì)發(fā)現(xiàn)一些竅門來避開它們的局限,。你會(huì)發(fā)現(xiàn),,即使在實(shí)際的工作中必須使用面向?qū)ο笳Z言,,也可以避免面向?qū)ο蟮乃季S方式,因?yàn)槊嫦驅(qū)ο蟮乃枷霂淼拇蟛糠质腔靵y和冗余,。

  深入本質(zhì)和底層

  那么是不是完全不需要學(xué)習(xí)底層呢,?當(dāng)然不是,。但是一開頭就學(xué)習(xí)底層硬件,,就會(huì)被紛繁復(fù)雜的硬件設(shè)計(jì)蒙蔽頭腦,看不清楚本質(zhì)上簡(jiǎn)單的原理,。在學(xué)會(huì)高層的語言之后,,可以進(jìn)行“語義學(xué)”和“編譯原理”的學(xué)習(xí)。

  簡(jiǎn)言之,,語義學(xué)(semantics)就是研究程序的符號(hào)表示如何對(duì)機(jī)器產(chǎn)生“意義”,,通常語義學(xué)的學(xué)習(xí)包含 lambda calculus 和各種解釋器的實(shí)現(xiàn)。編譯原理(compilation)就是研究如何把高級(jí)語言翻譯成低級(jí)的機(jī)器指令,。編譯原理其實(shí)包含了計(jì)算機(jī)的組成原理,,比如二進(jìn)制的構(gòu)造和算術(shù),處理器的結(jié)構(gòu),,內(nèi)存尋址等等,。但是結(jié)合了語義學(xué)和編譯原理來學(xué)習(xí)這些東西,會(huì)事半功倍,。因?yàn)槟銜?huì)直觀的看到為什么現(xiàn)在的計(jì)算機(jī)系統(tǒng)會(huì)設(shè)計(jì)成這個(gè)樣子:為什么處理器里面有寄存器(register),,為什么需要堆棧(stack),為什么需要堆(heap),,它們的本質(zhì)是什么,。這些甚至是很多硬件設(shè)計(jì)者都不明白的問題,所以它們的硬件里經(jīng)常含有一些沒必要的東西,。因?yàn)樗麄儾焕斫庹Z義,,所以經(jīng)常不明白他們的硬件到底需要哪些部件和指令。但是從高層語義來解釋它們,,就會(huì)揭示出它們的本質(zhì),,從而可以讓你明白如何設(shè)計(jì)出更加優(yōu)雅和高效的硬件。

  這就是為什么一些程序語言專家后來也開始設(shè)計(jì)硬件,。比如 Haskell 的創(chuàng)始人之一 Lennart Augustsson 后來設(shè)計(jì)了 BlueSpec,,一種高級(jí)的硬件描述語言,可以 100% 的合成 (synthesis) 為硬件電路,。Scheme 也被廣泛的使用在硬件設(shè)計(jì)中,,比如 Motorola, Cisco 和曾經(jīng)的 Transmeta,它們的芯片設(shè)計(jì)里面含有很多 Scheme 程序,。

  這基本上就是我對(duì)學(xué)習(xí)程序語言的初步建議,。以后可能會(huì)就其中一些內(nèi)容進(jìn)行更加詳細(xì)的闡述,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多