計算機學科漫談


計算機學科漫談

 

在這篇博文里,我想和大家聊一聊自己對計算機學科的理解。當下本科階段的計算機專業教學涉及計算機學科的方方面面,分類繁雜,有時可能令新人茫然不知所措。那么,對計算機專業的學者來說,什么是最重要的呢?我相信,一千個讀者,一千個哈姆雷特,同樣的,每個計算機的學習者都有自己對專業的一番認識。如果說本科四年的計算機專業課程是對專業知識的橫向積累,那么把握計算機專業的本質的內容則需要縱向的思考。因此我個人的觀點是:對計算機系統整體概念的理解在計算機專業學習中尤其關鍵。於是我把自己對專業的理解和認識總結出來,希望對想了解這方面的讀者有所幫助,當然也歡迎大家提出自己的觀點和建議。

說起計算機,一般都會按照軟件和硬件的兩個大方向考慮。確實,如果硬件是計算機的經濟基礎,那么軟件自然就是計算機的上層建築。這里我們也按照這個分類進行討論。不過我自己插入了第三個分類——基礎學科,我們都知道計算機學科是數學學科延伸而來,數學理論在計算機學科的地位自然不用多說。

一、硬件

首先,我們談一談計算機的硬件知識。我們都知道傳統的計算機是馮·諾依曼結構的,即滿足存儲程序原理。這也恰好反應了計算機硬件的兩個最重要的方面——計算和存儲,對應硬件就是CPU和內存。CPU負責代碼的運算和控制,內存負責存儲計算機程序的數據和代碼。而計算機的其他部分,比如磁盤、鼠標、鍵盤、網卡等,統統是計算機的外設部分。

作為計算機的核心——CPU,有三個關鍵的部分:運算器、控制器和寄存器。運算器負責執行算術、邏輯等運算,是計算機計算的靈魂;控制器負責控制執行代碼指令,一般包括提取、解碼、執行、寫回四個大的步驟;而寄存器用於緩存計算數據(通用寄存器)和控制數據(指令寄存器、程序計數器)。不過這其實是對CPU的邏輯的分類,實際工作由CPU內部相應的運算電路、控制電路等集成電路完成。

計算機的核心存儲部件其實邏輯上分為兩類:內存和高速緩存。不過在物理上,目前的主流CPU一般都把高速緩存集成到CPU內部了。內存一般使用DRAM存儲部件,這類部件可集成度高,價格低廉,不過速度較慢。而高速緩存一般使用SRAM存儲部件,其特性與DRAM恰恰相反,可集成度低,價格昂貴,不過速度快於DRAM,因此用於緩存CPU和內存之間的臨時數據,增大內存數據的訪問效率。

計算機學科與以上知識相關度最高的課程分為兩大類。一類是電子技術類,另一類是組成與體系結構類。

《電路分析》是電子技術的理論基礎,它提供了電子電路特性分析的理論和方法。而和計算機相關度最高的電子技術課程便是《模電》和《數電》了。模電關心三極管的放大特性,常用於計算機外設部分的信號處理、放大電路等功能實現。而數電關心三極管的邏輯特性,是計算機二進制的基石,它提供邏輯電路、集成電路、數字邏輯等相關理論。為CPU和內存的構建提供了理論基礎。

在組成和體系結構類的課程中,《計算機組成原理》提供了CPU、內存、IO等計算機子系統的構造原理,尤其是指令系統,是對計算機底層硬件的第一次抽象,也是軟件訪問計算機硬件的根基。《計算機體系結構》和組成原理的描述角度截然不同,如果說組成原理着重講述計算機的每個細節,那么體系結構則是從宏觀的角度描述計算機的設計和架構。不過它們和計算機的硬件內容貼合緊密,比如指令流水等內容涉及到CPU具體功能部件的設計,因此這里把它們歸為一類。

以上便是本科計算機課程內和計算機硬件相關的課程,不知大家是否和我有同感,本科計算機課程中硬件部分的內容只是占據了整個專業課程的小部分,更多的空間留給了軟件部分(當然,這和不同高校的教學計划相關)。

二、軟件

對於計算機的軟件方向,我們從三個角度來談:底層、系統和應用。

軟件底層方向主要介紹對計算機硬件的直接操縱,前邊提到,指令系統是對計算機硬件的第一次抽象。因此底層編程便是利用這層抽象,間接控制計算機的工作,其中最重要的便是匯編語言。

在《匯編語言》課程內,一般都會把匯編描述為計算機指令的助記符。事實上我們也能發現這層關系,比如匯編語言最關鍵的兩個方面:指令和寄存器就是對CPU內部結構的直接抽象。匯編指令中的算術運算指令和邏輯運算指令的內容,對應着CPU的運算電路的功能,而整個匯編指令的解釋執行都是由CPU的控制電路完成。同樣的,CPU內的大部分寄存器都可以在匯編語言中直接訪問,內存的數據以內存地址訪問的形式表示在匯編語言內部。

