溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java之JIT的示例分析

發(fā)布時間:2021-09-09 11:01:04 來源:億速云 閱讀:93 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“Java之JIT的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Java之JIT的示例分析”這篇文章吧。

James Gosling,加拿大計算機(jī)科學(xué)家,完成了 Java 的原始設(shè)計,并實現(xiàn)了 Java 最初版本的編譯器和虛擬機(jī),也是公認(rèn)的 “Java 之父”。

Evrone 是一家企業(yè)軟件開發(fā)公司,旗下?lián)渭夹g(shù)布道師 (DevRel) 的 Grigory Petrov 最近對 James Gosling 進(jìn)行了采訪。

James Gosling 在此次訪談中聊了大量關(guān)于編程語言的話題,例如對現(xiàn)代編程語言新特性的看法、怎么看待編程語言更新后引起的破壞性變更、為什么不是所有編程語言都使用 JIT 技術(shù)等。

Grigory:我們希望以軟件開發(fā)和軟件顧問的身份在俄羅斯組織 Python、Ruby、Java 和 Go 社區(qū)。通過這次采訪,我希望能展現(xiàn)這個行業(yè)的基本問題,進(jìn)而為開發(fā)者同行提供幫助。你在 Java 領(lǐng)域的經(jīng)驗和工作經(jīng)歷可以幫助開發(fā)者變得更好,所以我們一起嘗試完成這個目標(biāo)吧!

有些編程語言,例如 Go,舍棄了類和繼承這些特性。與此同時,其他語言則試驗了一些新特性,如 Rust 中的 traits。作為語言設(shè)計師,你認(rèn)為編程語言應(yīng)該用怎樣的現(xiàn)代、通用、合理方式來進(jìn)行組合(Composition)。

James:我應(yīng)該會繼續(xù)使用類,因為我發(fā)現(xiàn)類對于這種場景非常有效。事實上,對于如何做不同的事情,我沒有任何好的、清晰的想法。在 C 語言中,宏的存在幾乎是一場災(zāi)難,因為宏不是語言的一部分,而是在語言之外的特性。Rust 正好希望通過合適的方式在語言中使用宏。

對于其他編程語言,如 Lisp 家族,它們有一套定義語法的方法,這些語法幾乎完全和語義無關(guān)。我曾經(jīng)寫過許多 Lisp,沉迷于用 Lisp 程序來操作 Lisp 程序的技術(shù)。有些語言能夠讓你以不同的方式做到這一點,像 Groovy,我們可以直接使用 AST。而 Rust 則具有語法集成的宏。

Lisp 通過運算代碼片段來生成新代碼,在 Java 領(lǐng)域,這種方式也會經(jīng)常被使用。雖然是非常底層的方法,不過卻很受歡迎。因為開發(fā)者可以對注解進(jìn)行組合,并使用不同的語言生成字節(jié)碼,這是非常強(qiáng)大的技術(shù),經(jīng)常被用在意想不到的場景。例如 Jackson 框架,它通過計算序列化器提升了性能。

當(dāng)然,這既是強(qiáng)大的技術(shù),但也非常難以駕馭。這個技術(shù)充滿可能性,但這種可能性是有限的。我對 Lombok 有著強(qiáng)烈的愛恨交加情感。它添加了許多優(yōu)秀的 Java 特性,但從另一方面來說,這也暴露了其弱點。因為有些特性本應(yīng)是內(nèi)置功能。

Grigory:我們最近采訪了 Ruby 的作者 Yukihiro Matsumoto,他提到他在最新的 Ruby 3.0 主要版本中做了一個實驗。他試圖在沒有引入破壞性變更的情況下發(fā)布這個版本,看看會發(fā)生什么。我知道 Java 對“破壞性”持謹(jǐn)慎態(tài)度。那么是否所有編程語言都要考慮兼容性的問題,每個大版本都兼容是一個好主意嗎?還是說這種情況只用于特定的語言,如 Ruby 或 Java?

James:這幾乎完全取決于開發(fā)者社區(qū)的規(guī)模。每一項重大變更都會給開發(fā)者帶去困擾,如果社區(qū)的開發(fā)者不多,那么破壞性更改不是大問題。另外還必須權(quán)衡成本效益。如果添加了某項破壞性的變更,它會增加負(fù)擔(dān),但與此同時也會帶來一些好處,那么可以考慮。例如,如果將下標(biāo)運算符從方括號更改為圓括號,它可能不會帶來任何好處,并且會引起開發(fā)者極大的困擾。那這就是一個愚蠢的變更。

舉個例子,JDK 9 引入了一個極其罕見的破壞性變更:如果開發(fā)者使用了一些所謂的隱藏 API,封裝機(jī)制就會被打亂,那些破壞封裝邊界,以不應(yīng)該使用的方式使用 API 的開發(fā)者,從 8 升級到 9 會碰到不少問題。

還有一種情況:當(dāng)某處存在錯誤,并且開發(fā)者為該錯誤實現(xiàn)了變通方法。在這種情況下,如果修復(fù)了錯誤,那么有可能會對這些變通方法造成破壞。Java 也存在這種案例,我們的做法是要么不修復(fù)錯誤,要么引入正確的實現(xiàn)方法。

Grigory:我們來聊聊企業(yè)和產(chǎn)業(yè)的發(fā)展吧。我自己從未有過給機(jī)器人編程的經(jīng)歷,但我曾在為數(shù)百萬人創(chuàng)造軟件的公司工作了一段時間。拿今天和 20~25 年前來對比,我發(fā)現(xiàn)像 GitHub 這樣的社交編碼平臺得到了巨頭公司的支持,它幫助個人開發(fā)者和企業(yè)或工業(yè)軟件開發(fā)者進(jìn)行開源開發(fā)。那么我們是否可以認(rèn)為現(xiàn)在是開源軟件的黃金時代,你怎么看?

James:我不知道如何回答,因為這個問題涉及到未來。“現(xiàn)在是開源軟件的黃金時代”這個觀點隱含著“是不是從現(xiàn)在開始要走下坡路”的意思。如果現(xiàn)在是黃金時代,那么未來就不是黃金時代了嗎?

所以我的看法是,無論黃金時代是什么模樣,我們所處的環(huán)境正變得越來越好,一步步靠近理想中的“黃金時代”。目前,我們面臨著各種圍繞安全以及人類進(jìn)行網(wǎng)絡(luò)恐怖主義的危機(jī)。當(dāng)這種事情仍在發(fā)生或正在發(fā)生,我不認(rèn)為這是黃金時代。如果有某種方式可以終結(jié)網(wǎng)絡(luò)恐怖主義——那將是非?!包S金”的時代,愿我們拭目以待。我想說的是,這是一個真正偉大的時代,但它可以變得更好。

Grigory:你在 Java 和 JVM 中使用了 JIT 技術(shù)。JIT 帶來了非常驚人的速度,并且不影響語言的優(yōu)雅語法和高級特性。許多編程語言都參考了 Java,例如 C# 和 JavaScript,它們通過熱路徑編譯對代碼進(jìn)行重新編譯的速度接近 C 和 C++。但許多其他語言,如 Python、Ruby、PHP,雖然具備可選的 JIT,但沒有那么流行。許多主流編程語言也沒使用 JIT 來提升性能。所以,為什么不是所有編程語言都使用 JIT 來為開發(fā)者提供更快的速度?

James:事實上,靜態(tài)類型語言更適合通過 JIT 來提升性能。對于動態(tài)語言,比如 Python,這其實非常難。通常大家最終所做的是在語言中添加注解,這樣就會得到像 TypeScript 這種編程語言,它本質(zhì)上是帶有類型注解的 JavaScript。這很有趣,因為 JavaScript 本質(zhì)上是去除類型聲明的 Java。因此,TypeScript 本質(zhì)上是具有混合語法的 Java。

但如果你是一名用 Python 快速編寫腳本的開發(fā)者,在他們看來,聲明讓他們覺得很困擾,思考變量的類型是非常煩人的事情。腳本語言世界中的大多數(shù)開發(fā)者并不關(guān)心性能問題。他們更在意的是能否用最快的速度完成開發(fā),并不關(guān)心性能和相關(guān)的細(xì)節(jié)。

Grigory:有一個非技術(shù)問題。當(dāng)我們談?wù)摬煌恼Z言時,在你個人看來,對于剛?cè)腴T的開發(fā)者或者相關(guān)專業(yè)的學(xué)生而言,該選擇什么語言作為他們學(xué)習(xí)的第一門語言?

James:對這個問題的回答我肯定會有一點偏心,畢竟 Java 已經(jīng)被成功地使用了這么多年。但我本人學(xué)習(xí)的第一門編程語言是 PDP-8 匯編代碼,差不多同一時期還學(xué)習(xí)了 Fortran。所以我認(rèn)為對于初學(xué)者,可以教他們?nèi)魏螙|西,因為每個人的學(xué)習(xí)能力不一樣。

不過在這個問題上,我覺得要更多地考慮初學(xué)者未來的職業(yè)道路。如果希望成為一名全面發(fā)展的軟件開發(fā)者,去構(gòu)建一款大型的高性能系統(tǒng),那么 JVM 語言是無法繞過去的,無論學(xué)習(xí)的是何種 JVM 語言。例如 Clojure、Scala 和 Kotlin。但如果是一名物理專業(yè)的學(xué)生,我會對他說 Python 也很不錯。

事實上,我認(rèn)為選擇哪門編程語言作為第一門學(xué)習(xí)的語言并不是什么大問題。雖然許多人會一直堅持使用自己學(xué)習(xí)的第一門語言,但如果能夠他們學(xué)習(xí)多門語言,并來回切換使用,這其實更好。我甚至覺得大學(xué)應(yīng)該開設(shè)比較編程語言優(yōu)劣的課程。課程內(nèi)容是用 5 種不同的編程語言完成作業(yè),這樣的課程設(shè)計能讓學(xué)生快速學(xué)習(xí)這些語言,因為它們其實也沒有太大的區(qū)別。不過學(xué)生通過這種方式會思考語言的優(yōu)缺點。

很久以前我上過這樣的課程,例如使用 Cobol 完成數(shù)值計算,使用 Fortran 完成符號操作,對于這兩種語言來說,這些任務(wù)都不是它們擅長的領(lǐng)域,但我最后還是拿到了 A 的成績。

以上是“Java之JIT的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI