利用抽象解釋計算機課程

計算機專業的課程可以用抽象來解釋:每一門課想做的事就是利用下層提供的接口,實現功能,然後再給上層提供接口。這樣一層一層的抽象就構成了所有的專業課。
舉一個例子來說明這個從上往下的層級抽象是如何組織的。

先來看最高層,問題。剛學編程的時候,會先學一門課導論課或者編程入門課,我當時的入門課叫做“程序設計”,課程內容是介紹一些問題,然後介紹一點編程語言的知識,作業是一些編程問題,比如八皇后、素性測試之類的比較常規的編程題。這門課的目的一般都是介紹“問題”的,介紹計算機科學有哪些有挑戰的問題,讓學生對計算機專業有一個感性的認識,而不是對特定編程語言或者算法的學習,所以這類課程一般用python來編程。

再往下一層,算法和數據結構。這一層的目的是學習/實現各種算法/數據結構,提供給上層功能。比如排序,問題解決者只要知道這裏應該用快速排序,而不是選擇排序,而把快速排序的實現留給這一層的開發者,從而使各種優化都可以對上層透明,比如小數組變插入排序、中位數取pivot、三向快速排序等,這些優化調用者完全不必要知道,他只需要知道:哇,這個庫提供的快速排序還真快。

再往下一層,語言層,畢竟所有算法都要由某一門語言來實現。這一層的存在使得算法的設計可以脫離具體的語言。不同語言又提供了不同的抽象,像函數式語言就比命令式語言的抽象級高,更高的抽象級意味着更加專注問題本身(不需要考慮內存佈局、CPU使用等)以及更少的代碼量。

再往下一層,編譯器/解釋器。我們編寫代碼是用高級語言,而cpu上執行的是機器碼,所以這個抽象層幫我們做了這個轉化。這個抽象層的好處是,高級代碼的編寫者完全不需要知道這個程序所運行的操作系統和硬件平臺,任何有該語言編譯器/解釋器的機器,程序都可以跑(從而實現了跨平臺)。應用層開發者可以不用知道這個由高級語言到機器碼的轉化具體是怎麼實現的,畢竟編譯器優化的編寫和優化完全是一個團隊的工作量,開發者關注問題的解決,編譯器負責轉化出高效的機器碼,各幹各的,這正是抽象的重點。

再往下一層,操作系統。OS向開發者抽象了硬件(CPU、內存、Disk、NIC等),並且以syscall的形式向用戶提供服務。OS的設計是最能體現抽象的,虛擬內存和進程讓程序以爲自己獨佔着內存和CPU,同時隔離了不同進程以防惡意進程;文件系統讓用戶可以方便地讀取存儲數據,而不需要直接操作底層的硬盤;文件描述符抽象了底層的設備(pipe/file/device/socket/…)。

再往下一層,ISA(Instruction set architecture),俗稱軟件與硬件的接口。這個俗稱是非常形象的。指令集架構,說得簡單點就是機器碼,也可以理解爲一個協議。ISA標準制定者指定一套指令集(比如x86、PowerPC、SPARC),然後編譯器開發者需要根據這個標準/協議來編寫對應的編譯器;CPU製造商需要根據這個標準/協議來製造出支持這套ISA的CPU(比如intel的CPU支持x86/x86_64)。也就是說,軟件/硬件都依照這個ISA來設計,那麼就可以對接了。

再往下一層,組成原理和體系結構。這一層要做的事情是藉助數字電路給它提供的功能(組合電路和鎖存器),來設計一個能實現某種ISA的CPU,讓編譯器生成的指令可以在此CPU上運行。大學裏一般會開一門叫“計算機組成原理”的課,一開始學單週期CPU的實現(取指、譯碼、執行……),爲了提高效率又提出了流水線的實現。爲了發掘更高的效率,之後又會學一門叫“計算機體系結構”的課,這門課的目的是爲了發掘更高的並行,從而製造出更快的CPU。那這一層是如何用數字電路提供的功能?舉兩個典型例子:一、CPU爲了做計算會有ALU模塊,而ALU模塊正是一個組合電路(輸入確定那麼輸出確定);二、在流水線寄存器中每一個時鐘上升沿都會保存輸入的值,在這個時鐘週期內組合電路會根據這個新值計算出結果傳輸到下一級流水線寄存器的輸入,等待下一個時鐘上升沿的到來,這裏的流水線寄存器正是某種鎖存器的實現,而CPU開發者並不需要這個數字電路模塊是怎麼實現。

再往下一層,數字電路。這門課的目的是教學生如何利用基本的門電路(與非或門)來實現一些高級的功能(譯碼器、多路複用器、鎖存器、時序電路……),然後給上層提供功能。上數字電路課是一個用磚搭房子的過程,由基本的門電路開始,慢慢構造出複雜的電路。數字電路不需要關心基本的門電路是如何實現的,因爲這正是模擬電路向上層提供的功能。

再往下一層,模擬電路。這一層實現了與或非等基本門電路。比如非門、與非門、或非門都可以通過若干個p/n型MOS晶體管構成,而與門可以通過連接一個與非門和非門構成,或門可以通過連接一個或非門和非門構成。很多同學都覺得模電對於計算機的同學不必要學,而我認爲相反,它是你構建整個計算機抽象層級的基石。

再往下一層,就不是計算機領域研究的事了。
當然,還有很多專業課我並沒有提及,比如網絡,它是OS提供的功能,以文件描述符的形式提供給用戶使用;在網絡協議棧實現的細節裏,又分了好幾層抽象,這就是我們熟知的OSI七層網絡模型(有時候被抽象爲五層:Application、Transport、Network、DataLink、Physical)。各位可以自己回憶一下大學裏上過哪些專業課,以及它應該放在抽象的哪一層上。
仔細一想會發現,幾乎所有的技術書籍都嘗試在解決某一層上的問題,利用下層提供的抽象,然後向上層提供功能。
讓我們脫離計算機領域,再往高一點看,會發現整個計算機領域就是在爲別的領域提供功能、並隱藏了細節:醫療、交通、餐飲、支付……
抽象,讓生活變得更簡單了一點。
轉載自:抽象與計算機課程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章