易燃物匯聚 YouTube 有聲書與書評
計算機程序的構造和解釋(JavaScript版) 封面

計算機程序的構造和解釋(JavaScript版)

[美]哈羅德·阿貝爾森 [美]傑拉爾德·傑伊·薩斯曼 [德]馬丁·亨茨 託拜厄斯·瑞格斯塔德

7428人在讀
41.3萬字總字數
¥51.6定價

有聲書與視頻解讀 YouTube有聲書 4 · 視頻解讀 28

內容簡介

本書主要介紹計算的核心思想,採用的方法是爲計算建立一系列概念模型。主要內容包括:構造過程抽象,構造數據抽象,模塊化、對象和狀態,元語言抽象,寄存器機器裏的計算等。採用JavaScript作爲實例分析,但並不拘泥於對語言的解釋,而是通過這種語言來闡述程序設計思想。第1章介紹了計算過程以及函數在程序設計中扮演的角色。第2章在第1章的基礎上提供了將數據對象組合起來形成複合數據,進而構造抽象的方法。第3章介紹了一些幫助我們模塊化構造大型系統的策略。第4章通過元語言抽象探究如何在一些語言的基礎上開發新語言的技術。第5章從寄存器機器的角度出發,通過設計寄存器機器,開發一些機制,實現重要的程序設計結構,同時給出一種描述寄存器機器設計的語言。本書揭示計算機程序設計思想的實質是改變了人們的思考方式:從命令式的觀點去研究知識的結構。因此,本書所闡述的設計思想不僅適用於計算機程序設計,而且適用於所有工程設計。

讀者書評

★★★★★