如果說匯編為計算機硬件提供了抽象層次的通用訪問,那么《接口技術》課程將重點放在如何使用匯編對計算機的外設進行細節的訪問,它給出了如何控制外設的具體信息和方法。

而真正全面利用匯編知識對計算機訪問的內容在《單片機原理》課程中體現的更明確。雖然單片機只是一個微型的計算機系統,但正是“麻雀雖小,五臟俱全”,使用單片機提供的匯編語言控制單片機的工作不僅要考慮單片機的核心芯片的設計結構和接口資源,還要考慮單片機的外接設備的控制和訪問細節。

雖然以上三門課程提供的內容基本上可以對計算機進行低層級的全面控制,但是事實人們的要求遠不止於此。由於原始的匯編編程很難滿足對計算機的資源進行動態調度,充分發揮計算機的性能。比如內存的動態申請與釋放,比如IO任務等待時,讓CPU去計算其他的任務等。這些需求需要人們提供一個負責資源管理的程序幫助完成,這便產生了操作系統。另外,當面臨大量的匯編語言編程工作時,人們需要更高效的方式去和計算機交互,這樣高級語言便誕生了。而把高級語言翻譯為底層匯編的任務就落在了編譯器的身上。

《操作系統原理》課程詳細描述了操作系統對CPU、內存、設備、磁盤的管理細節,而將這些理論只是付諸實踐,便有了更多的相關課程。《Windows編程》、《Linux環境編程》等類似的課程提供了熟悉操作系統原理和操作系統API(系統調用)的手段,《嵌入式》的課程將這種鍛煉更近一步,通過交叉編譯、內核裁剪的學習對操作系統的內核的細節了解得更加透徹。而真正清晰了解操作系統的細節則是通過《內核源碼分析》這樣的課程完成的,通過對內核源碼的解讀,以開發者的角度去學習操作系統。另外,關於操作系統的安全的《計算機安全》課程又從另一種非常規的思維模式去控制操作系統,間接地操作操縱硬件,繼而操縱計算機。而從學習病毒、木馬、蠕蟲、漏洞等知識的學習中反過來進一步加深了對操作系統的了解。

《編譯原理》課程從另一個角度描述計算機的控制——編程語言。相比於操作系統作為計算機管理程序的形態,編譯器則是作為轉換程序的形態出現。雖然真正在計算機上執行的是應用程序提供的控制邏輯,但是操作系統是把計算機的資源充分地利用去完成既定的控制邏輯,而編譯器則是將應用程序提供的控制邏輯更好的轉換到計算機底層,這包括代碼的翻譯和優化。代碼的翻譯並非像匯編語言那樣是一個簡單的直接映射,隨着高級語言的復雜度的變化,編譯器的分析工作難度也會不同,而《形式語言與自動機》提供了代碼分析的理論基礎。

如前所述,操作系統和編譯器並非計算機真正的工作內容。真正使用計算機服務於人們的是應用程序提供的功能,是應用程序發揮了計算機的價值。不過應用程序是建立在操作系統之上的,因為操作系統是對計算機系統的抽象。

我把計算機關於計算機應用的課程划分以上六個方面(極可能不完全,歡迎補充建議),我們先從計算機應用最核心的工具開始——編程語言。

每個人都學習了各種各樣的編程語言,每個人擅長的編程語言可能也不盡相同。我是C++的愛好者,因此用C++作為討論的例子。C++是一個多范式的編程語言,面向過程、基於對象、面向對象、泛型編程、函數式編程等等。每種編程都有自己的特點和優勢,不過每個學習編程語言的人都有自己的選擇和愛好。《C++程序設計》應該是計算機學科的必修課了,不過只要談到編程語言,就甩不掉《數據結構》和《算法》。不同的編程語言對數據結構和算法的支持庫不盡相同,這些都是編程語言的基石。無論是非可視化編程,還是可視化編程(MFCQT),都離不開數據結構和算法的支持。Java作為目前另一主流的(目前使用最廣泛的)編程語言,也有同樣的特征。不論是《Java程序設計》學習的基本的Java桌面編程,還是提供更多學習空間的《Java Web程序設計》。從JavaSEJavaEESSHAndroidHadoop,都能看到編程語言構造的千變萬化的應用程序。

計算機圖形是計算機程序可視化的核心。《計算機圖形學》描述了基本圖形的顯示和變換算法,三維環境的構造方法,包括相機、光找、陰影、紋理、貼圖、粒子系統等等。而《計算機圖形圖像處理》更偏重於圖像的采集和處理,《多媒體技術》也是類似。它們都是特定領域的應用,運用了大量的數學理論基礎,也正是它們,讓計算機的世界變得色彩斑斕。

數據處理方向課程是計算機背后的無名功臣,無論是老生常談的《人工智能》、《數據倉庫》、《數據挖掘》,還是目前大放光彩的《機器學習》、《大數據處理》,我們在屏幕上無法直接看到這些課程的身影。然而這些課程描述了計算機如何思考問題,如何更好更快地處理計算機的數據,滿足人們的實際需要。這些課程背后,仍是靠數學理論和信息理論作為強力支撐的。

