Abelson & Sussman:structure And Interpretation Of Computer Programs@1996 (第2版)
SICP 第二版主要論點闡述
《電腦程式的結構與解釋》(Structure and Interpretation of Computer Programs, SICP) 第二版是一本探討建構複雜計算系統之基本原則的著作。本書以計算的抽象層次為核心,循序漸進地介紹程式設計的核心概念,並透過 Scheme 語言實作一系列具體範例,展示如何運用這些概念來控制系統的複雜性。本書的主要論點圍繞著以下幾個核心主題:
-
程序抽象 (Procedural Abstraction):
本書始於探討程序(或稱函數)作為建構抽象的基本工具。程序允許我們將一系列操作打包成一個單一概念單元,並給予其名稱,從而可以在更高的層次思考問題。這涉及了基本元素的組合、程序自身的定義、以及程序應用的求值模型。本書首先介紹替換模型 (Substitution Model) 來解釋程序應用的意義。接著,透過牛頓法求解平方根等範例,闡明程序如何產生不同的計算過程(遞歸或迭代),以及如何分析這些過程的時間與空間複雜度(成長的階次)。更高階程序(接受或返回程序的程序)的引入,進一步提升了語言的抽象能力,使我們能夠將通用的計算方法表達為程序,例如通用的求和或定積分計算過程。 -
數據抽象 (Data Abstraction):
除了程序,數據也是構建抽象的另一重要基石。本書強調將數據的使用方式與其具體的內部表示分離的原則,即數據抽象。透過定義一組基本操作(建構子和選擇子),我們可以在「抽象數據」的層次上操作數據,而無需關注數據是如何由更原始的數據類型組成的。例如,以有理數為例,我們可以定義make-rat、numer和denom等操作,使得處理有理數的程序(如add-rat)僅依賴這些抽象接口,而不必知道有理數是表示為包含分子和分母的「對偶」(pair)。這種數據抽象建立了屏障,使得程序的不同部分可以獨立設計和修改。書中介紹了「對偶」作為通用的數據組合膠水,闡述了其「封閉性」(closure property) 如何使得構建任意複雜的數據結構(如列表、樹、符號表達式)成為可能。此外,書中還探討了數據的不同表示方式(如列表表示集合的有序與無序形式,以及樹狀表示),以及這些表示方式如何影響程序的效率。 -
模塊化、對象與狀態 (Modularity, Objects, and State):
為了更好地模擬現實世界中具有時變狀態的對象,本書引入了「賦值」操作 (assignment) 和局部狀態變量 (local state variables)。這使得我們可以創建計算對象,其行為會隨著時間改變,依賴於其歷史狀態(例如銀行賬戶的餘額)。然而,引入賦值破壞了程序原有的引用透明性 (referential transparency),使得簡單的替換模型不再適用。為了解釋帶有賦值的程序,本書引入了更為複雜和貼近機器執行方式的環境模型 (Environment Model)。環境模型解釋了變量如何引用存儲值的「位置」,以及程序應用如何創建新的環境框架來管理局部變量和程序的定義環境。透過環境模型,我們理解了如何使用賦值和局部變量來構建具有本地狀態的計算對象,以及由此產生的可變數據結構(如可變列表)。書中也探討了併發 (Concurrency) 帶來的挑戰,因為多個過程可能同時訪問和修改共享狀態,這需要同步機制(如序列化器)來控制事件發生的順序。最後,本書將「流」(Streams) 作為一種替代方法來建模狀態,通過延遲求值 (delayed evaluation) 來表示可能無限長的數據序列,從而以函數式的方式處理時變現象,避免了部分賦值帶來的複雜性。 -
元語言抽象 (Metalinguistic Abstraction):
本書認為,程式設計的本質不僅僅是使用現有的語言來解決問題,更在於創建新的語言來更有效地表達思想。這種創建新語言的能力稱為元語言抽象。實現新語言的關鍵是構建一個「求值器」(Evaluator),一個能夠解釋和執行語言表達式的程序。書中展示了一個「元循環求值器」(Metacircular Evaluator),一個用 Scheme 語言寫成的 Scheme 求值器,它揭示了求值過程的核心機制(eval-apply 循環)。通過修改這個求值器,我們可以探索不同的語言設計選擇。例如,書中修改求值器以實現延遲求值(惰性求值),這與流的概念緊密相關,可以改變程序的執行方式。更進一步的變革是引入非確定性計算 (Nondeterministic Computing),通過特殊的amb操作和自動搜索機制,使得表達式可以有多個可能的值,從而以關係而非函數的方式思考問題。最終,書中介紹了邏輯編程 (Logic Programming),一種完全不同的範式,知識以關係和規則的形式表示,求值器負責演繹推理和尋找滿足關係的可能解。 -
暫存器機器計算 (Computing with Register Machines):
本書的最後部分深入探討了計算在底層機器上的具體實現。它通過設計暫存器機器 (Register Machines) 來模型化傳統計算機的順序執行過程。暫存器機器有固定的暫存器集合和基本操作,並通過控制器來排序操作的執行。書中展示了如何將 Scheme 程序(包括迭代和遞歸過程)轉化為暫存器機器的指令序列,揭示了程序執行時暫存器和堆棧的使用方式。特別地,闡述了如何使用堆棧來實現遞歸調用。此外,本書還討論了內存管理的問題,包括如何使用向量來表示列表結構,以及垃圾回收 (Garbage Collection) 機制如何自動回收不再使用的內存空間,提供「無限內存」的假象。最終,書中描述了一個「顯式控制求值器」(Explicit-Control Evaluator),一個用暫存器機器指令實現的 Scheme 求值器,這提供了對求值過程控制結構的完整描述。並在此基礎上,引入了編譯 (Compilation) 的概念,將 Scheme 程序翻譯成暫存器機器可以直接執行的指令序列,與解釋執行形成對比,探討編譯帶來的效率優勢以及與解釋器的集成問題。
總結來說,SICP 通過對程序、數據、狀態、求值器和底層機器的深入剖析,層層遞進地展示了構建複雜計算系統的強大抽象技術和組織原則。全書貫穿了抽象的概念,強調從不同的視角(函數式、面向對象、元語言、機器層次)理解和控制計算的複雜性,旨在培養讀者成為能夠設計和實現通用計算過程的優秀程序設計師。
comments
comments for this post are closed