先上地址:
(兩個鏈接是同一門課, Introduction to Computing Systems (計算機系統導論), B站體驗較好)
Bilibili:Introduction to Computing Systems
Youku: Introduction to Computing Systems
白髮長髯,氣定神閑.渾厚内力,登峰造極.一眼望去,便知該人不是等閑之輩. 如果CS也有江湖,他則是當之無愧的祖師: Yale Patt
Yale Patt, 1939年出生,斯坦福大學電子工程博士, IEEE和ACM的雙料fellow,美國國家工程院院士,在微處理器體系結構上有著卓越貢獻.1965年,他便首次引入了複雜邏輯門電路在硅片上的實現方法:WOS module. 他也是Introduction to Computing Systems: From Bits and Gates to C and Beyond一書的作者.
大佬2011年的時候,竟然跑去中科大,開了一門正兒八經的計算機系統導論課,更爲神奇的是,有人把上課的視頻幾乎全部上傳到了網絡上(全部有24個視頻),簡直是造福人類,1024! 這是該課開設的背景. Yale上課從不帶講義,所有知識全部手寫,再複雜的數字電路圖,體系結構圖,一律粉筆作畫.開課時已73嵗高齡,思路卻異常清晰,計算機知識如同硬編碼在他的腦中.Yale能以大量的生活實例解釋複雜的抽象概念,娓娓道來,如數家珍. 在我看完若干課之後,對其在教育上的執著和投入,敬佩萬分.
很多人一談到計算機體系結構,便想到CSAPP(深入理解計算機系統),其實Yale寫的Introdution to computer systems評價也頗高. 從其副標題(From Bits and Gates to C and Beyond),便可以看出一些端倪, 這本書從bits和門電路開始講起,通過層層像上抽象,一直講到高級語言, 最後甚至還提到了遞歸和數據結構. 雖然計算機的應用領域日新月異,但是這些在表層技術背後的底層知識,卻穩固不變.該書從99年出版至今,長盛不衰.
網上的這門課便是Yale親自操刀,以他的這本書為綱要來授課. 國内的傳統CS教育,并沒有這樣一門課.它不是數字邏輯,不是組成原理,不是體系結構,不是匯編語言,不是編譯原理,也不是高級語言編程,但是它卻把所有的這些知識都串聯起來了,以一種自底層逐層向上的方式,搭建出一個麻雀雖小五臟俱全的計算機系統的模型. 對,正如這本書的名字,它教的是Computer System.
抽象的核心之一便是提取和隱藏,把共性的内容提取出來,封裝入盒,成爲組件,那些具體的實現細節便被隱藏了起來.從此以後,便可以只關心對外的接口,而不用再計較内部的具體實現. 舉個例子(基本順著課本的邏輯, 開始例子之前,先用The Elements of Computing Systems的圖鎮樓):
- 一樓:Transistors level
不同的晶體管組合,可以實現不同的門電路功能,但是如果每次都把晶體管的具體實現表示出來,未免包含太多細節. 容易讓人迷失在樹叢中,而看不到森林. 畢竟,在門電路層,我們只關心輸入和輸出值,比如AND門的作用,只有儅兩個輸入同爲1時,輸出1,其餘情況則輸出0. (Yale稱之爲All gate)
由晶體管實現的不同門電路模型圖
- 二樓: Gates and logic circuit level
Gates層把具體的transistor的細節都隱藏起來了,每一種gate的功能只用一個符號來表示,不用再拘泥于内部晶體管的實現方法上.從另一個角度看, Gates層并不關心它的功能是如何被實現的,甚至未來都可以不用晶體管來實現它的功能,它一樣還是Gate,它的屬性,或者説特性是由它的輸入和輸出來實現的.
7種不同的門電路模型
有了這一步的抽象, 我們就可以通過gate的不同組合來做更複雜的事情了,比如設計出memory, decoder, multiplexer,加法器,比較器等不同的功能. 下圖是SR NAND latch,可以實現存儲的功能. (Sequential Logic)
A gated D latch based on an SR NAND latch (memory)
更多例子:SMALL LOGIC GATES — THE BUILDING BLOCKS OF VERSATILE DIGITAL CIRCUITS - PART 1
下圖是decoder和multiplexer (Combinational Logic), a decoder的作用是解碼並選擇(n個輸入有2n種組合,通過n個輸入所代表的值,來選出其2n種組合中的一種,可用於找到具體内存的位置.), a multiplexer(數據選擇器)的作用是,用選擇端n根綫,選出2n種輸入中的一種. Decoder和Mux的差異在於, Decoder是以輸入端來選擇(決定)輸出端中的一個, Mux是以額外的"選擇端",來選擇輸入端中的一個,他們的共性是最終都是一個被選擇出.
多路選擇器和解碼器
加法器
- 三樓: von Neumann Model level
有了這些有各種門電路搭建出來的具有特定功能(如寄存器,解碼器,選擇器,加法器,1位比較器)的組件,我們就可以進一步地向上層抽象. 就拿之前的Decoder和Multiplexer來説,我們現在只用關心他們的功能,也就是輸入是什麽,輸出是什麽,不再關心它們内部是由哪些門電路所組成的,於是就相當於將内部的邏輯封裝到不透明的盒子裏,只保留它們留給外界的接口.
封裝后的decode和MUX
於是,我們可以用這些具有特定功能的組件,像搭積木一樣,搭出一個von Neumann機的模型(這裏有一個simple cpu的例子):
下圖是課本上引入的一個例子,有了計算機的抽象模型之後,我們可以把關注點進一步轉移到組件之間的交互上去,這也是進入下一個抽象階段的前奏.這個LC-3模型的指令週期擁有6大phase:1.FETCH
LC-3模型
2.DECODE
3.EVALUATE ADDRESS
4.FETCH OPERANDS
5.EXECUTE
6.STORE RESULT
- 四樓: hardware and software interface level
隨著樓層慢慢變高,我們開始走到了硬件和軟件的分水嶺, 從Microarchitecture, 上升到指令集ISA, 硬件層便接近終點, ISA可以看作是軟件和硬件進行通信的協議, 具體軟硬件之間的通信(對話), 則是由machine code完成. 機器碼可以看作是軟硬件之間的翻譯官, 把我們的操作意圖, 翻譯為硬件的物理行爲.
下面是一個具體的例子,指令集也可以理解成軟件和硬件之間進行溝通的暗(黑)號(話). 值得注意的是, 計算機本身是不能理解0和1的,機器碼本質上表示的是高低電平
下圖是現實生活中的8086和ARM的指令集
一個更爲精簡的例子 (Scott CPU)
- 五樓: Assemble language level
由於machine code比較反人類, 沒有地球人願意用機器碼來寫程序. 所以我們需要一個在machine code和人類之間的橋梁來幫助我們更上一層樓(前一層是硬件和軟件的橋梁), assemble language通過assembler和binary code對應.
- 六樓: Virtual machine level
由於匯編語言是和硬件密切相關的,所以不同的硬件架構,會相應得有不同的匯編語言, "懶惰"的計算機科學家不想重複無意義的勞動, 他們希望有一種通用的,與平臺無關的虛擬機指令集,由這個虛擬機指令集作爲通訊員,讓它逐一和不同的硬件平臺進行通信,而我們人類只需要負責學會這個虛擬平臺的溝通語言即可. The Java Virtual Machine Instruction Set 便是一例.
- 七樓: Compiler and high-level language level
匯編語言對人類而言還是太麻煩了,我們想要再往上抽象一層,以符合人類的思維習慣(當然不太可能完全變成自然語言,因爲自然語言本身有歧義性,無法像高級語言那般精確地描述出一個算法),於是人們設計出各種更人性化的高級語言,比如C, C++, Java, Python等, 但是機器終究是一堆硬件, 它們只能看懂機器碼. 匯編語言能夠通過Assembler轉變爲機器語言,那麽高級語言和機器語言之間也需要一個橋梁,這個橋梁就是compiler. (compiler是如何工作的?)
整個抽象過程至此差不多就完整了,至此,我們從晶體管開始(晶體管層往地下室走,是固態物理層,再往下是量子物理,再往下..)逐層朝上走,通過不斷封裝和抽象, 構建出一個計算機系統. 下圖是對這些層次的另一種表述.
總結
國外的計算機專業往往會在第一年開設這樣一門幫助學生瞭解計算機系統的課程, 有兩種切入方法, 一種是自上而下, 也就是從高級編程語言開始講起, 一點點往下走, 這種切入方法屬於programmers' perspective, 還有一種方法便是從下往上走, 從硬件開始一點點往上, 最終讓你看到整個計算機系統的結構.
如果讓我來設計這樣一門課程的話,我會綜合這兩種方法,分成三個階段,第一個階段是從下往上走,從transistors一直到馮諾依曼模型, 然後第一階段結束; 第二階段是從上往下走, 從算法, 到高級語言, 然後到編譯器和匯編; 第三階段是這兩個階段的交接層: 指令集, 操作系統, 硬件調度等, 重點看清如何通過第二階段生成的匯編指令,去控制第一階段用晶體管搭建出來的系統的不同組件.
我認爲對學習計算機的人而言,對整個計算機系統有一個整體的認識非常重要. 按照國内的傳統教法, 就好比你去飯店點個菜, 然後厨師把你拉去後厨培訓3年, 教你八大菜系的各種手藝, 然後再給你上那道菜. 等你那時候再吃,八成是要吐的,而且很可能一門手藝也沒學精通. 計算機最好的學法還是動手娛樂,帶著好奇心去探索未知. 如果有這樣一門導論課程, 前期可以建立大局觀,後期分門別類學習各種專業知識的時候能夠知道每一門課所在的位置. 就像是畫畫, 一開始先勾勒出輪廓,而後慢慢再細化和填充,這樣的模式是更爲科學的.
网友评论