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