不管實現什么樣的應用程序,當軟件達到足夠大規模時,軟件設計的理論支持就顯得愈來愈重要。《軟件工程》提供了軟件開發流程的模型和相關理論,《面向對象方法學》更是專注於面向對象設計領域。學生時代覺得這些理論過於遙不可及,只有經過大型多人合作項目的歷練,才能深刻理解前人留下的這些珍貴的經驗財富。

這里把《計算機網絡》划分為軟件應用其實稍有不妥。計算機網絡是多個計算機的互聯集合,它擁有自身的硬件和軟件。不過我們從操作系統的支持角度來看的話,計算機網絡的協議和通信都是建立在系統之上的。這其實並不重要,重要的是計算機網絡改變了計算機的世界,將原本孤立的計算機聯系起來,形成了一個新的計算機世界——網絡環境。《TCP/IP協議分析》詳盡描述了計算機網絡原理實現的細節,《思科網絡技術》讓我們學習到如何控制計算機里的每個設備,從獨立的計算機到網關,從局域網到Internet

當然,說起計算機網絡,就無法不談起網絡編程,而這些網絡編程的接口是由操作系統提供的。網絡協議本身就是一個規模巨大的算法,它是有成千上萬的程序分布式構成的。既然是程序就避免不了缺陷和bug,這就為網絡安全埋下了“禍根”。如何利用系統提供的功能和已有的計算機應用、策略防范網絡安全威脅也成了人們研究的話題。

《數據庫》學科的誕生也是來源於人們的實際需求。當然機械的信息檢索無法滿足實際需的要時,人們想到使用更好的數據結構存儲、組織數據。針對磁盤數據的管理,當文件系統已經不能滿足頻繁快速查詢的需求時,數據庫的數據管理方式則變得尤其重要。數據庫學科描述了數據的關系模型,結構化查詢語言SQL,以及在和應用程序結合時如何設計數據庫的方法。傳統數據庫是建立在操作系統的文件系統之上的,當然這里不考慮內存數據庫的形式,它們都有自身特點的內部實現形式,比如B+樹等。數據庫種類繁多,有滿足中小型應用的SQL Server,有滿足大型應用的Oracle,有開源的MySQL,也有在Android移動設備上的SQLite。另外,數據庫也是傳統的數據挖掘、機器學習、人工智能算法的數據來源。

通過對不同計算機應用學科的學習,處理掌握不同學科自身領域的知識、理論、算法外,同樣能加深對計算機系統的理解。比如一個應用如何設計、如何提供用戶接口、如何轉化為機器語言、如何運行在計算機硬件上,直到應用運行時改變的計算機硬件的每一個門電路的狀態等。

三、基礎學科

我們常常在學習專業知識的時候,忽略非專業領域學科的重要性。飲水思源,若非基礎學科強大的基礎能力,是無法構建計算機世界的千姿百態的。

前邊提到,計算機是數學的延伸。數學理論構建了計算機學科的基石。《高等數學》的重要性不必多說,微積分、無窮級數、傅里葉變換等內容在計算機硬件電路設計、圖像處理算法、關系理論等領域隨處可見。《離散數學》的圖論、數理邏輯理論更是體現在計算機的各個方面,無論是硬件邏輯門設計、算法的NP問題還是操作系統任務調度、編譯優化等,都提供了理論支持。《線性代數》在圖形學的表現尤為突出,比如圖形的變換矩陣、三維世界的模擬等。《計算方法》是工程數學,計算機程序的科學計算、線性方程組求解、程序庫設計等都有它的身影。《概率論與數理統計》的內容也應用到計算機隨機數算法、動態規划算法的移步轉移方程、樣本分類等領域。最后需要提及的一個非數學學科《唯物主義與辯證法》的重要性,辯證法內提及的事物之間的聯系和矛盾的對立統一性等思想在軟件設計領域、操作系統設計、計算機體系結構設計領域都有體現。

正所謂“磨刀不誤砍柴工”,將學科的基礎打扎實,其實能幫助我們更好地學習專業的理論,加深對專業學科本質的理解。

四、總結

綜上所述,我們從計算機硬件組成的基本細節,逐漸向上擴展,了解了計算機硬件的抽象,繼而了解如何利用這層抽象直接操縱計算機。然后根據計算機發展的需要,引出操作系統和編譯器的在計算機內的地位,並認識到操作系是計算機的資源管理者,而編譯器是高級語言與計算機硬件的傳遞者。接着我們描述了每個應用學科涉及的理論和內容,並泛談了一下它們和計算機系統的關系。最后,我們將基礎學科在計算機系統中的地位重新審視了一番,重申了基礎學科的重要性。相信通過以上的描述,或許我們對計算機專業有了一個別樣的認識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM