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