Java 之父最新訪談:JIT 很好,但不適合所有語言
James Gosling,加拿大計(jì)算機(jī)科學(xué)家,完成了 Java 的原始設(shè)計(jì),并實(shí)現(xiàn)了 Java 最初版本的編譯器和虛擬機(jī),也是公認(rèn)的 “Java 之父”。
Evrone 是一家企業(yè)軟件開發(fā)公司,旗下?lián)渭夹g(shù)布道師 (DevRel) 的 Grigory Petrov 最近對(duì) James Gosling 進(jìn)行了采訪。
James Gosling 在此次訪談中聊了大量關(guān)于編程語言的話題,例如對(duì)現(xiàn)代編程語言新特性的看法、怎么看待編程語言更新后引起的破壞性變更、為什么不是所有編程語言都使用 JIT 技術(shù)等。
Grigory:我們希望以軟件開發(fā)和軟件顧問的身份在俄羅斯組織 Python、Ruby、Java 和 Go 社區(qū)。通過這次采訪,我希望能展現(xiàn)這個(gè)行業(yè)的基本問題,進(jìn)而為開發(fā)者同行提供幫助。你在 Java 領(lǐng)域的經(jīng)驗(yàn)和工作經(jīng)歷可以幫助開發(fā)者變得更好,所以我們一起嘗試完成這個(gè)目標(biāo)吧!
有些編程語言,例如 Go,舍棄了類和繼承這些特性。與此同時(shí),其他語言則試驗(yàn)了一些新特性,如 Rust 中的 traits。作為語言設(shè)計(jì)師,你認(rèn)為編程語言應(yīng)該用怎樣的現(xiàn)代、通用、合理方式來進(jìn)行組合(Composition)。
James:我應(yīng)該會(huì)繼續(xù)使用類,因?yàn)槲野l(fā)現(xiàn)類對(duì)于這種場景非常有效。事實(shí)上,對(duì)于如何做不同的事情,我沒有任何好的、清晰的想法。在 C 語言中,宏的存在幾乎是一場災(zāi)難,因?yàn)楹瓴皇钦Z言的一部分,而是在語言之外的特性。Rust 正好希望通過合適的方式在語言中使用宏。
對(duì)于其他編程語言,如 Lisp 家族,它們有一套定義語法的方法,這些語法幾乎完全和語義無關(guān)。我曾經(jīng)寫過許多 Lisp,沉迷于用 Lisp 程序來操作 Lisp 程序的技術(shù)。有些語言能夠讓你以不同的方式做到這一點(diǎn),像 Groovy,我們可以直接使用 AST。而 Rust 則具有語法集成的宏。
Lisp 通過運(yùn)算代碼片段來生成新代碼,在 Java 領(lǐng)域,這種方式也會(huì)經(jīng)常被使用。雖然是非常底層的方法,不過卻很受歡迎。因?yàn)殚_發(fā)者可以對(duì)注解進(jìn)行組合,并使用不同的語言生成字節(jié)碼,這是非常強(qiáng)大的技術(shù),經(jīng)常被用在意想不到的場景。例如 Jackson 框架,它通過計(jì)算序列化器提升了性能。
當(dāng)然,這既是強(qiáng)大的技術(shù),但也非常難以駕馭。這個(gè)技術(shù)充滿可能性,但這種可能性是有限的。我對(duì) Lombok 有著強(qiáng)烈的愛恨交加情感。它添加了許多優(yōu)秀的 Java 特性,但從另一方面來說,這也暴露了其弱點(diǎn)。因?yàn)橛行┨匦员緫?yīng)是內(nèi)置功能。
Grigory:我們最近采訪了 Ruby 的作者 Yukihiro Matsumoto,他提到他在最新的 Ruby 3.0 主要版本中做了一個(gè)實(shí)驗(yàn)。他試圖在沒有引入破壞性變更的情況下發(fā)布這個(gè)版本,看看會(huì)發(fā)生什么。我知道 Java 對(duì)“破壞性”持謹(jǐn)慎態(tài)度。那么是否所有編程語言都要考慮兼容性的問題,每個(gè)大版本都兼容是一個(gè)好主意嗎?還是說這種情況只用于特定的語言,如 Ruby 或 Java?
James:這幾乎完全取決于開發(fā)者社區(qū)的規(guī)模。每一項(xiàng)重大變更都會(huì)給開發(fā)者帶去困擾,如果社區(qū)的開發(fā)者不多,那么破壞性更改不是大問題。另外還必須權(quán)衡成本效益。如果添加了某項(xiàng)破壞性的變更,它會(huì)增加負(fù)擔(dān),但與此同時(shí)也會(huì)帶來一些好處,那么可以考慮。例如,如果將下標(biāo)運(yùn)算符從方括號(hào)更改為圓括號(hào),它可能不會(huì)帶來任何好處,并且會(huì)引起開發(fā)者極大的困擾。那這就是一個(gè)愚蠢的變更。
舉個(gè)例子,JDK 9 引入了一個(gè)極其罕見的破壞性變更:如果開發(fā)者使用了一些所謂的隱藏 API,封裝機(jī)制就會(huì)被打亂,那些破壞封裝邊界,以不應(yīng)該使用的方式使用 API 的開發(fā)者,從 8 升級(jí)到 9 會(huì)碰到不少問題。
還有一種情況:當(dāng)某處存在錯(cuò)誤,并且開發(fā)者為該錯(cuò)誤實(shí)現(xiàn)了變通方法。在這種情況下,如果修復(fù)了錯(cuò)誤,那么有可能會(huì)對(duì)這些變通方法造成破壞。Java 也存在這種案例,我們的做法是要么不修復(fù)錯(cuò)誤,要么引入正確的實(shí)現(xiàn)方法。
Grigory:我們來聊聊企業(yè)和產(chǎn)業(yè)的發(fā)展吧。我自己從未有過給機(jī)器人編程的經(jīng)歷,但我曾在為數(shù)百萬人創(chuàng)造軟件的公司工作了一段時(shí)間。拿今天和 20~25 年前來對(duì)比,我發(fā)現(xiàn)像 GitHub 這樣的社交編碼平臺(tái)得到了巨頭公司的支持,它幫助個(gè)人開發(fā)者和企業(yè)或工業(yè)軟件開發(fā)者進(jìn)行開源開發(fā)。那么我們是否可以認(rèn)為現(xiàn)在是開源軟件的黃金時(shí)代,你怎么看?
James:我不知道如何回答,因?yàn)檫@個(gè)問題涉及到未來。“現(xiàn)在是開源軟件的黃金時(shí)代”這個(gè)觀點(diǎn)隱含著“是不是從現(xiàn)在開始要走下坡路”的意思。如果現(xiàn)在是黃金時(shí)代,那么未來就不是黃金時(shí)代了嗎?
所以我的看法是,無論黃金時(shí)代是什么模樣,我們所處的環(huán)境正變得越來越好,一步步靠近理想中的“黃金時(shí)代”。目前,我們面臨著各種圍繞安全以及人類進(jìn)行網(wǎng)絡(luò)恐怖主義的危機(jī)。當(dāng)這種事情仍在發(fā)生或正在發(fā)生,我不認(rèn)為這是黃金時(shí)代。如果有某種方式可以終結(jié)網(wǎng)絡(luò)恐怖主義——那將是非常“黃金”的時(shí)代,愿我們拭目以待。我想說的是,這是一個(gè)真正偉大的時(shí)代,但它可以變得更好。
Grigory:你在 Java 和 JVM 中使用了 JIT 技術(shù)。JIT 帶來了非常驚人的速度,并且不影響語言的優(yōu)雅語法和高級(jí)特性。許多編程語言都參考了 Java,例如 C# 和 JavaScript,它們通過熱路徑編譯對(duì)代碼進(jìn)行重新編譯的速度接近 C 和 C++。但許多其他語言,如 Python、Ruby、PHP,雖然具備可選的 JIT,但沒有那么流行。許多主流編程語言也沒使用 JIT 來提升性能。所以,為什么不是所有編程語言都使用 JIT 來為開發(fā)者提供更快的速度?
James:事實(shí)上,靜態(tài)類型語言更適合通過 JIT 來提升性能。對(duì)于動(dòng)態(tài)語言,比如 Python,這其實(shí)非常難。通常大家最終所做的是在語言中添加注解,這樣就會(huì)得到像 TypeScript 這種編程語言,它本質(zhì)上是帶有類型注解的 JavaScript。這很有趣,因?yàn)?JavaScript 本質(zhì)上是去除類型聲明的 Java。因此,TypeScript 本質(zhì)上是具有混合語法的 Java。
但如果你是一名用 Python 快速編寫腳本的開發(fā)者,在他們看來,聲明讓他們覺得很困擾,思考變量的類型是非常煩人的事情。腳本語言世界中的大多數(shù)開發(fā)者并不關(guān)心性能問題。他們更在意的是能否用最快的速度完成開發(fā),并不關(guān)心性能和相關(guān)的細(xì)節(jié)。
Grigory:有一個(gè)非技術(shù)問題。當(dāng)我們談?wù)摬煌恼Z言時(shí),在你個(gè)人看來,對(duì)于剛?cè)腴T的開發(fā)者或者相關(guān)專業(yè)的學(xué)生而言,該選擇什么語言作為他們學(xué)習(xí)的第一門語言?
James:對(duì)這個(gè)問題的回答我肯定會(huì)有一點(diǎn)偏心,畢竟 Java 已經(jīng)被成功地使用了這么多年。但我本人學(xué)習(xí)的第一門編程語言是 PDP-8 匯編代碼,差不多同一時(shí)期還學(xué)習(xí)了 Fortran。所以我認(rèn)為對(duì)于初學(xué)者,可以教他們?nèi)魏螙|西,因?yàn)槊總€(gè)人的學(xué)習(xí)能力不一樣。
不過在這個(gè)問題上,我覺得要更多地考慮初學(xué)者未來的職業(yè)道路。如果希望成為一名全面發(fā)展的軟件開發(fā)者,去構(gòu)建一款大型的高性能系統(tǒng),那么 JVM 語言是無法繞過去的,無論學(xué)習(xí)的是何種 JVM 語言。例如 Clojure、Scala 和 Kotlin。但如果是一名物理專業(yè)的學(xué)生,我會(huì)對(duì)他說 Python 也很不錯(cuò)。
事實(shí)上,我認(rèn)為選擇哪門編程語言作為第一門學(xué)習(xí)的語言并不是什么大問題。雖然許多人會(huì)一直堅(jiān)持使用自己學(xué)習(xí)的第一門語言,但如果能夠他們學(xué)習(xí)多門語言,并來回切換使用,這其實(shí)更好。我甚至覺得大學(xué)應(yīng)該開設(shè)比較編程語言優(yōu)劣的課程。課程內(nèi)容是用 5 種不同的編程語言完成作業(yè),這樣的課程設(shè)計(jì)能讓學(xué)生快速學(xué)習(xí)這些語言,因?yàn)樗鼈兤鋵?shí)也沒有太大的區(qū)別。不過學(xué)生通過這種方式會(huì)思考語言的優(yōu)缺點(diǎn)。
很久以前我上過這樣的課程,例如使用 Cobol 完成數(shù)值計(jì)算,使用 Fortran 完成符號(hào)操作,對(duì)于這兩種語言來說,這些任務(wù)都不是它們擅長的領(lǐng)域,但我最后還是拿到了 A 的成績。
本文轉(zhuǎn)自O(shè)SCHINA
本文標(biāo)題:Java 之父最新訪談:JIT 很好,但不適合所有語言
本文地址:https://www.oschina.net/news/157340/james-gosling-interview-evrone