清晰地記起第一次讀懂《計算機程序的構造和解釋》(原書第2版,中文2004出版)的那種震撼。慶幸與它結緣的同時,我又懊悔,真正翻開第一頁前,它竟被我靜置在書箱十年。我本可以免除迷失十年的苦痛。就如掌握數理邏輯後的我,遺憾中學沒有接觸形式系統的良機。“種樹的最好時機是十年前,其次是現在”,不要因爲十年前的遺憾而自甘放縱,釀成新一個十年的遺憾。一小步一小步踏實的走,一頁一頁專注的讀。漸漸地,我已經走了很遠。或許我終將不過是又一個普通人,但這些寶貴的經歷和體驗已將今天通透的我與初日盲愚的我完全區分開來。 未讀作品前,我困惑計算機行業日新月異,變化之大讓人喘不過氣來,輿論總是在追逐潮流,販賣焦慮,昨天火爆全球的技術今天已是棄子,短命的新概念層出不同,編程語言和工具不是在淘汰中就是在淘汰的路上,新人一邊賣力開幹,一邊擔憂淪爲舊人。“什麼編程語言天下第一”這個沒有意義的話題卻經久不衰,它折射了我們對當下處境的焦慮,總奢想抓住一條捷徑一勞永逸。越是急功近利,越是失望茫然,越是焦慮浮躁,越容易受騙。那麼在千變萬化眼花繚亂的表象中,有沒有萬變不離其宗的本質呢?本書告訴我們,計算機科學的本質是計算過程的形式化,其發展的關鍵是控制複雜度。千言萬語無法道盡作品的優秀,無法道盡我曾經的煎熬,無法道盡我現在的明淨。不如引用原書第1版配套視頻(1984出版)的第一課開頭(注:B站可觀看),以“*****”分隔如下: ***** 計算機科學與計算機的關係不大,就如物理學不僅僅關於粒子加速器,生物學不全然是顯微鏡和培養皿,幾何學也不是介紹如何使用測量儀器的。事實上,幾何學最初之意是測量土地(從名字Geometry的詞根詞綴就能看出來),埃及爲了計算和修理年復一年被尼羅河洪水所毀掉的牧田邊界,建立了幾何基礎。任何一門科學起步之時,人們對它瞭解不深,很容易誤將涉及的工具當作是它的本質。但當我們在幾千年後回頭重新審視這段歷史,他們到底在幹什麼呢?實質上,他們已經開始對時間和空間進行形式化表述,並歸納出一套討論數學真理的形式化方法,這直接導致了數學公理化,以及各種現代數學的產生,同時也指明瞭一種用於精確描述陳述性知識的方法。與此類似,未來的人們回過頭審視我們,啊,這些20世紀的原始人不務正業地玩弄着叫計算機的小玩意呀,但他們真正在做什麼呢,他們開始學習如何對計算過程進行形式化表述,即對“解決問題所形成的步驟序列”進行形式化表述。數學在形式化陳述性(命題式)知識,而計算機科學在形式化過程性(指令式)知識。比如,定義平方根sqrt(x): 1) 陳述性知識(What Is True) sqrt(x) 是這樣一個數y,它的平方等於x,並且 y 大於或等於 0。 這是一個非常好的數學定義,它告訴了我們什麼是x的平方根。但它沒告訴我們如何去求x的平方根。 2) 與之對照,指令式知識(How To)是, sqrt(x): 1. 做一個粗糙的猜測g; 2.改進g: g = (g + x/g) / 2; 即把g更新爲g和x/g兩者的平均值 3.一直改進g直到它足夠好; (注:此處“足夠好”不夠明確,需要進一步明示誤差容忍度) 爲了形式化地表述計算過程(procedure),我們選擇編程語言Lisp。不用擔心,Lisp的語法規則非常簡單,幾分鐘就能學會。請不要感到驚訝,正如象棋的規則十分簡單,幾分鐘後你就可以和任何人談論規則,但這不等於你已經掌握了規則所蘊含的所有東西,五分鐘無法成爲大師(注:人工智能的頂尖人物Peter Norvig寫過一篇文章《十年學會編程》),漫長的修煉是爲了靈活運用這些規則達到目的(注:編程如寫作,識字的人不等於能寫出優秀作品。聽一遍歌詞只需3分半鐘,抄寫一遍不過10分鐘,寫出好詞卻需要十年的積累,厚積薄發,下筆如神)。 當然,編程並不是要告訴人們如何求平方根,如果這就是計算機科學的全部,那也沒什麼了不起的,既無趣也沒難度。真正的問題來自於構建大規模系統,程序長度可能上千頁(上千個文件),沒人能將它裝入腦袋。因此軟件構造的真正技術難點在於控制複雜度,這就是計算機科學發展的關鍵,也構成了我們課程的所有餘下部分… ***** 歸納兩點,一個本質,一個關鍵: 1. 計算機科學的本質是計算過程的形式化,無關具體語言,無關物理機器。從上面的例子可以看到,即使我用中文陳述平方根的定義,也不會失去它的數學品格。即使我用中文寫下平方根的求解步驟序列,也不會損壞它的算法本性。因此計算過程(算法)無關語言。然而要將計算過程形式化,又確實應當精心挑選一門語法簡潔的編程語言,以免不當的語言帶來不必要的額外複雜度,污染了算法的純度。輕巧靈動的Lisp最能勝任,Python也相當優秀,而其它的過於沉重繁瑣。另外,自然語言(中文,英文,法文等等)的表達能力遠勝編程語言,但也因其強大豐富無所不包而容易產生歧義,編程語言可理解爲自然語言的簡化版,同理一階謂詞邏輯也是自然語言的精簡版,數學書寫系統又何嘗不是呢。使用輕巧靈動的語言,編程猶如創作,無需強記語法和花哨招式,筆隨心動,直指人心;使用輕巧靈動的語言,編程猶如數學解謎,一筆一紙足以推理演繹,將有限的符號排列組合成序列,組詞成句,組句成段,謂之證明。計算過程的語形是符號演算,計算過程的語義是解決問題所形成的步驟序列(第1步,第2步,第3步,…)。 注:Javascript出身草率,誕生於互聯網興起的九十年代。最初它只是一門玩具語言,用於編寫嵌套在網頁裏的幾段小腳本,給單調的網頁提供花花綠綠的動態特效,談不上什麼程序設計和規模控制,也完全不講究性能。當年爲了沾邊火爆的Java,取了Javascript這名字,其實它倆一點關係都沒有。Javascript的作者一週就完成了語言的原型。它借鑑了多種語言的特性,C語言的外表,裹着Lisp的核心。隨着互聯網的蓬勃發展,"網頁"(Web pages)這個落後的概念被“網絡程序”(Web apps)新概念取代,體驗極差的單薄靜態頁面輪換,被豐富的程序互動所取代(一次加載,永無刷新)。從重度的頁面設計(html,asp,jsp)轉向大規模的程序設計(javascript,node.js),Javascript被委以重任,脫胎換骨,它的工業化標準程度不亞於Java。豐富的開發工具,超高的語言靈活度,使它成爲一顆耀眼的明星。若從此更名Ecmascript,就不必活在Java的陰影下。Javascript本來就有一顆Lisp的心,越往後越趨向於Lisp。本書的序言也論述了,選用Javascript無損原書的原義。 2. 計算機科學的發展關鍵是控制複雜度。以上平方根的算法只有3條語句,倘若10條語句亦能輕鬆理解。然而上百條語句,甚至上百萬條語句堆積在一起呢,非凡人能掌控。控制複雜度就成了構建大規模系統的關鍵。控制複雜度的核心是抽象,這就是本書各章的主題,過程抽象,數據抽象,模塊化(面向對象),元語言抽象和機器抽象(寄存器機器模型,CPU和內存的運作模型)。 與其說它在教如何編程,不如說它在教如何抽象思維。計算機,數學,物理,邏輯,哲學,語言學,人工智能,不經意地在本書穿插交匯融合。以它爲交點,我延伸至物理,數學,邏輯學,語言學,人工智能,哲學,又回到計算機科學。它們都統一在符號系統之下,一切都是符號演算。我對數學分析(微積分),線性代數,概率論,數理邏輯,邏輯哲學論,實體論,認識論,句法結構,文學理論和人工智能有了更深刻的理解。我不禁好奇,語言何以能言說世界,即語言何以能爲世界建模?建模的確切含義是什麼?由於模型不是事物本身,那麼模型在何種意義上稱爲事物的模型呢?符號世界與現實世界是如何對應起來呢?後來我才領悟並愛上維特根斯坦在《邏輯哲學論》開篇的第二句話,“世界是事實的總和,不是事物的總和”。事物在語言裏對應爲詞,事實對應爲句子,在此不展開論述。在學習數理邏輯(一階謂詞邏輯)後,我明白,符號系統(形式系統)刻畫現實世界的邏輯結構。形式語句的可證性與現實命題的真假對應起來,語句與事實對應起來了。人工智能是且只能是符號演算的機器嗎?GEB真是一本奇書,哦,跑題了。 至今我仍時而隨手翻閱《計算機程序的構造和解釋》(網上也有MIT免費提供的英文版原著,在線閱讀和PDF兩種方式),並每隔一段時間完整重讀一遍,每一次都有新的領悟。破損褶皺的書頁上,是密密麻麻的綵線與註解。它的破舊,兌換成了我的新知。原書第2版會絕版嗎?我是否該再買一本,伴我餘生。我的墓誌銘上刻着Lambda表達式,或許再來一句“世界是事實的總和,而非事物的總和” (The world is the totality of facts, not of things)。

★★★★★

SICP原版是用scheme語言描述的,這一版使用的JS。兩個版本內容上沒有很大差別(相比於所謂的python版的SICP來說)而JavaScript本身也參考了Scheme設計的,所以在語言的表達能力上也沒有很大差距。甚至,因爲JS比Scheme更普及,語法上更讓人熟悉,這比原版上更容易讓人閱讀下去。SICP這本書本身的內容就更不需要質疑了

★★★★★

我十年前讀過原版書,這個版本其實翻譯的還可以,只不過很多沒有必要翻譯的並且還在隨書代碼中用到的專業詞彙最好用原文呈現。僅僅在定義的時候提一下中文意思就可以了。對於這本書本身,我覺得是計算機科學入門最好的教程了。這本書並沒有過多糾結計算機硬件或者軟件的具體實現方法而是在一個很合理的抽象層講明白了計算機科學中一些抽象問題的解決方法。

★★★★★

第一遍看的不太懂,結合Deepseek,草率的認爲是教我們如何應對複雜性的系統性描述與說明,包括當現有語言不足以處理我們所面對的複雜性時,如何構造自己的解釋器,這種複雜性包括空間上的複雜性和時間上的複雜性,具體有待於再一次閱讀和發掘其中的寶藏。

★★★★★

看過 scheme 版本的 JS 還是 scheme 的徒子徒孫。 雖然但是,大廠用力推廣的是不一樣。 不過隔壁 scheme 的一個實現,Chez scheme 也不賴啊。 笑死。

★★★★★

js版本 是新加坡國立出的一個版本,配合他們給的playground來做一個太空遊戲。挺好玩的。 如果不想學lisp,我更推薦伯克利的 cs 61A 是基於python的SCIP 資源更加豐富。

★★★☆☆

書是很好的書,然而譯者水平極差,導致沒能傳達作者原本的意思。想要讀這本書的讀者,慎重考慮。依我之見,譯者實在是誤人子弟。

★☆☆☆☆

翻譯狗屎一般,我可以負責任的說——但凡有點英文基礎——英文版比這個中文版好讀多了。評價只針對譯本,原作堪稱經典。

★★★★★

哈哈哈,正在想要不要學一點JS,如果只是普通的教程我就不看了。這個視角非常好!從高級語言看底層architecture,這比純學一門語言,有用的多! ……暫時不看

★☆☆☆☆

JavaScript版就沒意思了

書籍信息

作者[美]哈羅德·阿貝爾森 [美]傑拉爾德·傑伊·薩斯曼 [德]馬丁·亨茨 託拜厄斯·瑞格斯塔德
出版社機械工業出版社
出版時間2024-01-26
ISBN9787111734635
分類計算機-編程設計
格式EPUB
完結狀態連載中
章節數45