親,我的簡書已不再維護(hù)和更新了,所有文章都遷移到了我的個(gè)人博客:https://mikefighting.github.io/,歡迎交流。
下面是TIOBE對計(jì)算機(jī)語言流行度的最新排名:

我們可以看到Java名列第一,并且Java一直排名很靠前。為什么Java會如此流行呢?要了解Java為什么這么流行,我們先從它的起源說起。
Java誕生的前奏
計(jì)算機(jī)業(yè)內(nèi)一般認(rèn)為:B語言導(dǎo)致了C語言的誕生,C語言演變出了C++,而C++會被Java語言所打敗。是什么導(dǎo)致了Java的誕生?想要解決這個(gè)問題,我們先來看看Java的前輩們。
C語言的誕生
C語言的產(chǎn)生是人們追求結(jié)構(gòu)化、高效率、高級語言的結(jié)果,它可以替代匯編進(jìn)行開發(fā),它的出現(xiàn)改變了人們之前的編程方法和思路。
C語言的出現(xiàn)解決了之前語言的各種不足,比如:FORTRAN高效但不適用于編寫系統(tǒng)程序。BASIC雖然容易學(xué)習(xí),但是功能不夠強(qiáng)大。匯編高效,但是學(xué)習(xí)成本很大,且很難調(diào)試。
另外,C語言之前的語言沒有考慮結(jié)構(gòu)化設(shè)計(jì)。它們大量使用GOTO語句來對程序進(jìn)行控制。這樣做的結(jié)果是程序極其混亂,各種跳轉(zhuǎn)和條件分支交織在一起極大地影響了程序的可讀性。人們解決該問題的愿望非常強(qiáng)烈,且日益迫切。20世界70年代初,計(jì)算機(jī)革命開始,人們對于軟件的需求日益增加,使用當(dāng)時(shí)的語言開發(fā)軟件已經(jīng)無法滿足需求。人們在此期間進(jìn)行了很多的嘗試,但是沒有發(fā)明出更好的語言。直到一個(gè)新機(jī)遇的到來:計(jì)算機(jī)硬件資源的富余。由于計(jì)算機(jī)硬件的增多,程序員可以隨意的使用計(jì)算機(jī),隨意進(jìn)行各種嘗試,這就給了他們開發(fā)自己工具的機(jī)會。后來Ken Thompson發(fā)明了B語言,B語言演化到了C語言。1989年美國國家標(biāo)準(zhǔn)化組織制定了C語言的標(biāo)準(zhǔn),C語言被正式標(biāo)準(zhǔn)化。C語言是由程序員對編程實(shí)踐的總結(jié)而發(fā)明出來的,它能夠解決早期語言的種種缺陷。
C++的誕生
C語言被用的好好的,為何出現(xiàn)了C++呢?原因是C語言太復(fù)雜了。當(dāng)一個(gè)工程項(xiàng)目達(dá)到一定規(guī)模之后,使用結(jié)構(gòu)化編程方法,編程人員就無法對它的復(fù)雜性進(jìn)行有效管理。20世紀(jì)80年代初期,許多工程項(xiàng)目的復(fù)雜性都超過了結(jié)構(gòu)化方法的極限。為了解決這個(gè)問題,面向?qū)ο笳Q生了。面向?qū)ο蟮奶匦裕豪^承,封裝,多態(tài)是用來幫助組織復(fù)雜程序的編程方法。因此出現(xiàn)了C++,C++的產(chǎn)生是基于C的,它包含了C的所有特征,屬性和優(yōu)點(diǎn)。
Java出現(xiàn)的時(shí)機(jī)到了
在20世紀(jì)80年代末到90年代初,使用面向?qū)ο蟮腃++語言占主導(dǎo)地位。然而,推動計(jì)算機(jī)語言進(jìn)化的力量正在醞釀。萬維網(wǎng)(WWW)和Internet在隨后的幾年達(dá)到了臨界狀態(tài),這就促成了編程的另一場革命。
Java誕生
由于嵌入式系統(tǒng)的發(fā)展,人們對一種獨(dú)立于平臺的語言更加渴望,這種語言可以嵌入微波爐,遙控器等各種家用電器設(shè)備的軟件。用作控制器芯片的CPU是多種多樣的,但是C和C++只能對特定目標(biāo)進(jìn)行編譯。比如某個(gè)CPU要編譯C++代碼,那么就要?jiǎng)?chuàng)建一個(gè)針對該CPU的C++編譯器,而創(chuàng)建編譯器是一項(xiàng)耗時(shí)耗長,耗資大的工作。為了解決這個(gè)問題,Gosling和其他人一直在開發(fā)一種可移植,跨平臺的語言。該語言能夠生成運(yùn)行于不同環(huán)境,不同CPU芯片上的代碼。經(jīng)過不懈的努力,在1991年被James Gosling,Patrick Naughton,Chris Warth,Ed Frank和Mike Sheridan發(fā)明出來。第一版花了18個(gè)月。剛開始叫Oak,于1995年更名為Java。
Java流行
在萬維網(wǎng)(WWW)出現(xiàn)之前Java處于有用、摸摸無聞的用于電子消費(fèi)品編程的狀態(tài)。然而由于萬維網(wǎng)的出現(xiàn),Java被推到了計(jì)算機(jī)語言的設(shè)計(jì)的最前沿,因?yàn)槿f維網(wǎng)也需要可移植的程序。
因特網(wǎng)是由不同的、分布式的系統(tǒng)組成,其中包含各種類型的計(jì)算機(jī),操作系統(tǒng)和CPU。盡管許多類型的平臺都可以與因特網(wǎng)連接,但是用戶仍然希望他們能夠運(yùn)行同樣的程序。
1993年,Java設(shè)計(jì)小組的成員發(fā)現(xiàn)解決嵌入式控制器可移植性的方法,也可以用來解決因特網(wǎng)的代碼的可移植性問題。也就是Java不僅可以用來解決小范圍的問題,也可以用來解決大范圍的問題。這樣他們將Java的重心由電子消費(fèi)品,轉(zhuǎn)移到Internet編程上。
Java對Internet為什么重要
在網(wǎng)路中,在服務(wù)器和個(gè)人計(jì)算機(jī)間傳遞的信息有兩大對象:被動的信息和動態(tài)的、主動運(yùn)行的程序。比如閱讀電子郵件是被動的數(shù)據(jù),被服務(wù)器用來正確的顯示服務(wù)器傳遞數(shù)據(jù)的程序是動態(tài)的。這中動態(tài)性是好的,但是其安全性和可移植行有嚴(yán)重的缺陷。在Java產(chǎn)生以前,賽百空間有一半的對象實(shí)體無法進(jìn)入網(wǎng)絡(luò)世界,是Java為它們打開了便利之門,而且在這個(gè)過程中定義了一種全新的程序形式:applet(小應(yīng)用程序)。
Java小應(yīng)用程序
Java可以用來生成兩類程序:應(yīng)用程序(Application)和小應(yīng)用程序(Java applet)。應(yīng)用程序不必說,小應(yīng)用程序是可以再Internet中傳輸并在兼容Java的Web瀏覽器中運(yùn)行的應(yīng)用程序。小應(yīng)用程序?qū)嶋H上就是小型的Java程序,它能夠像圖像文件、聲音文件和視頻片段那樣通過網(wǎng)絡(luò)動態(tài)下載。小程序的特點(diǎn)是,它是動態(tài)的智能的程序,可以對用戶的輸入作出反應(yīng),并變化。
安全性
每次當(dāng)你下載一個(gè)程序的時(shí)候,你都要冒著被病毒入侵的危險(xiǎn)。Java出現(xiàn)之前,很多用戶不經(jīng)常下載可執(zhí)行的程序文件。即使下載了,在運(yùn)行它之前也要進(jìn)行病毒檢查。經(jīng)管如此,很多用戶還是擔(dān)心他們的系統(tǒng)被病毒感染,除此之外,有些惡意程序可以搜索你計(jì)算機(jī)本地文件系統(tǒng)內(nèi)容來收集你的私人信息,比如信用卡號碼、銀行賬號和密碼等。Java在網(wǎng)絡(luò)程序和你的計(jì)算機(jī)之間提供了一道防火墻,消除了用戶的顧慮。這道防火墻就是Java運(yùn)行環(huán)境。Java程序被限制在了運(yùn)行環(huán)境中,不允許它訪問計(jì)算機(jī)的其他部分。
可移植性
鏈接到Internet上的計(jì)算機(jī)和操作系統(tǒng)不盡相同,要使它們都能動態(tài)地下載同一個(gè)程序,就需要有能夠生成可移植性執(zhí)行代碼的方法。這個(gè)方法就是:Java編譯器的輸出并不是可執(zhí)行的代碼,而是字節(jié)碼(bytecode)。字節(jié)碼是一套設(shè)計(jì)用來在Java運(yùn)行時(shí)環(huán)境下執(zhí)行的高度優(yōu)化的指令集,該Java運(yùn)行時(shí)系統(tǒng)成為Java虛擬機(jī)(JavaVirtual Machine, JVM)。在標(biāo)準(zhǔn)形式下,JVM就是一個(gè)字節(jié)碼解釋器。只要某個(gè)平臺安裝了Java虛擬機(jī),它就可以解釋Java代碼。當(dāng)然對Java程序進(jìn)行解釋也有助于它的安全性。因?yàn)槊總€(gè)Java程序的運(yùn)行都在Java虛擬機(jī)的控制之下,Java虛擬機(jī)可以包含這個(gè)程序,并且不讓它在系統(tǒng)之外產(chǎn)生副作用。
Java虛擬機(jī)的增強(qiáng)
盡管Java被設(shè)計(jì)為解釋執(zhí)行的程序,但是這沒有妨礙它將動態(tài)字節(jié)碼編譯為本機(jī)代碼。SUN公司在Java 2發(fā)行版中提供了一個(gè)字節(jié)碼編譯器--JIT(Just In Time)。它可以根據(jù)需要,一部分一部分地將字節(jié)碼實(shí)時(shí)編譯為可執(zhí)行代碼。它不能將整個(gè)Java程序一次性全部編譯為可執(zhí)行的代碼,因?yàn)镴ava要執(zhí)行各種檢查,而這些檢查只有在運(yùn)行時(shí)才執(zhí)行。這種編譯執(zhí)行的方法使性能得到較大的提高。
經(jīng)過上面的探討我們發(fā)現(xiàn),推動計(jì)算機(jī)語言發(fā)展的因素有兩個(gè):
- 適應(yīng)正在變化的環(huán)境和需求
- 實(shí)現(xiàn)編程藝術(shù)的完善和提高
Java之所以流行主要因?yàn)槿f維網(wǎng)的發(fā)展和其自身安全性和可移植性的特點(diǎn)。