--- tags: csapp, cs:app, sysprog --- # [CS:APP](https://hackmd.io/@sysprog/CSAPP) 學習指引緒論 > 資料整理: [jserv](https://wiki.csie.ncku.edu.tw/User/jserv) :::success :warning: 古希臘 Delphi 神殿前,有一則神諭寫道 "[Know Thyself](https://en.wikipedia.org/wiki/Know_thyself)",也就是「==誠實面對自己==」,我們工程人員就該從技術深造、團隊合作、理性思考,以及培養堅忍不拔精神等方面,找到自我,從而建立自信。 ::: ![image](https://hackmd.io/_uploads/Hk7U90ZRp.png) ## [CS:APP3e](http://csapp.cs.cmu.edu/) 簡介 [CS:APP3e](http://csapp.cs.cmu.edu/) 全名為 Computer Systems: A Programmer's Perspective,是 CMU 的計算機系統概論的教材 (難度相當於台灣的大學高年級),該書的簡體中文翻譯名稱為《深入理解計算機系統》。    在電腦科學領域中,[80/20 法則](https://en.wikipedia.org/wiki/Pareto_principle)依然適用,程式開發者平時用到的超過九成的電腦知識基本來自於這些電腦科學核心課程中不到一成的內容,至於剩下的九成內容,雖然不至於沒用,然而它們沒有大用,至少,它們不至於對你造成什麽損害。舉例來說,你可以不知道 [DMA 的原理](https://en.wikipedia.org/wiki/DMA),不知道 [(E)BNF 表示法](https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form),你依舊可撰寫出堪用的程式碼;但你若連記憶體配置或是同步臨界區都搞不清楚的話,那就尷尬了,你可能因此糾結於「為何不能初始化一個大小為 16MB 的區域變數」這樣的問題,或對著多執行緒裡頭變幻莫測的全域變數百思不得其解。 CMU 兩位教授 [Randal E. Bryant](https://en.wikipedia.org/wiki/Randal_Bryant) 和 [David R. O'Hallaron](https://www.cs.cmu.edu/~droh/) 巧妙地把程式設計及效能最佳化、數位電路基礎、指令集架構、組合語言、儲存裝置、連結器與載入器、行程、虛擬記憶體等等自各不同的學科的核心知識點攪和在一起,並以程式開發者的視角呈現,所以這本書的書名叫 "A Programmer's Perspective"。    這本書的簡介闡明一個簡單的 Hello World 程式在電腦上的執行過程:前置處理器 $\to$ 編譯 $\to$ 組譯 $\to$ 連結 $\to$ 產生可執行的目標檔案 $\to$ 載入到記憶體 $\to$ I/O 資料流 (stream) $\to$ 螢幕輸出顯示 —— 過程全無廢話。 指令集和計算機結構這一章,兩位作者為了讓讀者更好的理解指令集 (以 Intel x86_64 為主要探討),實作獨樹一格的簡化版的 `Y86_64` 指令集,並用其表示基本的運算和控制,甚至連數位電路的 HCL 也詳加探討。資料處理流程、數位邏輯和 pipeline,詳細的講解搭配圖例,一目了然。 記憶體階層架構的內容的關鍵就是 locality,只有了解電腦的階層式記憶體架構,才能體會到為什麽同樣邏輯的程式會產生如此之大的效能差距,雖然電腦設計者的初衷是把記憶體儲存裝置視作一個巨型陣列,然而在這個巨大的陣列中,不同區段卻可能造成巨大的差異。 初步閱讀本書時,讀者可能會質疑:為何要大費周章,介紹多數人已理解的二進位系統呢?但細讀本書第二章後,相信許多人會發現,原來自己所謂的「懂二進位」,往往只是一廂情願。史上若干知名[軟體缺失案例](https://hackmd.io/@sysprog/software-failure)就因開發者未能充分掌握相關議題,而釀成莫大的傷害與損失。 人們對數學的加減運算可輕易在腦中辨識符號並理解其結果,但計算機做任何事都受限於實體資料儲存及操作方式,也就是說,計算機的實體只認得 0 和 1,卻不知道符號 + 和 - 在數學以及應用場域的意義,於是科學家和工程人員引入「補數」來表達人們認知上的正負數值,但您有沒有想過,為何「二補數」被電腦科學廣泛採用呢?背後的設計考量是什麼?閱讀本書第二章後,相信您一定會有「腦洞大開」的震撼。 ## 學習方式 搭配 [15-213/18-213/15-513: Intro to Computer Systems](http://www.cs.cmu.edu/~213/schedule.html) (目前 2024 Spring) 的投影片和[錄影](https://scs.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#maxResults=250&folderID=%22b96d90ae-9871-4fae-91e2-b1627b43e25e%22) (2015 Fall) * [Intro to Computer Systems, Spring 2020](http://www.cs.cmu.edu/afs/cs/academic/class/15213-s20/www/schedule.html) * [2020 Course Overview (PDF)](http://www.cs.cmu.edu/afs/cs/academic/class/15213-s20/www/lectures/01-overview.pdf) * [Facebook: CS:APP Taiwan study group](https://www.facebook.com/groups/csapp.tw/) ## 搭配閱讀 * [現代處理器設計](https://beta.hackfoldr.org/cpu/) * [你所不知道的 C 語言](https://hackmd.io/@sysprog/c-prog) * [Linux 核心設計](https://hackmd.io/@sysprog/linux-kernel-internal) * [作業系統概念](https://beta.hackfoldr.org/oscar/)