讀書筆記(III) 計算機程序的構造與解釋

圖片

 

該書在一定程度上可以理解爲程序設計的方法論,不僅對過程定義和數據的組織進行抽象,而且對軟件設計進行了抽象歸納。首先就讓讀者站在原則和程序設計的制高點上,看的都是本質的東西。
 
附記: 2011-05-18
其實這本書是在講解一門語言,這門語言是最古老的語言之一,但又是功能最強大的一門語言。縱觀軟件業語言發展,結果發現現有語言都或多或少有這門古老語言的影子。我們早說過一門語言核心的東西不是語法,而是其背後的思想。語言的思想在理論計算機科學中稱爲:計算模型,在軟件工程學中稱爲:編程範式,哲學層面上稱爲:方法論。這些編程範式是雋永的,是具有永恆的價值的,這些不能被 各種語法糖、函數庫所代替的。
總結一下,SICP中涉及的編程範式幾乎囊括現有的編程範式:命令式編程泛型式編程函數式編程邏輯式編程面向對象模型事件驅動模型併發模型元語言模型等等,然而SICP的價值還有待於我們的發掘。
編程,我們還有很多~~~~~ :)
 

點擊進入書籍詳情頁

計算機程序的構造和解釋(原書第2版)

作者:Harold Abelson

機械工業出版社

出版年:2004-02-01

綜合評分:9.0

 

天啊! 還有比這更抽象的書嗎?除了近世代數,實變和泛函,原來書可以這麼抽象!

2010-11-12

 

這本書看的好糾結,完全和語法書不是一個級別的,速成簡直不可能,我覺得有以下原因:

1) 書中的概念和方法描述抽象與計算機的具體應用,如果要深刻的理解這些需要非常紮實的實踐和豐富的經驗。

2) 對於在MIT以及Stanford中對入學者開的課程,顯然不是電腦掃盲教育。受衆顯然是對計算機學科一腔熱情的精英,並很可能他們已經在計算機學科上已經是高手級別了。

3) 設計面較廣,包括程序的設計,數據的組織,甚至是編譯以及計算模型等等都涉及。閱讀壓力很大

4) 採用LISP語言,這種前綴式表述語言首先就給讀者造成壓力。儘管習慣之後,表現出這種方式的優越性,但是需要一定的過程。

鑑於以上原因,我覺得對這本書的閱讀體驗必然是一個長久的過程,結合實踐去理解抽象概念和方法背後蘊含的思想。

2010-11-13

 

這本書買來之後,真的是啃不下來。MIT那幫人真是羣瘋子,電腦掃盲教育都搞這麼瘋狂的課本,那幫人簡直是羣瘋子。幾十年的內功傳給入門弟子,功沒傳完,人估計就殘了。爲了對這本書,也對這篇日誌有個交代,把這些年自己的對如何像個計算機專業學生去思考問題進行歸納,將散見於各類書籍中的計算機科學思想記錄在下,也是給這本書一個紀念,因爲想必這本書無非想講明這些道理吧。

貫穿計算機科學的重要思想:

(1) 計算機只能夠解決離散有窮域問題,所以嘗試將連續問題離散化求解

(2) 遞歸與棧是等價的,沒有棧就實現不了遞歸,而遞歸必須利用棧結構存儲信息。只是遞歸隱式的或顯式應用棧。

(3) 循環和遞歸能力是等同的。事實上只要有了遞歸,就可以用線性遞歸代替循環結構。而有了循環,再利用棧結構,就可以模擬遞歸。

(4) 自頂向下思想和自底向上思想貫穿在計算機科學的軟硬件上的方方面面,如算法設計中的遞歸與遞推、硬件設計的分模塊、軟件工程組件技術。

(5) 事件驅動和時間驅動是兩種基本的計算機模擬思想,應用極其廣泛,例如在消息傳遞響應和操作系統設計,如時間分片,中斷機制等。

(6)多數計算機問題都可以通過設計中間層解決。這一觀點體現在軟硬件設計中,如MMU、函數接口、面向對象等

(7)計算機的軟硬件是等同的,軟件能幹的硬件就可以,硬件能做的,軟件就可以模擬。

其他的通用思想:

(1) 複雜的問題可以分而治之,體現在多項算法設計思想中,如動態規劃、分治法等

(2) 以空間換時間,或者以即時演算換空間,體現在預處理、利用重複子問題的動態規劃、遊戲動畫的預渲染以及實時渲染等領域

2011-3-10

 

       基本上,上述思想就是SICP的主旨,不過在一些片段中可以窺見一些作者的深刻見地,這些見地散見於各個細節中,並且需要讀者認真實踐習題和代碼纔可以發現,今天,花了一點時間去實踐,發現scheme語言果然非常的優雅,書寫起來確實有一定的美感,泛遞歸的思想以及把過程和數據統一設計實現的思路都非常超越當時的時代,直至今日也仍然讓人耳目一新。

