1. 程式人生 > >對計算機的認識與感想

對計算機的認識與感想

對計算機的認識與感想

         我們在大學中學了很多門課程,但是這門課程到底有什麼有,以後的工作中絕大部分基本也用不到,我們為什麼要學。這篇文章想將我學過的知識串起來,雖然都很基礎,但是希望能給讀者一點啟發。

        現代社會幾乎離不開手機電腦,但是手機電腦軟體能為我們提供豐富多彩生活的基礎是什麼呢?計算機是如何執行起來的?我們能從中得到什麼啟示?

        我們都知道現代計算機都是基於半導體,往往用晶片中電晶體的數量作為CPU效能的指標之一,為什麼呢?為什麼是基於半導體,這得從半導體的特性說起。

        半導體是指常溫下導電性介於導體和絕緣體之間的材料,矽和鍺是最常用的半導體元素。在矽晶體中慘入少量雜質磷元素,磷原子外的五個外層電子的其中四個與周的半體原子形成共價,多出的一個子幾乎不受束較為容易地成自由。稱N型半體。在矽中慘入少量雜質硼元素,由於半體原子(如矽原子)被雜質原子取代,硼原子外的三個外層電子與周的半體原子形成共價候,會生一個空穴個空穴可能吸引束縛電子來填充,使得硼原子成為帶負電離子。稱P型半體。在一完整的矽片上,用不同的摻雜使其一形成N型半,另一形成

P型半,我稱兩種半體的交介面附近的區域PN(摘自百度百科,不清楚的自補)。PN具有單向導電性,這是積體電路最重要的基本原理。一個PN結可以組成二極體,如我們常見的發光二極體也是二極體,單向導通發光的。兩個PN接面則可以形成一個三極體(也叫電晶體)。

        PN接面可以組成二極體和三極體,二極體的用處很大,例如穩壓電源離不開二極體;三極體具有放大、飽和、截止三種工作狀態,我們現代3、4G、wifi的無線電訊號,能夠在手機中得以接收使用,離不開三極體對訊號的放大作用,因為空氣中的磁場是極其微弱的,手機接收到的原始感應電流也是極其微弱的,訊號不進行放大則無法處理,當然訊號不能無限制放大,因為放大後訊號易失真。三極體的另外兩種狀態飽和、截止,則可對應到布林邏輯中的1和0,將物理現象和數學對應起來是一大創舉,數學是可以建模和理論分析的

