1. 程式人生 > 其它 >nand2tetris 與 MIT6.828

nand2tetris 與 MIT6.828

nand2tetris 與 MIT6.828

原文連結:https://blog.csdn.net/q411020382/article/details/105165468

nand2tetris
難度:★★★★☆
推薦:★★★★★
nand2tetris 專案有一本書叫《計算機系統要素》,也有英語的視訊教程。如果英語不好的可以看書,內容是一樣的。

這本書主要講解了計算機原理(1-6章)、編譯原理(7-11章)、作業系統相關知識(12章)。不要看內容這麼多,其實這本書的內容非常通俗易懂,翻譯也很給力。每一章背後都有對應的練習,需要你手寫程式碼去完成,堪稱理論與實踐結合的經典。

這裡引用一下書裡的內容簡介,大家可以感受一下。

本書通過展現簡單但功能強大的計算機系統之構建過程,為讀者呈現了一幅完整、嚴格的計算機應用科學大圖景。本書作者認為,理解計算機工作原理的最好方法就是親自動手,從零開始構建計算機系統。
通過12個章節和專案來引領讀者從頭開始,本書逐步地構建一個基本的硬體平臺和現代軟體階層體系。在這個過程中,讀者能夠獲得關於硬體體系結構、作業系統、程式語言、編譯器、資料結構、演算法以及軟體工程的詳實知識。通過這種逐步構造的方法,本書揭示了電腦科學知識中的重要成分,並展示其它課程中所介紹的理論和應用技術如何融入這幅全域性大圖景當中去。

全書基於“先抽象再實現”的闡述模式,每一章都介紹一個關鍵的硬體或軟體抽象,一種實現方式以及一個實際的專案。完成這些專案所必要的電腦科學知識在本書中都有涵蓋,只要求讀者具備程式設計經驗。本書配套的支援網站提供了書中描述的用於構建所有硬體和軟體系統所必需的工具和資料,以及用於12個專案的200個測試程式。

全書內容廣泛、涉獵全面,適合計算機及相關專業本科生、研究生、技術開發人員、教師以及技術愛好者參考和學習。

而且,這本書的門檻非常低,只要你能熟練運用一門程式語言即可。

本書從與非門開始教你一步步構建一個完整的計算機(1-6章);從第 7 章開始一直到第 11 章,需要完成三個編譯器(彙編編譯器、VM 編譯器、Jack 語言編譯器);最後一章則需要完成作業系統部分功能。

如果你完成了本書所有的專案,則會獲得以下成就:

構建出一臺計算機(在模擬器上執行)
實現一門語言和相應的語言標準庫
實現一個簡單的編譯器
我已經把這本書所有專案都完成了,耗時兩個月(每天 3 小時)。答案放在 github 上,還建立了一個 QQ 交流群,如果有不懂的可以加群裡探討一下。

【高清-中字-公開課】依據基本原理構建現代計算機:從與非門到俄羅斯方塊(嗶哩嗶哩視訊網站)

Nand2Tetris: From NAND to Tetris

依據基本原則構建現代計算機

MIT6.828
難度:★★★★★
推薦:★★★★★
這個專案是 MIT 大學開源的一個作業系統課程,官網是 https://pdos.csail.mit.edu/6.828/2018/schedule.html。該專案主要有以下幾個優點:

循序漸進,從淺到深,讓人更容易接受
理論與實踐結合,每講解一個知識點都有對應的練習需要完成
做這個專案的人很多,網上資料和答案非常多
只要你跟著專案走,從 Lab1 開始,一步一步的做到 Lab6,就能實現一個簡單的作業系統核心。以下是 6 個實驗的內容簡介:

引導PC,講解 bootloader
記憶體管理
使用者程序及中斷
搶佔式多工處理
檔案系統
網路驅動程式
不過這個專案比起 nand2tetris 要難,門檻較高。如果沒什麼基礎的話,建議做這個專案之前先看看下列資料:

x86組合語言:從真實模式到保護模式
xv6-chinese
作業系統導論或任意一本作業系統書籍
git
這個專案也花了兩個月才完成,不過只做了 Lab1-6 實驗,挑戰任務和家庭作業都沒做。答案放在 github 上,有興趣可以看看。

=================

主要先強推你說的這個底層知識科普。

計算機是怎樣跑起來的

程式是怎樣跑起來

作者[日] 矢澤久雄是個來自日本的可愛小哥哥。還有這個系列其他一些

網路是怎樣連線的

圖解TCP/IP(第5版)

圖解HTTP (豆瓣)

圖解網路硬體 (豆瓣)

