- 計算機程序的構造和解釋(JavaScript版)
- (美)哈羅德·阿貝爾森等
- 1932字
- 2024-06-06 19:10:10
1984年SICP第1版的前言
一臺計算機就像一把小提琴。你可以想象一個新手試了一臺留聲機,然后是小提琴。后來他說,這聲音真難聽。我們已經從大眾和我們的大部分計算機科學家那里反復聽到這種說法。他們說,計算機程序對一些具體用途確實是好東西,但它們太缺乏彈性。一把小提琴或一臺打字機也同樣缺乏彈性,那是在你學會如何使用它們之前。
——Marvin Minsky,“為什么說程序設計是表述和理解浮淺的草率而就的思想的好媒介”
《計算機程序的構造和解釋》是麻省理工學院(MIT)計算機科學的入門教材。在MIT主修電子工程或計算機科學的所有學生都必須學這門課,作為“公共核心課程計劃”的四分之一。這個計劃還包含兩個關于電路和線性系統的科目,還有一個關于數字系統設計的科目。我們從1978年開始涉足這些科目的開發,自1980年秋季以后,我們就一直按現在的形式教授這門課,每年600到700個學生。大部分學生此前沒有或很少接受過計算方面的正式訓練,雖然許多人玩過一點計算機,也有少數人有很多程序設計或硬件設計的經驗。
我們設計的這一計算機科學導引課程的主要考慮有兩個方面。首先,我們希望建立起一種思想:一個計算機語言不僅是指揮計算機去執行操作的一種方式,更重要的,它是表述有關方法學的思想的一種新穎的形式化媒介。因此,程序必須寫得適合人的閱讀,偶爾用于供計算機執行。其次,我們相信,在這一層次的課程里,最基本的材料不應該是特定程序設計語言的語法,不是高效地計算某些函數的巧妙算法,也不是算法的數學分析或計算的本質基礎,而是那些能用于控制大型軟件系統的智力復雜性的技術。
我們的目標是使學過了這一科目的學生能對程序設計的風格要素和美學有一種很好的感覺。他們應該掌握了控制大型系統中的復雜性的主要技術。他們應該能閱讀50頁長的程序,只要它具有某種值得模仿的風格。他們應該知道在任何時刻哪些東西不需要讀,哪些不需要理解。他們應該很有把握地去修改一個程序,同時又保持原作者的精神和風格。
這些技能并不是計算機程序設計所獨有的。我們所教授和提煉出來的這些技術,對所有工程設計都是共通的。我們應該在適當的情況下隱藏一些細節,通過創建抽象去控制復雜性。我們通過建立方便的接口,以便能以“混合與匹配”的方式組合起標準的、已經被很好理解的片段,以控制系統的復雜性。我們為描述各種設計而創建一些新語言,每種語言強調設計中的某些特定方面,并降低其他方面的重要性,以便控制復雜性。
作為我們的這些方法基礎的是一種信念:“計算機科學”并不是一種科學,其重要性也與計算機本身沒有太大關系。計算機革命是有關我們的思考方法,以及我們表達自己的思考的一個革命。這一變化的本質,就是出現了這樣一種或許最好是稱為過程性認識論的現象——也就是說,從一種命令式的觀點去研究知識的結構,與經典數學領域里采用的更具說明性的觀點相對應。數學為精確處理“是什么”提供了框架,而計算則為精確處理“怎樣做”的觀念提供了框架。
在教授這些材料時,我們采用程序設計語言Lisp的一種方言。我們并不形式化地教授該語言,因為不需要那樣做。我們只是使用它,而學生可以在幾天之內就學會它。這也是類Lisp語言的一個重要優點:它們只有不多的幾種構造復合表達式的方式,而且幾乎沒有語法結構。所有形式化的性質都可以在一個小時里講完,就像說明下象棋的規則。在很短時間之后,我們就可以忘掉語言的語法細節(因為這里根本就沒有),而進入真正的問題——弄清楚我們想計算什么,可以怎樣把問題分解為一組可管理的部分,以及如何對這些部分開展工作。Lisp的另一優勢就在于,與我們知道的任何其他語言相比,它支持(但并非強制性的)更多能用于以模塊化的方式分解程序的大規模策略。我們可以做過程性抽象和數據抽象,可以利用高階函數掌控公共的使用模式,可以用賦值和數據變動操作模擬局部狀態,可以利用流和延時求值連接起程序里的各個部分,可以很容易地實現嵌入的語言。所有這些都融合在一個交互式環境里,該環境還帶有對增量式的程序設計、構造、測試和排除錯誤的絕佳支持。我們要感謝一代又一代的Lisp大師,從John McCarthy開始,是他們鑄造起了這樣一個具有空前威力又如此優雅的完美工具。
作為我們所用的Lisp方言,Scheme試圖集成起Lisp和Algol的力量和優雅。我們從Lisp那里取來元語言的力量,它來自簡單的語法形式,程序與數據對象的統一表示,以及帶有廢料收集的堆分配的數據結構。我們從Algol那里取來詞法作用域和塊結構,這是當年參加Algol委員會的那些程序設計語言先驅者的禮物。我們想特別感謝John Reynolds和Peter Landin,為了他們關于丘奇的lambda演算與程序設計語言的結構之間關系的真知灼見。我們也認識到應該感謝那些數學家,在計算機面世以前,他們就已經在這一領域中探索了許多年。這些先驅者包括丘奇(Alonzo Church)、羅塞爾(Barkley Rosser)、克里尼(Stephen Kleene)和庫里(Haskell Curry)。
Harold Abelson和Gerald Jay Sussman
- Java Web基礎與實例教程(第2版·微課版)
- R的極客理想:工具篇
- Java EE 7 Performance Tuning and Optimization
- Java實戰(第2版)
- Python圖形化編程(微課版)
- uni-app跨平臺開發與應用從入門到實踐
- Distributed Computing in Java 9
- Data Science Algorithms in a Week
- 官方 Scratch 3.0 編程趣味卡:讓孩子們愛上編程(全彩)
- Python全棧開發:基礎入門
- 少年小魚的魔法之旅:神奇的Python
- Oracle Database 12c DBA官方手冊(第8版)
- Spring MVC Cookbook
- Python大數據與機器學習實戰
- Building Web Applications with Flask