2011-3-15

      

         最近的閱讀,使我對SICP有了嶄新的認識,才方知以前所謂的感想是膚淺。首先從SICP的結構上來說,《structure and interpretation of computer programs》,故名思義,這本書主要講一個結構 和 解釋 兩個要義,其中一二三章主要講解結構,即過程的組織,數據的結構,如何組織兩者構建一個模擬系統。其中講述了計算模式,計算模型以及模塊化,幾個程序設計的重要概念,例如線性遞歸與迭代,樹遞歸;代換模型與環境模型,對象的封裝問題。其中代換模型是第一章節就提出的問題,這也是函數式程序設計的主要思想,通過一種模式的匹配完成程序的設計,其可以理解成一種代數(用符號與值產生一種對應關係)的思想,他更抽象,但是設計優雅。另外,在第三章,當我們的程序引入了時間這個概念了,我們的程序似乎沒有了以往的那種純粹感,代之的是不斷變化的環境(context),我們的符號和值不再是一成不變的對應關係。本質上來說,我們的程序不再是context-free的了,我們稱這種計算模型爲 環境模型,程序的運行結果依賴於上下文環境。如何展現這種環境和其所帶有的約束呢?直接的辦法就是引入局部變量,引入變量使程序擁有了模擬變化的能力(其實時間就是變化的一種方式),但是也帶來了繁瑣的設計細節,例如衝突和操作先後序以及模塊化的困難;

         於是,爲了維持函數式設計的純粹和優雅,我們引入了 流 的概念。流其實是一種與將對象分離研究的不同的方法論。書中舉了幾個很經典的例子,如任意精度的pi值。本質上,流技術是基於 延遲求值 技術完成的,通俗來說,我們並不需要算出pi的很精確地值放在數據庫中供檢索(這樣顯然不夠靈活),而是我們讓 用戶給一個精度,我們根據這個精度即可算出滿足這個精度的數字給用戶。事實上也是一種需求驅動(事件驅動)方案。

         流技術給了我們一種嶄新的世界觀。就我個人來說,環境模型 與 流技術 是兩種世界觀,這種對立與 數學中的黎曼積分與勒貝格積分,算法分析中的傳統方法和平攤分析,物理學中的粒子學說和波動學說(事實上,SICP的作者也點到了,但是這顯然不是SICP的主題,就沒有細說)是有異曲同工之妙的。在SICP中,舉了一個形象的例子說明,相同的過程產生不同結果:隨機數的產生。因爲事實上,儘管計算機產生了統計上很合理的隨機數,但是事實上,每一步仍然是確定的,只不過作爲輸入(隨機種子)作爲局部變量作爲對象的一部分因封裝而隱藏起來了。在SICP看來,儘管一個函數產生的結果依賴於時間(環境),但是從全局上看,這個函數根本沒有發生變化,所謂變化中不變就是這個道理。在隨機數角度來看,儘管我們的隨機數不斷的隨環境變化,但是本源:統計屬性,概率密度函數等等沒變。這也就是爲什麼勒貝格積分在概率論研究中這麼重要的原因了。也許,我們可以說勒貝格積分更加的雅緻,黎曼積分總是要很多的繁瑣處理,但是就像 代換模型 和 環境模型 一樣,我們都不可單一的使用它們。勒貝格積分適合理論的研究,黎曼積分則適合工程應用。反觀函數式程序設計(lisp,haskell等)和命令式程序設計(C,C++等大多數商業語言)也是相似的境遇吧。

       現在,我們反觀以前對 計算機世界的重要思想(七個廣泛思想)的總結。儘管有點形而上,但是我們會發現:類似的,在SICP中處處滲透着作者對學科的洞察力和遠見卓識,並期望一個入門者應當深刻體會這些觀點,方可以在不僅理論研究以及工程項目開發上遊刃有餘。

       

         另則,繼續上面關於書結構的話題。SICP的後兩章:4.元語言 5.寄存器模型,主要講述 語言的解釋 和 執行的。這兩章節還正在閱讀中,還需要一定實踐支持。暫且不討論。

                 2011-3-20

剛剛粗略看完第三章,第四章簡單的翻了一番,簡單的說,第四章作者要叫我們去編一個解釋器,用LISP編一個解釋自己(自己的語言子集)的解釋器,看上去似乎很瘋狂,但是確實在很多的平臺上應用很多,比如腳本語言中神奇的eval函數,可以在運行的過程中對程序進行動態的定製和更改,另外matlab就是用自己的語言解釋自己,其中做了一些處理和優化,在進行解釋的(典型的元語言模型)。看着一部分,需要一些功夫,因爲後兩章講述的東西顯然和前三章不同。

2011-3-20: 21:25

程序去生成程序是一個奇妙的想法,然而卻在我們的實踐中十分的常見,例如編譯器的預處理器(其在編譯期對程序進行改動)、編譯器的編譯器Lex和Yacc、宏(可以在編譯期,也可以在運行期實現。)等等。最神奇的就是腳本語言提供的eval() 函數了。我第一次見到eval這種神奇的用法,是在閱讀mathboy(蔡同學)的matlab源碼時看到的。簡單的說,他將要執行的程序做成一個文本,然後再執行這個文本中的命令。通過這種處理我們可以做出一些匪夷所思的功能出來,例如動態的命名變量名等,但最重要的是可以動態的創建想要的程序和函數。當然C和C++這種靜態命令式語言也可以通過函數指針表實現,但是由於C和C++語言給我的固有隱性,我總是以爲一旦程序寫就,則不可以進行變動。可想而知,eval函數給我的震撼,也讓我一直不思其解,爲什麼要用這樣的技巧呢?其實腳本語言的一大功能就是對程序進行定製,如此處理則更方便了。與預處理器、模板不同的是其可以在程序的運行期對程序進行定製。

2011-5-27

       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章