《電腦程式的構造和解釋(SICP)》討論的核心問題是什麼?

時間 2021-05-06 17:34:53

1樓:做夢都想進位元組

我來吐槽下我還沒有看完。。。看到第二章感覺就是把一些簡單演算法拿lisp寫一遍,lisp看多我快吐了,要是拿scala寫該多好。。

2樓:三十二

我覺得SICP的核心問題就是,如何通過抽象的方式降低軟體系統設計的複雜度。

這本書最大的問題在於,你必須得預設你讀這本書的時候什麼東西都沒學過……畢竟一上來就給乙個連迴圈結構都沒有的語言……

因此,OOP或FP什麼的,你必須也得預設自己從沒學過,不然當他提出將資料抽象為物件時,你肯定第一反應是「這不是OOP麼」,然後說這書沒什麼好看的……

錯了,這書最大的趣味就在這個地方,它就是在你完全不知道什麼是程式設計正規化,什麼是最佳實踐時,跟你講,你應該如何通過抽象的方式去降低複雜度。這裡的抽象,可以有很多方式,OOP只是其中一種。

第一章引入了程式設計的基本元素,演算法複雜度和高階函式。第一章貌似是把函式(或者高階函式)當做過程的抽象結果(黑箱)了。

第二章,資料的抽象。這章講的東西可就多了(笑~

資料抽象的結果有很多種,資料結構、閉包函式是最簡單的,我在懷疑的是那個通用性操作的系統是不是抽象類和介面的原型……

資料抽象的方式,包括遞迴、組合、復合(前三個FP常用的)、繼承、介面(這是OOP常用的)。

第三章核心是狀態和變化

首先分析了什麼是狀態,狀態和賦值的關係,狀態的語法模型;反正就是在給你突出狀態這個東西就好了。我一開始將狀態理解為作用域,畢竟純函式和閉包函式的區別就是有無狀態嘛……

狀態的好處是模擬,這也是OOP最大的優勢。於是給出了乙個模擬的例子:

在乙個擁有許多帶有狀態的物件系統,以及物件的變化是帶有連帶效果的(就是a的變化引起b的變化,b又引起c和d的變化,c又引起e)。在這樣乙個系統我們應該如何通過抽象的複雜度(事件訂閱、訊息傳遞和約束系統,就是Vue中的watch和computed我去……我猜尤大應該看過SICP……)

然後,引入了併發(事件)的概念,說明了帶狀態的壞處。我沒學過併發(畢竟我js特麼是個單執行緒語言……),所以不知道這塊怎麼講……總之感覺併發帶來的問題就是讀和寫。解決的方案叫序列化,怎麼看怎麼像js的事件迴圈……

最後,引出了無狀態的流模式,無狀態也是函式式程式設計的(fp)的一大特點,這種程式設計正規化最大的特點就是不帶狀態,因此不會引入讀寫的問題;缺點麼,模擬性太差……

所以,綜上所述,我覺得核心問題就是,如何通過抽象的方式來降低軟體系統設計的複雜度,有哪些抽象的方式,每種抽象的方式會帶來哪些優勢和引入哪些問題。

而這種抽象,就叫程式設計。

好了,明天開始讀第4章。

js程式設計師讀這本書挺容易的……全是熟悉的概念……目前讀3章花了5天,算上今天寫總結花了6天。哦對了,這書還有個特點,在圖書館讀能讀到頭疼,在寢室讀能讀嗨……

3樓:

程式語言是如何構造的

1:基本元素

①基本過程(過程是將輸入轉化為輸出的一組活動,經過抽象(命名,說明使用方法)後即是函式,可以認為過程包括運算子和函式):基本代數運算,基本邏輯運算,基本控制結構等(控制結構也可以看做是乙個過程,因為它接受某種輸入然後產生某種輸出,比如選擇結構接受某個過程的布林值,然後輸出某個過程。迴圈結構接受某個迴圈條件,然後輸出跳轉指令,但lisp中只有迭代,沒有迴圈)

②基本資料 :整數和小數

2:組合手段

①組合過程的手段:將多個過程組合成乙個復合過程。

②組合資料的手段:將多個資料組合成乙個資料結構。在提供組合資料的手段的同時提供選擇資料結構中某個資料的過程。

③過程和資料組合在一起的手段:即類和物件

3:抽象手段(通過定義來封裝成乙個黑箱)

①對組合後形成的組合體進行命名,從而能夠在使用時忽略其內部組成細節來直接使用。(命名應該反映其功能,即自然語言中已有的概念,比如平方根、求最大值、陣列、表等,命名的好壞反映了對某個復合過程或者資料結構的理解)

②對組合體的使用方法,比如某個復合過程的輸入和輸出是什麼、輸入輸出的關係是什麼,功能是什麼。資料結構如何使用,如何使用相關函式對其進行處理等。

程式是如何構造的(使用上述構造出的程式語言)

1:面向過程

以第一人稱用過程對資料進行處理。適用於步驟明確的問題,比如數學問題(牛頓法求平方根,微分方程的數值演算法等)。

2:物件導向

賦予資料屬性和行為從而形成物件,以第三人稱指揮物件。適用於對實體建模的問題,比如第三章的電路構造是對乙個層次性的系統進行建模。

4樓:Johnson

讀了書的前三章,我覺得核心問題就是計算機是如何描述我們真實的物理世界的,在描述的時候,又出現了什麼樣的問題,而我們又是怎麼解決的。我梳理一下思路吧。

1.如何用電腦程式去描述乙個銀行賬戶呢?

2.那如何描述銀行賬戶之間的轉賬呢?

3.如果多個使用者對同乙個賬戶進行操作,又該如何描述呢?

我們想要用電腦程式模擬真實的物理世界,可以首先想想真實世界的特徵,比如銀行賬戶有什麼特徵呢?餘額?賬號?

密碼?所以,我們首先用電腦程式模擬乙個銀行賬戶,有money欄位,name賬號字段,password密碼字段。這也就是最開始出現的資料抽象,將現實世界的資料抽象成某個字段,用於表示它的特徵。

就像乙個杯子,我們抽象它的長length,寬width,高hight等特徵,表示它。

這種資料抽象的方法,將使乙個程式中的大部分描述能與這一程式所操作的資料物件的具體表示的選擇無關。就是用各種計算機儲存的資料描述這個真實世界的事物。

賬戶A想要轉賬給賬戶B的金額為50元,我們怎麼用電腦程式去描述呢?如果能提供一種方法transfer(A,B,num),將表示為賬戶A轉賬至賬戶B的num金額,這是否能表述真實世界的轉賬操作。這一種方式也就是過程抽象,我們把真實物理世界的許多動作抽象成乙個過程,比如吃抽象為eat()等方法。

當我們把賬戶金額抽象為資料,轉賬動作抽象為過程,那麼我如果想要對同乙個賬戶兩次轉賬呢?本來我的賬戶有100元,第一次轉賬25元剩下75元,第二次轉賬25元剩下還是75元嗎?當然不對,應該剩下50元。

所以這時又引入了新的問題,如何儲存我賬戶的金額?

這時我們需要維護乙個狀態了,就像上面例子說的我賬戶的金額,我需要記錄下來,這個狀態是隨著時間的變化而變化的。將系統看作是一集帶有區域性狀態的物件,用區域性狀態變數去模擬系統的狀態,用對這些變數的賦值去模擬狀態的變化。維護狀態同時也會增加系統複雜性,引入之後,乙個變數不再是簡單的名字,而是索引著乙個可以儲存值的位置,而儲存在那裡的值也可以改變的。

此時,還會引入環境模型,這個環境模型約束著當前環境下的實際引數,簡單說就是引數在不同環境中的值可能不相同,就像控制程序上下文的PCB。

引入狀態的概念,會帶來很多複雜性的問題,比如:狀態需持久化,環境模型等,有沒有其他方式來維護狀態呢?在系統中,我們關注某個變數x隨著時間的變化,試想,如果有乙個函式f(x)的存在,x軸為時間,y軸為變化的趨勢,隨著時間的變化,y軸也隨著變化。

可是f(x)卻沒有變化,所以這個關於時間的函式沒有變化,我們是不是可以理解為整個系統的流程未發生變化,這時我們引入新的資料結構————流。當我們的資料經過某個系統時,這其實就是對整個系統看作乙個整體,資料會經過固定模組,最後經過系統之後就是我們想要的結果。

第三個問題,多個使用者對同乙個賬戶進行操作,如何去描述?賬戶本身金額為100元,A使用者存50元,B使用者取130元,A使用者先存和B使用者先取的結果是不一樣的,那麼用程式描述這一動作是就需要考慮時間問題,這就是分布式問題的本質————時間

如何鑑別乙個分布式系統是否優秀?能將高併發的並行請求的處理結果等同於序列請求的處理結果,那麼本質就是按照時間發生順序執行請求,這樣就能夠解決分布式中的大量資料不一致的問題。

如何將分布式多台機器上的請求按照發生的時間順序執行呢?這後面又應該講講如何分布式的各個問題了,個人覺得最核心的就是建立緩衝區,所有確定性的請求按時間順序寫入緩衝區,並順序消費。所謂確定性是指處理過程與時間無關的,其處理結果亦不受額外輸入影響。

保證順序消費,資料一致性又有了raft、paxos等一致性演算法,將分布式中強一致性轉換為最終一致性。

後面兩章等讀完了再更新吧。

5樓:喜歡兔子

如何控制大型軟體系統的複雜度。使用的方法是——抽象。資料抽象和過程抽象。

說實話,書中對「抽象」解釋得還不夠直白,有些繞,中文翻譯更是讓人摸不著頭腦。要弄清抽象,必推薦《lisp剖析》Anatomy of Lisp 前兩章!

6樓:tulip kung

主要是講從不同層次的抽象

不過text講太拖沓如果不是上課要用建議補充這本

paradisms of artificial intelligence

(sicp 電腦程式的構造和解釋) 如何理解無限長的流?

窗戶 每次都展開計算一下,往前推一步,完全可行阿。利用函式構造惰性計算 define syntax xcons syntax rules xconsab cons lambda a lambda b define syntax xcar syntax rules xcarx car x define...

怎樣讓父母理解電腦的構造?

蘇河 最早的時候我是這麼理解的,現在想想其實並不是很準確,但是能讓對電腦一點不懂的人開始有個初步的認識。電腦就好比乙個加工廠,cpu就是生產車間,硬碟是倉庫,記憶體是連線倉庫跟生產車間的通道。工作過程可以這麼理解 原料從倉庫運輸運輸到車間,要經過通道,所以cpu 越好,表示車間生產效率高,但是如果通...

如何解釋列印自己的程式?

時國懷 先按行分解開,這個程式一共有6行 charb 0x22 charn 0xa char c char b 0x22 char n 0xa char c c s c main main 前面定義了三個變數,後面是main函式裡乙個輸出。然後把輸出裡的printf展開,把c和b都替換成具體的值 p...