《計算機程序的構造與解釋》這本書是MIT計算機科學學科的入門課程,
大部分學生在學這門課程前都沒有接觸過程序設計,也就是說這本書是針對編程新手寫的。
雖然是入門課程,但起點比較高,看懂裏面的知識須要比較紮實的數學功底,
最起碼要有高中數學水平,若是高中數學沒學好,看起來會比較吃力。javascript
固然,這本書的目標不是教你去作數學分析,或者讓你學會使用LISP,他的目標我理解以下java
以數學來示範各類編程原理是由於數學問題比較廣泛,好多概念你們都有所接觸,
沒有二義性,不須要把時間花在問題描述和需求分析上。以LISP來進行編程原理解
說是由於LISP語法很是簡單,不須要把時間花在講解語法上。編程
LISP可能很差安裝,咱們就用Javascript來練習第一章的示範吧,打開Chrome瀏覽器,
按F12打開開發人員工具,在Console標籤裏就能夠寫代碼了。瀏覽器
若是你還不知道編程能幹什麼,Javascript是啥東西,不要緊,
咱們能夠先來實現一些簡單的數學計算,在Chrome的Console裏輸入以下代碼編程語言
>128 128 >128 + 12 140 >128 / 16 8 >128 - 28 100 >50 * 2 100 >3 + 2 * 10 23 >2 * 10 * 3.14 62.800000000000004
上面代碼的大於號不用輸,表示輸入提示符,能夠看到輸入一些數學式子後Console會自動打印出
這個式子的求值結果。暫時先不用管背後的原理是什麼,你如今已經開始在編程了。工具
上面你輸入的式子就叫作表達式,裏面的數就是普通的數字,+,-,*,/這些叫操做符,
操做符能夠操做數,他操做的是本身兩邊的數。學習
像上面的例子裏2 * 10 * 3.14
其實就是在計算一個半徑爲10的圓的周長,3.14就是圓周率π,
計算圓的周長的公式不是2πr嗎?設計
若是咱們要計算好多圓的周長,那麼每次都要把3.14打出來嗎?能不能給3.14起個名字呢?
能,確定能。能給某些計算對象命名是全部編程語言裏最重要的一個功能,以下。code
>var pi = 3.14 undefined >2 * pi * 10 62.800000000000004 >2 * pi * 5 31.400000000000002 >2 * pi * 8 50.24
上面的第一句var pi = 3.14
就至關於給3.14起了個名字pi,後面計算周長的表達式均可以用pi來代替3.14。對象
這就是一個最簡單的抽象手段,你不須要記住pi的值具體是多少,只須要記住pi就表示圓周率就好了。
這個思路很關鍵,之後寫代碼寫多了,你會發現你寫的代碼愈來愈複雜,可以給你寫的部分代碼進行命名,
而後使用的時候不用關心複雜的細節,就能夠控制住這種複雜性,寫出複雜的大程序來。
像3 + 2 * 10
這個式子,*會先把2和10進行乘法計算,獲得20,而後+會把3和20進行相加,
獲得23,整個過程和數學裏的加減乘除運算規律是同樣的。若是你想執行(3 + 2) * 10
的結果,
也能夠直接把這個式子在Console裏輸入,也能正確的執行。
你在寫2 * pi * 10
時,pi會自動替換成3.14,這說明Javascript解釋器幫你存儲了pi到3.14
的對應,這種存儲咱們叫環境
,每一個環境裏都存儲了一些名字和計算對象的對應關係。
環境
是個廣泛的概念,它爲求值的過程提供了一種上下文,對於咱們理解程序
的執行起着很重要的做用。
好比你要執行(3 + 2 + 5) * (2 * (1 + 2))
,這個表達式的求值過程就稍微複雜點了。
整體來看呢,這個式子分紅兩個部分,一個是(3 + 2 + 5)
,一個是(2 * (1 + 2)),而後
這兩個部分進行想乘。要想獲得這兩個部分的相乘呢,又要先獲得這兩個部分的結果,怎麼獲得呢?
咱們發現這兩個部分其實也是表達式,好比(2 * (1 + 2))
,其實也有兩部分組成,一個
是2
,一個是(1 + 2)
,這兩個部分相乘。這樣從外到裏分析,確定會分析出最簡單的不
能再分的表達式,能夠直接求出結果。
這個過程就叫作遞歸
,先不用計較複雜的解釋,就先理解複雜表達式的求值須要先對子表
達式進行求值,子表達式的求值須要對子表達式的子表達式求值,這個過程就叫遞歸
。
遞歸是個剛開始不太好理解的概念,但掌握後用它來理解不少問題就很輕鬆了,之後會常常
遇到,加深印象。須要提的就是遞歸要有幾個注意的地方。
好比複雜表達式的求值過程就分紅多個步驟,每一個步驟就是把複雜表達式拆成多個子表達式
,而後每次拆呢,確定是拆的愈來愈小,把整個過程向終點推動一步,而後呢若是拆的不能
再拆了,好比1 + 2
直接就能獲得結果了,這就到最重點了。
以上說的這些規則,就叫作編程的語法,慢慢你會發現有的編程語言的語法特別多,須要記住的東西特別多,好比各類括號,特殊字符,關鍵字。 而有的編程語言的語法特別少,基本上不用記,一大屏代碼看到的都差很少的格式。剛學編程的時候建議選擇後面一種的編程語言,如Javascript, Python,儘可能學習一些編程的本質,而不是各類語法。