Java 20年:轉角遇到Go

1995年,橫空出世的Java語言以其顛覆式的特性迅速得到了開發者的關注。跨平臺、垃圾回收面向對象,這在當時都是難以想象的事情,而Java卻完美地在一門語言中實現了這一特性。能夠說,Java將編程語言設計帶領到一個新的高度。20年後的今天,當年的那些新特性已經再也不是什麼新鮮詞。同時,又會有一些新的語言宣稱本身有一些顛覆性的特性,其中Go語言就是新語言的一個表明,它部署簡單、併發性好,在語言設計上確實優於Java。爲了瞭解Java和Go語言的發展示狀與趨勢,InfoQ採訪了Go語言大牛郝林。php

  InfoQ:今年的5月23日是Java的第20歲生日,轉眼間,Java已經走過了20年,版本號也已經更新到Java 8。你怎麼看Java這門語言?在這20年裏,有哪些對你印象比較深入的Java事件?html

郝林:我以爲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語言?app

郝林:這就是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命令教程》 。

相關文章
相關標籤/搜索