這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
1995年,橫空出世的Java語言以其顛覆式的特性迅速獲得了開發人員的關注。跨平台、記憶體回收、物件導向,這在當時都是不可思議的事情,而Java卻完美地在一門語言中實現了這一特性。可以說,Java將程式設計語言設計帶領到一個新的高度。20年後的今天,當年的那些新特性已經不再是什麼新鮮詞。同時,又會有一些新的語言宣稱自己有一些顛覆性的特性,其中Go語言就是新語言的一個代表,它部署簡單、並發性好,在語言設計上確實優於Java。為了瞭解Java和Go語言的發展現狀與趨勢,InfoQ採訪了Go語言大牛郝林。
InfoQ:今年的5月23日是Java的第20歲生日,轉眼間,Java已經走過了20年,版本號碼也已經更新到Java 8。你怎麼看Java這門語言?在這20年裡,有哪些對你印象比較深刻的Java事件?
郝林:我覺得Java語言一路走來賺足了眼球也惹來了眾多非議。就拿它隨著Sun公司的沒落被流轉到Oracle公司來說吧。我記得當時有一大批Java程式員在網上揚言要摒棄Java語言,並且一部分人真的這麼做了。但事實證明,Oracle更好地發展了Java。我認為從Java 7開始這門語言相當於迎來了第二春,在發展上增速了不少,各種新鮮特性和類庫層出不窮。Java 8給我印象最深刻的就是對Lambda運算式的支援。這使得Java真正地對函數式編程提供了支援。這是質的改變。也終將使Java語言走得更遠。
InfoQ:從版本迭代的角度看,你認為Java的發展經曆了哪幾個階段?
郝林:我是從Java 1.3的末期開始接觸它的。所以在我看來Java 1.3之前就屬於萌芽期吧(雖然那時它已被廣泛使用了)。從1.4開始,Java語言有了很多改觀,比如NIO、更多的記憶體回收行程、效能上的提升、Java EE規範的逐步簡化,等等。所以我認為從此Java進入了第一個高速發展期(也許有上一個但我沒趕上)。到了Java 6的時候,發展速度其實已經減緩不少了。這也可能是由於Java正處於被交接階段的緣故。不過,我不得不說,Oracle的調整動作很快,在幾乎沒有什麼斷檔的情況下,Java的發展又開始“跑”起來了。這也是我在前一個回答中說的“第二春”。
InfoQ:JVM的普及促使相關周邊語言不斷湧現,你怎麼看這些JVM語言?
郝林:這就是Java真正牛的地方。它不單單是一門語言,更是一個平台。到目前為止,JVM語言已經有很多了,但是發展最好的是Scala。它解決了一些Java在程式開發方面的問題。但是,我認為它的方向有所偏頗。我覺得“簡化”往往比“豐富”來得更直接,效果也會更好。相比之下,Clojure語言就做得很好。但是由於它是一個Lisp語言的方言,編碼方式和思維方式與Java的物件導向思想相去甚遠,所以僅僅被一小部分Java程式員接受。總之,JVM語言讓Java更加流行了。它們雖不完美,但卻功不可沒。
InfoQ:很多人都在唱衰Java,您能結合Java的發展現狀和趨勢談談Java的前景嗎?
郝林:任何一個流行的技術都會有人唱衰,更何況Java已經發展了20年了,中間又經曆了種種坎坷。我覺得Java 9又會是一個裡程碑式的版本。我很期待。我認為在我可預見的未來Java不會沒落。實際上,Java語言在企業級軟體領域的霸主地位是不可動搖的。在互連網軟體領域,它雖然受到了各種開發成本更低的語言(比如Ruby和Python)的不斷侵蝕,但是仍然佔有一席之地。這正說明了Java生命力的頑強。不過,相比於Java語言,我更看好Java作為一個平台的前景。
InfoQ:你什麼時候開始接觸Go語言的?相比於Java語言,它有哪些優勢?
郝林:我接觸Go語言實際上並不算早,大約在2013年的上半年。那時候Go語言的版本是1.0,1.1版本正處於開發期。Go語言給我的第一印象就是支援多種編程範式、提供了給力的程式構建和發布工具,以及在並發編程方面的極度簡化。在當時,我認為Java語言的不足恰恰就包括了這幾個方面。所以我義無返顧的開始學習並使用Go語言。事實證明,Go語言雖屬於新興語言,但它卻是一種革新。另外,與Java語言一樣,Go語言的向後相容做的很好。並且,為了以防萬一,它提供了一個命令用於自動地把舊版本的Go語言程式源碼調整為目前的版本的源碼。諸如此類的“便捷大法”還有很多。許多在Java世界中只能依靠額外的類庫或工具才能完成的事情,在Go語言看來卻是手到擒來。當然,這種實實在在的優勢也有誕生時間不同的緣故。正是由於Java已經曆經了太多,所以在很多方面都很難改變。我覺得這是所有程式設計語言都應該正視的問題。顯然,Go語言的創造者們已經意識到了這一點。
InfoQ:出色的並發效能是Go語言區別於其他語言的一大特色。相比於Java的並發編程,它有哪些顯著性的優勢?
郝林:說到並發,Go語言給人們的第一印象就是便捷。在這便捷之下,Go語言權衡了各方面利弊,做了大量的工作,使得我們用極低的開發成本就可以編寫出擁有超高運行效能的Go語言並發程式。其中最大的亮點就是,Go語言把“啟用”需要並發執行的代碼塊的操作內建了。我們僅通過一個關鍵字“go”就可以輕易地完成這項操作。
還記得我們在Java中為此需要編寫的代碼是多麼的冗長嗎?侵入式的介面實現聲明和類繼承聲明、複雜的匿名內部類,以及困難重重的線程間協調和調度。這些都是不可忽視的程式開發維護成本。我們在編寫和修改這樣的並發程式時都要保持頭腦和思路的絕對清晰,否則就會埋下禍根,搞出不易察覺和定位的Bug。另一方面,如果透過表象看本質的話,我們就可以看到Go語言為了程式員的方便而做的大量的工作。
籠統地講,Go語言把對核心線程的使用和調度操作都內建到其運行時系統中了。但是,它遠遠要比一個線程池複雜得多。Java線程與核心線程之間關係是1:1的。而Go語言的Goroutine(可以看做是Go語言中執行並發代碼塊的實體)與核心線程之間的關係是M:N的。這讓我們可以使用成千上萬個Goroutine去執行並發代碼塊而僅僅耗費極少的核心線程。關於Go並發編程更詳細的介紹,大家可以參看我著的“圖靈原創”圖書《Go並發編程實戰》。
InfoQ:Java和Go語言的使用情境是不是不一樣?
郝林:Java語言與Go語言在使用情境方面其實有很多相似之處。例如,它們都適用於服務端程式的構建,並且可以很容易地編寫出頁面模板檔案。又例如,它們在案頭軟體方面都比較捉襟見肘。有意思的是,就本身而言,Go語言在適用領域的優勢更強,而在不適用領域的劣勢也更加明顯。優勢方面我就不再贅述了,下面說說劣勢。比如,用Java編寫傳統型程式起碼還有Swing和JavaFX可選,但是Go語言官方至今還沒有一個成熟的解決方案。當然,這仍舊與誕生時間有關。另外,我們還可以用Java語言編寫Android應用程式。Go語言目前雖然已經涉足,但還不完美。不過我在這裡爆料一下,我很期待能用Go語言編寫iOS應用程式。實際上,Go語言在這方面已經有所進展了。總之,兩種語言在適用領域方面有所重疊但又有些不同。在很多情況下,我們可以混用這兩種語言。
InfoQ:現在的開發語言特別多,Java、Go、PHP、Rust、Python等,你認為未來語言的發展趨勢是怎麼樣的?
郝林:的確,現在的程式設計語言層出不窮、多如牛毛。但是程式設計語言的興衰是有規律可循的。第一個規律是順應時代的語言才能有更好的發展。正如Objective-C因iPhone和iPad的誕生而變得火熱至極那樣。而Java也因Google公司的“橫插一足”而在移動程式開發領域佔領了制高點。當今的電腦世界正處於“雲”的時代,而從處理器的角度看也正處於多核時代。誰能夠更好地把握住這些時代標籤,誰就會在發展上更具優勢。當然,這裡說的“把握住”是需要有真功夫的。只喊不練不起任何作用,而且還會遭人唾棄。第二個規律是能夠解決問題的語言就是好語言。對於任何情境都是如此。我相信每個技術團隊都會在選擇程式設計語言時進行一番權衡。哪種程式設計語言能更快更好地解決問題(這也涉及到開發和維護成本),它就肯定會勝出。從這方面看,程式設計語言並沒有好壞之分。它們都必有獨特的優勢和擅長做的事情,否則就根本不會誕生出來了。而問題的解決能力幾乎是發展趨勢的唯一評判標準。“多快好省”就是選擇程式設計語言的要訣。這也會從側面預示一個程式設計語言的發展趨勢。說了這麼多,我另一個想要表達的意思是:對於它們的未來,我無法預知:)。
受訪嘉賓介紹
郝林,軟體工程師,從事軟體開發工作9年有餘。既搞過企業級軟體項目,也堆過互連網軟體系統。近期在使用和推廣Go語言,著有“圖靈原創”圖書《Go並發編程實戰》,以及線上免費教程《Go語言第一課》和《Go命令教程》 。