泛C家族程序語言二十年獨(dú)領(lǐng)風(fēng)騷
最近應(yīng) JCConf Taiwan 2016 技術(shù)研討會的邀請,做了一場講題訂為“Java 在現(xiàn)今軟體開發(fā)的角色及競爭力”的分享。Java 約莫是在 90 年末期開始成為主流的程式語言,至今也將近二十年,在這過程中,整個程式語言生態(tài)圈隨著基礎(chǔ)環(huán)境的變化,也有了不少更迭。
原先的主流程式語言影響力有所變化、也有不少語言加入,各據(jù)山頭、各擁支持者?;仡欉@二十年來的變化,不難有些觀察。
當(dāng)前4大熱門的程式語言都有密切關(guān)系
讓我們先來看看 TIOBE 在 2016 年十月所做的熱門語言排行。
基本上,前五名和去年同期相比,都是相同的。除了遇到了很大的基礎(chǔ)條件變化,否則,程式語言的熱門程度也不致于突然有很大的變動。
TIOBE 的排名時常在網(wǎng)路上被引用,常是特定語言的支持者為了引證自己支持的程式語言所用,而 TIOBE 的排名,主要是根據(jù)主流搜尋引擎、部落格、維基百科、YouTube 等網(wǎng)路服務(wù)上的搜尋次數(shù)綜合起來的指標(biāo)計(jì)算而成的,所以它反映出來的是一種熱門程度。當(dāng)然,必須要留意的是,熱門不等同于好,熱門也不等同于重要,程式語言的好壞、重要與否,或許跟熱門程度有點(diǎn)相關(guān),但卻無法直接畫上等號。
可以發(fā)現(xiàn)前四名都是血統(tǒng)相近、同一家族的,即:Java、C、C++,以及 C#。
TIOBE 在 2016 年十月所做的熱門語言排行,Java、C、C++、C#名列前4大。
C、C++、Java之間的淵源
C++ 從 C 衍生而來。歷史上,C++ 以 C 的語法為基礎(chǔ),發(fā)展出可支援物件導(dǎo)向程式設(shè)計(jì)的程式語言。一度挾著物件導(dǎo)向設(shè)計(jì)方式所帶來的生產(chǎn)力,而大大的流行起來,但 C++ 落實(shí)在實(shí)際開發(fā)中也被觀察到一些問題,因此有了 Java 的問世。
Java 最早是為了嵌入式系統(tǒng)的需求而設(shè)計(jì),真正開始大放異彩,卻是從 WWW 的風(fēng)行開始。在那個 WWW 只有靜態(tài)網(wǎng)頁效果的年代,Java Applet 提供了更多動態(tài)的可能性,它讓網(wǎng)頁足以執(zhí)行程式,不論是計(jì)算或是呈現(xiàn)動態(tài)視覺效果,甚至是提供更豐富的使用者操作介面,Applet 都能辦到。這讓 Java 真正的讓更多程式設(shè)計(jì)者重視,也讓 Java 真正的進(jìn)到了尋常百姓家。一時之間,想在網(wǎng)頁上提供更豐富互動效果的程式設(shè)計(jì)者,都紛紛開始用起了Java。
基于種種原因,Java Applet 流行的時間并不長久,但 Java 程式語言并未因此而衰弱,反而在伺服器端找到了更合適的戰(zhàn)場,也奠定了接下來雄霸市場的基礎(chǔ)。當(dāng) Sun 推出了以所謂 “Servlet” 為基礎(chǔ)的 Web 伺服器端的架構(gòu)時,相較于當(dāng)時流行的、以 C/C++ 或 Perl 為主要語言寫成的 CGI 程式來說,在效能及生產(chǎn)力上,都有很好的表現(xiàn)。從此以后,成為一大主流。再加上諸多搭配的因素,使得 Java 不斷的擴(kuò)增版圖,最后取得了主宰的地位。
Java與C++的瑜亮情結(jié)
C++ 在很多面向上,和 Java 接近,我常說,Java 是 C++--,也就是 Java 的設(shè)計(jì)者試著去除他認(rèn)為 C++ 中需要被簡化的部份,因?yàn)?C++ 相較于 Java 其實(shí)復(fù)雜許多。
但為什么 Java 的出現(xiàn)對 C++ 造成的沖擊,大過于 C 呢?我認(rèn)為,就跟現(xiàn)代智人與尼安塔人間的競爭一樣,一個生物物種最大的威脅,往往就是它在演化上的近親。因?yàn)槟岚菜撕同F(xiàn)代智人在演化上很接近,也因此它們所需的資源及環(huán)境也大幅重疊,當(dāng)其中之一開始壯大時,另一勢必遭殃。因此,尼安塔人滅絕了。而 C++ 就很像尼安塔人,被自己在演化上的近親 Java 掠奪走了許多的資源及根據(jù)地,所以受創(chuàng)慘重。
和 Java 相比,C++ 可以歸類在“魔幻語言”,而 Java 卻是典型的“簡約語言”。我相信 C++ 及 Java 在語言設(shè)計(jì)上,都是以著眼生產(chǎn)力而出發(fā),但 Java 語言舍棄了華麗的表現(xiàn)方式,選擇了“大巧不工”的路線。不留太多取巧的空間、看似笨拙卻避免犯錯。事實(shí)上,避免犯錯也正是提高生產(chǎn)力的重要原因,一個程式臭蟲要花費(fèi)數(shù)倍于撰寫程式的時間,才能予以發(fā)掘、修正。
除了語言本身以簡樸為要實(shí)證獲得生產(chǎn)力之外,Java 以一個設(shè)計(jì)良好的核心程式庫為基礎(chǔ),搭配強(qiáng)大活躍的開放原始碼社群的貢獻(xiàn),有著充沛的非官方程式庫支援,更使得開發(fā)的生產(chǎn)力大為提升,各種工具一應(yīng)俱全。
就像著名的 Jakarta Apache Project 中的專案一樣,自成一個生態(tài)圈,而且構(gòu)成正向的循環(huán)。各專案間彼此相互沿用、沒有文人相輕的問題,你做車體、我做輪子,彼此可以相互整合,這使得生態(tài)圈中的專案愈來愈豐富,品質(zhì)也夠好。
Java 做為 C++ 演化上的近親,即使十分相像,但因?yàn)樵趲讉€關(guān)鍵因素上的不同,就決定了究竟誰得遭受到掠奪的命運(yùn)。
上圖是 TIOBE 統(tǒng)計(jì)十幾年來的程式語言熱門程度的消長,大致可以看出 Java 的熱門程度,幾乎不衰。而 Java 的祖先 C 語言,也大致維持第二、甚至有時竄升到第一。而從這張圖上也可以清楚看出來,C++ 整體呈下降的趨勢。
C#受限于微軟早年固守平臺策略而失去先機(jī)
那么 Java 有沒有具威脅力的演化近親?有的,正好是 TIOBE 排行里第四名的 C#。
C# 仿效 Java 再改良是毫無疑問的,部份 C# 先進(jìn)的語法,Java 甚至到了近期才加入。
和 Java 一樣,C#是采取可跨平臺的虛擬機(jī)器架構(gòu)(雖然 C# 初期只能運(yùn)行在 Windows 平臺),一樣有著記憶體回收機(jī)制、單一繼承體系的核心程式庫架構(gòu),再怎么看,C# 都是 Java 極具威脅性的演化近親,可惜,微軟自己自廢武功,把 C# 這頭猛獸囚禁在 Windows 的平臺之上。
微軟大概是想重施舊計(jì),把昔日利用 Windows 作業(yè)系統(tǒng)優(yōu)勢,使得 IE 干掉 Netscape 的劇情,重新在 C# vs. Java 的故事中重新上演,可惜,作業(yè)系統(tǒng)平臺的優(yōu)勢到了 Web 時代,早就不復(fù)存在。即使之后微軟將 .NET 核心開放原始碼,也已經(jīng)時不我予了。因此,C# 和 Java 之間的距離還是夠懸殊。
Java、C、C++、C# 系出同源,占據(jù)了這份排行榜的前四名,它們都是屬于靜態(tài)型別的程式語言,這是個很有趣的現(xiàn)象,因?yàn)榍笆械钠溆嗔N程式語言,都是屬于動態(tài)型別的程式語言。在下一回中,我會繼續(xù)說明之所以會有這兩大集團(tuán),以及靜態(tài)型別程式語言為何領(lǐng)先在前的看法。
評論