!既然一個三極體可以產生1和0兩種狀態,理論上如果是8個三極體不就可以表示8個1和0狀態了,可以對應8個位,一個位元組。這樣就將物理與計算機中的位元組的概念聯絡起來了。

        以上都是電子技術中的基本概念,相信對於學過類比電子技術這門課的大一學生都不難。這裡有兩個問題:

      (1)、三極體只能產生飽和或截止兩種狀態,但是這個狀態只能在當時知道,無法知道之前是什麼狀態,即之前資訊如何記憶儲存的?

      (2)、計算機為什麼要基於0、1的二進位制模式,基於六進位制或十進位制行不行?

        第一個問題不難回答,類比電子技術之後的數位電子技術課程就可以解釋狀態如何儲存的,類比電子器件搭建的各種觸發器就可以解決這個問題。

        另外一個問題,計算機基於十進位制行不行?從數學和理論上來說,實現多少進位制的電路都沒問題,例如三極體的飽和與截止可以對應1和0,如果將5V電壓定義為數字5,4V對應數字4,依次類推,0V對應數字0,這樣不就組成了六進位制電路嗎,表示的狀態與計算的效率不比二進位制高很多嗎為什麼沒有出現六進位制電路呢要解釋這個問題,一句話可以解釋“理想很豐滿,現實很骨感”。5V對應5,那4.5V對應幾,4.4V呢?這裡涉及到電路穩定的問題,以5V的微控制器為例,並不是只有0V才對應0,或者是以5/2為分界線對應1和0,其中涉及到一個概念就是判別電路。需要判斷輸入的訊號到底是0還是1,如果5V的電路設計為二進位制,兩種狀態判別起來相對容易,出差錯少,但是用5V電路設計為6進位制,6種狀態,參與判別的時候,稍有干擾就有可能判斷錯誤,導致整個電路訊號出錯,穩定性沒有二進位制好,而且電路複雜性及成本遠遠高於二進位制。有人可能會說,我把電壓提高啊,之前是5V/2,我要達到相同判別水平,設計成5V/2*6=15V的六進位制,不就和5V的二進位制電路抗干擾效果一樣了嗎。首選六進位制電路肯定比二進位制複雜很多,其次電壓越高功耗越大,你不想你的手機燙手,每天衝10+次電吧;當然也不是電壓越低越好,太低了,功耗是下降了,效能也會下降,抗干擾能力下降,所有基本單元還是越簡單越好。任何事物都不是絕對的,好壞之間此消彼長,肯定有一個平衡點

        電路狀態可以用0、1表示,8位二進位制的ASCII可以表示0-9及大小寫各26個英文字母和常用符號,通過ASCII就可以表示我們日常需要的所有資訊了,這裡將物理與半導體器件聯絡,半導體器件與二進位制0、1聯絡,二進位制0、1編碼與數學聯絡,轉化為理論之後與世間萬物資訊聯絡。由具體到抽象再具體,將自然現象提煉為知識,再轉化為技術,服務於社會。數學有用還是沒用?

        上面粗略的解釋了物理數學與資訊表示的關係,那麼資訊是如何處理的呢?我們可以將資訊轉為為0、1數字,即將資訊與數學聯絡上了,利用數學理論可以處理資訊。通過類比電子技術,可以設計出加法電路,通過類比電路封裝之後的數位電路可以設計出移位電路。有加法電路和移位電路就可以進行數學計算處理資訊了。這裡只是淺顯的一筆帶過,沒有深入介紹,因為每一個部分都是一門學問,詳情見《類比電子技術》《數位電子技術》《資訊理論與編碼》《微機原理》,這裡的淺顯介紹只是將知識串起來,跳出某一門具體的課程看待問題。

        另一個問題,計算機組成之後是如何工作的,如何實現現在的強大功能。早期的計算機只能進行簡單的基本執行,並不能像現在這樣處理複雜資訊,聊天看新聞。上面說到計算機電路處理的是0、1訊號,如果我們將各種0、1組合成各種有實際意義的符號,不就可以指示計算機幫我們幹活了嗎,例如將0110 11010011 0111(隨便寫的編碼,僅做示例)表示為“+”,我們就可以進行加法運算了,但是記這些0、1字串會很吃力,特別是隨著運算複雜後,需要記憶的東西太多了,離我們的實際理解也很遠。為解決0、1字串與我們常用的理解語言相差太遠,不便於表示與記憶的問題,人們發明了組合語言。組合語言的發明就是為了解決符號表示與記憶的問題,例如使用add符號表示加法字串0110 1101 0011 0111,彙編編譯器編譯之後自動將add符號替換為計算機能識別的0、1字串。而我們記憶add比記憶字串更容易,也方便交流。這裡體現一種思想,就是對映,將複雜枯燥的東西,轉化為簡單易於人類識別的東西,我們只負責抽象複雜的事,簡單具體的機械性事務就交給機器自動處理。未來社會,很具體機械性的工作肯定會被機器取代,人們介入的只是抽象複雜機器無法認知的問題。搶票外掛就是很好的例子。

        組合語言雖然比機器碼方便很多,但是有個問題是,需要程式設計師非常熟悉計算機結構,而且組合語言跟具體的機器相關,程式碼不好複用移植。為了解決程式碼移植複用的問題,也就是常說的跨平臺,大神們發明了C語言,它是一種通用的計算機語言,任何計算機都可以用C語言執行,只需要更改與機器相關的少部分程式碼就可以將程式移植到其他機器上。但是C語言還是比較底層,還離我們所認知的現象比較遠,人們在C語言的基礎上發明了C++和Java等面向物件的語言,其封裝、繼承、多型的特性很好的與現實現象中的整體性、遺傳性、和多樣性相聯絡,使之更表示更復雜的情景。複雜的計算機軟體都是基於面向物件的語言設計的,C語言則主要負責底層的硬體驅動和作業系統部分(當然這才是計算機的基石,核心技術之一)。隨著問題的複雜化,為了解決計算機資源分配與管理的問題,發明了作業系統;為了將孤立的機器相互聯絡起來,發明了計算機網路,才有今天的網際網路。這裡體現一種思想,高生產力的表現一定是,分工細化,萬物相連

        這裡還有個現象,計算機隨時都要處理大量是資料,甚至滿載CPU為什麼還是能夠井然有序高效執行?這裡的思想是,共同遵守規範和協議,不搞特殊才是有效的方法。即使不得已搞特殊(計算機中斷程式),也要速戰速決,儘可能減小影響。如果我們所有人都能守交規,交通阻塞問題會好很多,那時的瓶頸不在於CPU和匯流排,而在於機械硬碟(收費站)了。

        我們應該認識到《類比電路》、《數位電路》、《高頻電路》、《同學額原理》、《資訊理論與編碼》對應電子、通訊、自動化專業;《計算機組成原理》、《作業系統》、《計算機網路》、《資料結構》對於計算機專業的重要性了,因為這些課程是你日後工作發力的基石。這些是精華是武學中的內功心法,什麼web前端開發、iOS/android客戶端開發、java/php後臺開發都是具體的招式,內功紮實了,不怕招式學不好,如果內功不紮實,招式玩得再溜,換個語言或平臺你就一面懵逼了,因為沒有掌握事情的本質,知其然不知所以然,專業基礎才是你的核心競爭力所在,以不變應萬變。與君共勉!