計算機專業的課程可以用抽象來解釋:每一門課想做的事就是利用下層提供的介面,實現功能,然後再給上層提供介面。這樣一層一層的抽象就構成了所有的專業課。
舉乙個例子來說明這個從上往下的層級抽象是如何組織的。
先來看最高層,問題。剛學程式設計的時候,會先學一門課導論課或者程式設計入門課,我當時的入門課叫做「程式設計」,課程內容是介紹一些問題,然後介紹一點程式語言的知識,作業是一些程式設計問題,比如八皇后、素性測試之類的比較常規的程式設計題。這門課的目的一般都是介紹「問題」的,介紹電腦科學有哪些有挑戰的問題,讓學生對計算機專業有乙個感性的認識,而不是對特定程式語言或者演算法的學習,所以這類課程一般用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電晶體構成,而與門可以通過連線乙個與非門和非門構成,或門可以通過連線乙個或非門和非門構成。很多同學都覺得模電對於計算機的同學不必要學,而我認為相反,它是你構建整個計算機抽象層級的基石。
2019計算機課程第III課程 專案1
hey,我們已經學習了很多的python程式基礎了,現在是時候表演真正的技術!本專案如果你認真審題,不偷懶,保準10分鐘搞定!本專案如果你認真審題,不偷懶,保準10分鐘搞定!本專案如果你認真審題,不偷懶,保準10分鐘搞定!這是乙個小小的遊戲,我將它稱為 猜對算你厲害 叫什麼不重要哦。在這個遊戲中我們...
計算機課程設計題目求大神解答
題目 公司員工資訊管理系統設計 1 問題描述某公司需要儲存雇員的編號 姓名 性別 所在部門,級別,並進行工資的計算。其中,雇員分為經理 技術人員 銷售人員和銷售經理,設計一程式能夠對公司人員進行管理。2 功能要求 1 新增功能 程式能夠任意新增上述四類人員的記錄,可提供選擇介面供使用者選擇所要新增的...
2018 5 7 計算機課作業
1 按金字塔形狀列印楊輝三角形。include int main data i j 1 for i 0 i count line i for j 0 j i j putchar n return 0 2 輸入乙個字串形式的數字,將其轉化為數值輸出 如輸入字串 123 輸出數字123,僅考慮無符號整數...