1.1.1 換個角度看計算機
之所以要探究計算機系統的內部結構和工作原理,是為了能夠準確地把握代碼指令的傳遞和處理流程,找出限制和降低程序運行效率的關鍵點所在,從而讓程序員能夠跟隨計算機一同思考,并編寫出高效、可靠的代碼。要了解計算機系統的內部結構和工作原理并不容易,它至少涉及三門獨立的科目:計算機組成原理、計算機操作系統和編譯原理。這些都是計算機專業(yè)的學生必修的主要課程。但即使將它們逐個學完,若不能加以貫穿和聯系,那么一個系統化的知識框架就沒辦法成功地搭建起來,于是學習成果和功效就會被打折!從程序設計和代碼編寫的角度將上述知識有機地串接起來是一個不錯的主意。
作為一個程序員或者開發(fā)人員來說,完全掌握上述科目的知識也實在是一件勞心費神的事,何況似乎掌握了它們也不見對程序開發(fā)起到什么明顯的推進作用。那這個矛盾該如何解決呢?很簡單,就是以程序員最熟悉的方式來詮釋這些基礎的理論知識。如果能從簡單的代碼編寫出發(fā),思考編譯器的工作機制,進而探究計算機系統的工作原理和組織結構,這是一件多么有趣的事情啊!當程序員通過代碼編寫這一主線將整個流程走完時,一方面,他們可以對計算機系統有一個深入的理解;另一方面,這種理解將反作用于程序設計實踐,提高程序員的編碼能力,使他們足以寫出漂亮、高效的代碼。這就是我們所希望做到的。幫助讀者走完這一流程的第一步就是先向讀者介紹一些基本的概念和必要的準備知識,其中最基礎的就是對計算機系統有一個概括的認知。這當然不同于一般的計算機文化基礎或者計算機入門知識,我們假設讀者都不是“電腦盲”。所謂的對于計算機系統的概括的認知,更重要的是側重于計算機中指令的傳遞過程,也就是跟程序運行直接相關的硬件設備,諸如外設之類的硬件則不在我們考慮的范圍之內。
首先想請問大家一個問題,什么是電子計算機呢?大家一定認為這是一個非常簡單而容易的問題,然而盡管大家經常使用計算機,但要給出電子計算機的準確定義也未必像想象中那么容易。電子計算機是根據程序化的指令來執(zhí)行具體任務,集合輸入、處理、存儲和輸出功能于一身的一種電子機器。
通常一個用戶與計算機之間的交流過程需要經過幾個必要的環(huán)節(jié),這個過程如圖1-1所示。在這個過程中,用戶是不能直接操作計算機硬件的,和用戶真正直接打交道的是各式各樣的應用軟件,如文字處理軟件、游戲軟件或者圖像處理軟件等。然而,應用軟件通常也不能直接和計算機硬件進行交流,應用軟件必須在由操作系統提供的環(huán)境下才能正常運作。操作系統是控制其他程序運行、管理系統資源并為用戶提供操作界面的系統軟件的集合,它是計算機系統的內核與基石,負責管理和協調計算機的軟、硬件資源。操作系統是一個非常龐大的管理控制程序,大致包括5個方面的管理功能:進程與處理機管理、作業(yè)管理、存儲管理、設備管理和文件管理。目前計算機上常見的操作系統有Windows、UNIX、Linux等,操作系統負責和硬件進行交互。這樣我們可以看到一條清晰的脈絡:用戶→應用軟件→操作系統→硬件設備。

圖1-1 用戶與計算機的交互
程序員所編寫的軟件可能是具體的應用軟件,可能是操作系統,當然也可能是更底層的硬件驅動程序,這里我們假設操作系統已經集合了硬件驅動程序。無論是應用軟件還是操作系統,都是用計算機語言編寫的。這是一件奇妙的事情,簡單的符號組合怎樣鉤織出美輪美奐的軟件世界呢?計算機硬件又是如何運行軟件的呢?如果讀者是一個資深的程序員,他一定不會感到奇怪,反正程序代碼經過編譯器編譯就自然而然地變成軟件了。但是編譯器是如何做到這一切的呢?計算機硬件又是如何解讀和執(zhí)行編譯器生成的目標代碼的呢?能夠回答這些問題的人可能不多了。多數人只不過是只知其一,不知其二,淺嘗輒止,蜻蜓點水。但也許會有人這樣想,反正會編程就行了,又何須管它編譯器如何工作呢?這就是高手與菜鳥的區(qū)別!如果連編譯器的工作流程和計算機的系統原理都不甚清楚,寫出高效的程序代碼根本就無從談起。
編譯器也是軟件,操作系統也是軟件。有人用C++語言在Visual C++環(huán)境下寫了一個小程序就自以為是、沾沾自喜,那么他有沒有想過Visual C++是如何被寫出來的呢?Visual C++運行在Windows操作系統環(huán)境下,那么再進一步追問,操作系統是怎樣被寫出來的呢?著名的Linux操作系統最初的版本就是由芬蘭人李納斯?托瓦茲(Linus Torvalds)在赫爾辛基大學上學時出于個人愛好而編寫的,李納斯不愧為真正的天才程序員。我們不可能要求所有的程序員都能寫出操作系統內核,正所謂“聞道有先后,術業(yè)有專攻”嘛。但是一個真正的程序設計高手應該至少能夠讀懂一個編譯器程序的內核,至少能夠讀懂一個操作系統的內核。這個要求并不苛刻!當你真正能夠理解編譯器的行為方式,以及計算機系統的運作機制時,你已然一躍成為一個程序設計高手了。
- JavaScript全程指南
- Spring 5企業(yè)級開發(fā)實戰(zhàn)
- GeoServer Cookbook
- Java應用開發(fā)技術實例教程
- Python機器學習基礎教程
- Jenkins Continuous Integration Cookbook(Second Edition)
- HTML5秘籍(第2版)
- ServiceNow:Building Powerful Workflows
- Learning Node.js for .NET Developers
- Red Hat Enterprise Linux Troubleshooting Guide
- 一步一步跟我學Scratch3.0案例
- 分布式架構原理與實踐
- Swift High Performance
- Java面向對象程序設計教程
- Mastering Java 11