# [CS:APP](https://hackmd.io/c/S1vGugaDQ/) 學習指引緒論 ## [CS:APP3e](http://csapp.cs.cmu.edu/) 簡介 [CS:APP3e](http://csapp.cs.cmu.edu/) 全名為 Computer Systems: A Programmer's Perspective,是 CMU 的計算機概論的教材 (難度相當於台灣的大學研究所),該書的簡體中文翻譯名稱為《深入理解計算機系統》。    在電腦科學領域中,80/20 原則依然適用,程式開發者平時用到的超過九成的電腦知識基本來自於這些電腦科學核心課程中的不到一成的內容,至於剩下的九成內容,雖然不至於沒用,然而它們沒有大用,至少,它們不會對你造成什麽損害。舉例來說,你可以不知道 [DMA 的原理](https://en.wikipedia.org/wiki/DMA),不知道 [(E)BNF 表示法](https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form),你依然可以撰寫出堪用的程式碼;但若你連記憶體配置或是同步臨界區都搞不清楚的話,那就尷尬了,要不然你就會在為什麽不能初始化一個大小為 16MB 的區域變數這樣的問題上糾結半天,或者是對著多執行緒裡頭變幻莫測的全域變數百思不得其解。 CMU 兩位教授及 CSAPP 這本書背後的貢獻者著實了不起,他們非常巧妙的把程式設計及優化、數位電路基礎、指令集架構、組合語言、儲存裝置、連結器與載入器、行程、虛擬記憶體等等自各不同的學科的核心知識點攪和在一起,並以程式開發者的視角呈現,所以這本書的書名叫 "A programmer's perspective"。    這本書的簡介(引言)部分簡介明了:一個簡單的 Hello World 程式在電腦上的執行過程,前置處理器 `->` 編譯 `->` 組譯 `->` 連結 `->` 產生可執行的目標檔案 `->` 載入到記憶體 `->` 資料流 (stream) `->` 螢幕輸出顯示,沒有一句廢話。 指令集和計算機結構這一章,兩位作者為了讓讀者更好的理解指令集 (Intel x86),別具一格的搞出了一個簡化版的 Y86 指令集,並用其表示基本的運算和控制,甚至連數位電路的 HCL 都來了一筆。資料處理流程、數位邏輯和流水線,圖示 + 詳細的講解,一目了然。 儲存架構的內容的關鍵就是 locality,只有了解電腦的梯形儲存架構,才能體會到為什麽同樣邏輯的程式會產生如此之大的性能差距,雖然電腦設計者的初衷是把記憶體儲存裝置視作一個巨型陣列。然而這個巨大的陣列的不同區段差異極大。 ## 學習方式 搭配 [15-213/18-213/15-513: Intro to Computer Systems](http://www.cs.cmu.edu/~213/schedule.html) (日前 2018 Fall) 的投影片和錄影 (YouTube 可開字幕) * [Intro to Computer Systems, Spring 2018](http://www.cs.cmu.edu/afs/cs/academic/class/15213-s18/www/schedule.html) * [Course Overview](http://www.cs.cmu.edu/afs/cs/academic/class/15213-s18/www/lectures/01-overview.pdf) * [Facebook: CS:APP Taiwan study group](https://www.facebook.com/groups/csapp.tw/) ## 搭配閱讀 * [現代處理器設計](http://hackfoldr.org/cpu/) * [你所不知道的 C 語言](http://hackfoldr.org/dykc/) * [作業系統概念](http://hackfoldr.org/oscar/) ###### tags: `cs:app`