1.2 計算機軟件發(fā)展
計算機軟件,就是我們通常意義上所說的程序。一塊計算機芯片(中央處理器,CPU)被設(shè)計好之后,芯片公司會推出相應(yīng)的指令系統(tǒng)提供給用戶,以便于用戶可以根據(jù)自己的需求來編寫程序。這種指令系統(tǒng)是由芯片的架構(gòu),內(nèi)核所決定的,因此可以說,只要指令系統(tǒng)相同的計算機芯片,就是同一架構(gòu)的芯片。而這套指令系統(tǒng)也就是我們?nèi)粘Kf的匯編語言。有趣的是,計算機芯片最早是沒有匯編語言這個概念的。
最早的芯片被設(shè)計出來之后,芯片公司會提供一些二進制的操作命令給用戶,用戶根據(jù)這些文檔就可以編寫出自己所需要的程序了。如,某塊芯片的加法操作指令是“000b”,向寄存器傳輸指令是“001b”,寄存器A的編號是“10101b”,寄存器B的編號是“10110b”,指令格式是“操作指令”+“目標操作數(shù)“+”操作數(shù)?!澳羌僭O(shè)我們要把寄存器A的內(nèi)容和寄存器B的內(nèi)容相加,并且放到寄存器A里面。由上面的條件可以得出:相加的操作指令為”000b“,寄存器A的編號是”10101b“,寄存器B的編號是”10110b“,那么把它們按照格式編排起來就是”0001010110110b“,此時這條指令下載到計算機里面,就可以完成上述的功能。這種利用二進制編碼操作的方式叫做”機器語言“??梢院敛患僭O(shè)地說,任何編程語言、數(shù)據(jù)庫、操作系統(tǒng)如果需要在計算機上面運行,它們必須被轉(zhuǎn)化成某個具體計算機的機器語言。而計算機剛剛發(fā)展起來的時候,存儲設(shè)備也是個大問題,當時用來存儲程序的主要設(shè)備是紙條,在一卷紙帶上面,均勻地用針打上孔,就可以把程序記錄下來了,如果程序的二進制是”1“,就打上一個孔,如果是”0“,就不打孔。打孔紙帶如圖1-2-1所示。
圖1-2-1 打孔紙帶
不難看出,隨著計算機指令系統(tǒng)的日趨龐大,依靠二級制操作命令編程的方式已經(jīng)無法滿足計算機軟件的發(fā)展了,因此一種更為高效的方式誕生了,這種方式非常簡單粗暴。芯片廠商想到,我們可以將這些復(fù)雜的二進制命令,用另一種大家都看得懂的方式表現(xiàn)出來,如加法操作指令是“000b”,可以用一個大家都看得懂的英文單詞“ADD“表示它,寄存器A的編號是”10101b“,可以用”RA“來表示它,同樣寄存器B可以用”RB“表示。以后操作者在編程的時候,只要記住這些單詞即可以了,記住單詞往往比記住一串數(shù)字容易地多。這種單詞在后來被稱為”助記符“,這種用助記符的編程語言統(tǒng)稱為匯編。那這個年代的程序員用匯編很容易寫出上面例子中的加法程序,即”ADD RA, RB“,將這個語句輸入到廠家所贈送的匯編器里面,就可以生成出”0001010110110b“這樣的機器語言出來。
1969年,兩個程序員肯·湯普森(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)寫出了第一個版本的Unix,從此計算機軟件史翻開了新的篇章。雖然新的篇章被翻開了,但是后續(xù)的操作系統(tǒng)移植卻變成了一個非常頭疼的問題,因為這個版本的Unix使用匯編語言編寫的,而由于每家芯片公司的匯編語言又不一樣,因此移植起來非常困難。其實在匯編語言盛行的同時,還流傳著一種高級一點的語言,B語言,但B語言的無數(shù)據(jù)類型特性使得其在PDP-11機器(當時的一臺小型機名稱)上無法以比較優(yōu)雅的方式訪問字符類型,因而從1971年開始,丹尼斯·里奇(Dennis Ritchie)開始對B語言進行改造,其中最重要的是引入了數(shù)據(jù)類型的概念,這些改造最終使B語言演化為了計算機發(fā)展歷史上最為重要的編程語言——C語言。到了 1973 年,UNIX 系統(tǒng)的絕大部分源代碼都用C語言進行了重寫,這為提高 UNIX 系統(tǒng)的可移植性打下了基礎(chǔ)(之前操作系統(tǒng)多采用匯編語言,對硬件依賴性強),也為提高系統(tǒng)軟件的開發(fā)效率創(chuàng)造了條件??梢哉f,UNIX 系統(tǒng)與C語言是一對孿生兄弟,具有密不可分的關(guān)系。
圖1-2-2 肯·湯普森(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)
目前,操縱系統(tǒng)已經(jīng)深入到我們生活的方方面面,如智能手環(huán)上面的RTOS(實時操作系統(tǒng)),智能手機上的安卓或者IOS,辦公時候的Windows等。但是,正如我們上面所說,這些硬件不用操作系統(tǒng)也可以正常運行,為何一定要加入操作系統(tǒng)這一個額外的軟件在上面呢?有人可能會說,沒有操作系統(tǒng)就沒有了這些漂亮的UI界面了。關(guān)于這個回答肯定是不對的,早期如我們玩的游戲機,如黑白機等,他們是沒有操作系統(tǒng)的,僅僅靠一些C語言代碼運行在一些內(nèi)存較低的8位CPU上面,還是可以做一些那個年代值得驚艷的界面。引入操作系統(tǒng)的原因,我總結(jié)了一下:
(1)、CPU硬件性能的增強,需要有一個強大的管理軟件來調(diào)度,使得硬件性能不被浪費;
(2)、計算機外設(shè)的增多,需要有一個強大的系統(tǒng)軟件把這些驅(qū)動程序高效、安全管理,并為應(yīng)用軟件提供標準統(tǒng)一的接口;
(3)、內(nèi)存管理與虛擬化,可以將多個應(yīng)用程序同時獨立地運行在計算機上。
(4)、出于安全的考慮,需要將物理硬件和應(yīng)用軟件隔離開,之前我們說到,C語言是可以直接操作硬件的,且沒有一些高級語言的內(nèi)存管理器,如果不用操作系統(tǒng)隔離開,某些程序員用C語言這樣的語言編程引發(fā)的內(nèi)存泄漏將會引起硬件錯誤。
也許20世紀70年代注定是計算機歷史上知識大爆發(fā)的時代,因為此時,不僅出現(xiàn)了Unix操作系統(tǒng),還出現(xiàn)了首個計算機網(wǎng)絡(luò),即后來的“英特網(wǎng)”。而Linux操作系統(tǒng)設(shè)計的初衷,就把強大的網(wǎng)絡(luò)功能嵌入到整個操作系統(tǒng)的設(shè)計中來了,以至1983年,Unix商業(yè)化之后,此后8年時間內(nèi),一直沒有可以與之媲美的操作系統(tǒng)出現(xiàn)。說到Unix系統(tǒng)的商業(yè)化,這里也有幾個小故事。Thompson 在1975/1976學(xué)年來到了加州伯克利分校做客座教授,并且?guī)Я诵┭芯可黄鹄^續(xù)進行Unix的后續(xù)開發(fā),在伯克利,很多新的特性加入到了Unix操作系統(tǒng)中,并發(fā)布了一些早期的BSD版本。BSD (Berkeley Software Distribution)是由加州大學(xué)伯克利分校基于Unix發(fā)布包進行二次開發(fā)和發(fā)布的。BSD為Unix帶來了很多的新的特性,特別是1983年發(fā)布的4.2版本的BSD,該版本實現(xiàn)了TCP/IP協(xié)議棧。而與此同時,Unix逐步走上了閉源的商業(yè)化之路,收費的Unix也被稱為System V。而流傳于伯克利大學(xué)的BSD卻依舊保持著獨立的開源化發(fā)展,由此以后,原本的BSD Unix走上了獨立的發(fā)展之路,先后發(fā)展了OpenBSD,F(xiàn)reeBSD,NetBSD等眾多版本,為后續(xù)的自由軟件運動,注入了一些Unix的基因。這里再說一點,很多商業(yè)軟件也是基于BSD 開發(fā)的,比如蘋果的IOS。
Unix離普通人越來越遠,高昂的價格不僅讓很多公司望而止步,連大學(xué)生學(xué)習(xí)操作系統(tǒng)原理也沒有一個可以講解的對象了,因此中途還誕生過一個叫做“Minux”的操作系統(tǒng),由Minux再發(fā)展,也發(fā)展出了一個獨立的類“Unix”分支。后面1985年以后,自由軟件運動像宗教運動一樣在全球蔓延開來,也誕生了后來的Linux,這部分歷史可以單獨寫本書,這里就不再贅述,有興趣可以自行查閱資料。
上面的內(nèi)容,詳細闡明了C語言和Unix的誕生,而80年代還誕生了一個具有劃時代意義的東西,那就是個人計算機,又稱為IBM PC,IBM微機的誕生,標志著計算機從科研工具走向生產(chǎn)力工具甚至娛樂工具。此后所有的計算機都與其相兼容,被稱為“IBM XT/AT兼容機”,這一部分市場到后來逐步形成了Intel硬件加Windows操作系統(tǒng)的標準計算機。從這時候開始,計算機迅速普及,人們對計算機的內(nèi)容需求越來越多,如游戲,新聞,影音等,這就使得操作系統(tǒng)越來越龐大,應(yīng)用軟件的創(chuàng)作越來越高。再到后來,想要從0到有開發(fā)出一個軟件,基本變得異常困難,而此時的C語言雖然有標準庫的支持,但是面對如此多的應(yīng)用軟件需求,著重于面向過程操作的C語言用來做應(yīng)用軟件開發(fā),顯然有些力不從心了。
后來的軟件行業(yè),一個新的名詞誕生了,即“面向?qū)ο蟆?。“面向?qū)ο蟆钡娜筇卣骶褪浅橄?、繼承、多態(tài),這里我們不解釋這三個名詞,大家只需要知道,“面向?qū)ο蟆本幊炭梢允沟镁幊套兊煤唵危髁?。由于這個思想的誕生,90年代以后,一大批優(yōu)秀的專做面向?qū)ο缶幊痰恼Z言興起了,其中最具有代表和用戶最多的三種為C++,C#,Java。C++和C#,Java雖然都是為了面向?qū)ο笤O(shè)計的語言,但C++一般都被看作是C語言的一個擴充版,最典型的就是指針的使用可以操作任何資源,再加上C++比C語言更復(fù)雜的規(guī)則,使得其非常難用。而C#和Java雖然也是在C++的基礎(chǔ)上發(fā)展起來的,但是它們完全摒棄了C++的硬件粘合性,它們更容易看作是運行在某個軟件上面的編程軟件,如C#必定是基于某個.net平臺運行的,而Java也是運行在JVM(Java Virtual Machine)上的,這些語言編譯之后生成的也不是直接的二進制,而是某種中間語言,運行時,它們的虛擬機平臺再這種中間語言翻譯成機器語言去執(zhí)行。同時,使用C#和Java根本不用擔心內(nèi)存溢出問題,這些虛擬機上面都有GC(GarbageCollection)機制。比較有意思的是,C語言雖然比C++早,但是它的熱度遠遠高于C++和Java。圖1-2-3展示了2020年6月年世界流行的編程語言排名。
圖1-2-3 2020年6月年世界流行的編程語言排名
聯(lián)系客服