這些書看起來非常有趣,而且沒什麼特別難懂的。如果有!那就先跳過,這類基礎讀物嘛,知道個大概就可以了。

然後我看題主像軟硬體結合?那我還推薦你實操很強的“自制”系列

圖靈程式設計叢書·自制系列

這裡麵包含了 我最喜歡的

30天自制作業系統 (豆瓣)

當然其他自制CPU,自制指令碼語言,自制編譯器,自制搜尋引擎也都是很好的。

因為考慮到題主不是計算機專業的,所以沒有推教科書中的經典書籍。那些書不是一般人願意看下來的,或者說深入看一本大概就是半年沒了...我推薦的這些除了實操,其他只要耐心看完就可以了 。

----------------------------

The Elements of Computing Systems(a.k.a. From Nand to Tetris)

《計算機系統要素一一從零開始構建現代計算機》

何止是電路,這本書帶著你從NAND與非門開始,構造出CPU和整臺電腦,然後在這臺電腦上開發作業系統、編譯器,最後寫出一個俄羅斯方塊(Tetris)遊戲。

更關鍵的是,這本書的兩位作者親自開設了一門MOOC網課,全套視訊免費看!

Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course)

裡面還有他們的lab,以及他們研發的幾乎所有配套軟體,包括CPU模擬器、彙編器、虛擬機器,等等等等。只要有足夠的耐心和時間,你完全可以一步一步,從一塊磚頭開始搭建起整個電腦科學的巨集偉大廈。


UPDATE1:評論裡提到了nandgame這個網站,一併推薦給大家。about頁面有指出,靈感其實就來自於上面推薦的這本書。網站的優點是可以直接在瀏覽器裡使用,缺點嘛,是隻覆蓋了本書的一小部分。

UPDATE2:看來大家對手撕計算機很感興趣嘛。再推薦一個youtube博主Ben Eater給大家。這貨最廣為人知的作品,就是在一個只提供電路連線的麵包板上,從邏輯閘開始造出了一臺8bit可程式設計計算機。在這個過程中,你需要自己搗鼓Latch、Flip-flop等各種電子元器件。看著他的成品,我不禁默默按了下收…啊!是點贊按鈕!

----------------------------------------

其他回答說的挺好的,很多是動手操作層面的書籍,或者是嵌入式的硬體環境,或者是虛擬機器之類的。

但是我仔細一看,樓主是數學系大三,抽象和推理能力應該很強。可以”高舉高打“啊!畢竟數學是科學和工程的普適語言,計算機專業的很多東西估計在數學大神看來只是“應用數學”或者“工程數學”之一。

如果樓主不是想換專業,不忙著找計算機方面的工作,數學書看累了,作為放鬆不妨可以看看這幾本(可能太“陽春白雪”了),即可以摸清計算機底層的邏輯本質,而且不用花錢買開發板之類的。

由於我是Lisp粉絲,因此稍微夾帶私貨:)

1.《電腦科學的邏輯基礎》,國內剛翻譯出版。

這本書使用了基於Lisp語言的邏輯證明工具ACL2(官網如下)

ACL2 Version 8.3

作為數學系的樓主,對形式證明應該得心應手。這本書利用ACL2這個工具,對計算機算術、數位電路(加法器和乘法器之類)的設計及其性質,進行了嚴格的邏輯驗證。

如果樓主嫌這個太low,到ACL2官網,還有更多硬體驗證的例子。

比如X86的指令集分析

X86ISA - Introduction

還有在ACL2中形式化jvm虛擬機器的課程

COSC5010: Formalizing the JVM in ACL2

2. 《計算機程式的構造和解釋》,大名鼎鼎的SICP

計算機程式的構造和解釋(原書第2版)

這本書大部分人覺得就是講Lisp/Scheme程式設計,或者利用Lisp/Scheme講程式設計思想。但是別忘了這本書曾經是MIT的電子和計算機工程系的一年級教材,好多電子工程和計算機底層模型作為例子,作者寫著寫著,就寫成了一本自底向上“搭積木”式的計算機系統構造指南。

摘錄一些特別精彩的章節例子:

3.3.4 數位電路的模擬器 (以這個為基礎,你可以實現一個計算機體系結構的模擬模型)

3.5.3 流計算模式的使用 (這裡居然用類比電路和訊號處理系統的模擬做例子)

第4章實現了Lisp的元直譯器。

第5章 暫存器機器裡的計算 (這章的節奏絕對是“瘋狂”的,5.1先實現了玩具性質的“高層次”硬體描述語言,5.4用這個語言搞出一個Lisp機器, 5.5為這個機器提供編譯程式)

