Java 20年:轉角遇到Go

jopen 9年前發布 | 23K 次閱讀 Go語言
 

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公司的“橫插一足”而在移動程序開發領域占領了制高點。當今的計算機世界正處于“云”的時代,而從處理器的角度看也正處于多核時代。誰能夠更好地把握住這些時代標簽,誰就會在發展上更具優勢。當然,這里說的“把握住”是需要有真功夫的。只喊不練不起任何作用,而且還會遭人唾棄。第二個規律是能夠解決問題的語言就是好語言。對于任何場景都是如此。我相信每個技術團隊都會在選擇編程語言時進行一番權衡。哪種編程語言能更快更好地解決問題(這也涉及到開發和維護成本),它就肯定會勝出。從這方面看,編程語言并沒有好壞之分。它們都必有獨特的優勢和擅長做的事情,否則就根本不會誕生出來了。而問題的解決能力幾乎是發展趨勢的唯一評判標準。“多快好省”就是選擇編程語言的要訣。這也會從側面預示一個編程語言的發展趨勢。說了這么多,我另一個想要表達的意思是:對于它們的未來,我無法預知:)。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!