這本書具有國內教材難以企及的大局觀和磅礴氣勢,有一種高屋建瓴之美! 讓你從理論上搞清楚了計算機是從底層一步步怎麼來的,軟體/硬體如何協同,確實不愧是一本“神作”。

3.《組合語言與計算機體系結構》,一本默默無聞的老教科書,從來沒火過

組合語言與計算機體系結構

為什麼推薦這本? 因為看到樓主想學C++,這本書會告訴你C++的語法構造如何在底層機器上實現。採取的也是很詭異的手法,軟硬體協同”試錯“的方法。

先設計一個虛擬機器,搞一個指令集,可以支援一些語法構造了。但是有些語法構造支援比較難,那就持續的擴充指令集,改造虛擬機器,設計逐步迭代,直到最終可以支援所有核心構造。

虛擬機器模擬的是”微程式“的體系結構,嚴重懷疑作者是上個世紀70-80年代設計計算機的,頗有那個年代之氣質。

----------------------------------------

從電路開始講然後彙編再到C語言。

俺依稀記得, 古老的 MULTISIM 11~12 版裡面都可以模擬微控制器的。

《STC微控制器原理及應用 從器件、彙編、C到作業系統》

微控制器是電子產品的“大腦”

生活中許多電器用了微控制器。

例如:電視、冰箱、洗衣機、電飯鍋、兒童玩具等等。

微控制器是這些電器動作的總指揮,號令硬體執行。接收使用者通過按鍵的輸入訊號,按照編好的程式,指揮繼電器、馬達和外圍功能電路動作。

微控制器是由CPU、記憶體、外圍功能等部分組成的。

微控制器的CPU從儲存器讀取程式,但是一次只能讀取一條指令,然後解釋每條指令,並執行。

儲存器中儲存的內容,不管是程式還是資料,都是二進位制程式碼“0”和“1”組成的字串。

指令二進位制程式碼告訴CPU要做什麼,

而資料二進位制程式碼則是CPU操作或處理指令時要使用的值。

CPU的操作包含加、減運算等指令。

這些像密碼一樣排列的“0”和“1”字串就是機器語言。

CPU總是按儲存器地址的順序讀取指令程式碼,除非遇到跳躍指令。

例如,如果復位後的地址是0000,則從0000開始按0001、0002、0003的順序讀取並執行指令。

也可以說,一個程式就是按處理要求排列一系列的機器語言。

CPU只能理解機器語言。

因此,為了使CPU執行,就必須使用機器語言的程式。

但機器語言不易為人們識別和讀寫。

因此人們用了更簡單易懂的字串來代替機器語言,這就是組合語言。

例如,在“給暫存器A賦值2”這樣的處理時,如果用匯編語言來表示,就很簡單,

組合語言中,用MOV字串表示賦值,所以“給暫存器A賦值2”的處理就可用

“MOV A,#02”

表示。

雖然組合語言比機器語言更加簡單易懂了,但是人們讀起來還是挺難理解的。

而且,組合語言還存在另一個問題,就是不同的CPU,機器語言的描述方式也不同。

因此,如果更換了CPU,就必須改寫與機器語言有著密不可分關係的組合語言

,每更換一次CPU都必須對程式進行改編,不但造成生產性低下,還加重了程式設計人員的負擔。

《基於彙編與C語言的微控制器原理及應用》 《微控制器原理與應用:基於彙編C51及混合程式設計/高等學校計》 《微控制器原理、應用與PROTEUS模擬:彙編+C51程式設計及其多模組混合程式設計》

人性化的C語言

能夠解決上述問題的程式語言就是C語言。

----------------------------------------

我覺得從實際的角度出發,你迫切需要解決的問題是先學會一門程式語言,儘量搞熟練,達到可以開發出軟體的程度,不要去管底層的東西,畢竟大三了,先通過掌握程式語言和軟體開發知識跨到程式設計師這個行業,工作後在慢慢補充哪些知識。況且從應用軟體開發的角度,電路知識並不重要,微機原理、作業系統、編譯原理都已經算底層知識了,資料庫系統、資料結構和演算法、還有數學才是真正關鍵常用的知識。你想在短短兩年把《類比電路》《數位電路》《微機原理與彙編》《作業系統》《編譯原理》《C++》這麼多門計算機系學生的核心課程學完,還要融會貫通串聯起來,對自己的要求著實不低。

電路和程式設計真的沒關係,不管是數位電路還是類比電路。
和程式設計有關的硬體知識是計算機體系結構,學這個不需要學電路。

不要看或者沉迷於這種書,過於泛泛,沒有可實踐性。

==============End