1. 程式人生 > 其它 >Java創造者詹姆斯·高斯林採訪

Java創造者詹姆斯·高斯林採訪

詹姆斯·高斯林,通常被稱為"Java博士",是加拿大電腦科學家,最有名的是Java程式語言之父。

介紹

詹姆斯·高斯林,通常被稱為"Java博士",是加拿大電腦科學家,最有名的是JAVA程式語言之父。他做了Java的原始設計,並實現了其原始編譯器和虛擬機器。我們的DevRel,格里戈裡·彼得羅夫,有機會採訪詹姆斯,我們已經包括了下面的整個成績單。希望你喜歡!

面試

格里戈裡:作為軟體開發人員和軟體顧問,我們試圖在俄羅斯組織一個社群:Python、Ruby、Java 和 Go 社群。我們希望通過進行面試來幫助我們的開發人員,這些訪談突出了我們行業的基本問題。我認為您在 Java 上的經驗和工作可以幫助開發人員變得更好。因此,讓我們試著幫助他們!

有些語言,如圍棋,不上課和繼承,而另一些則嘗試在鏽的特點。作為一名語言設計師,你認為程式語言的現代、通用、合理創作方式是什麼?

詹姆斯:我想我不會上課。實際上, 我發現課程對作文效果很好。我真的沒有任何好, 清楚的想法, 做什麼不同。而一些我會以不同的方式做的事情有點奇怪。在 C 中,有巨集,這幾乎是一個災難,因為巨集不是語言的一部分:他們有點在它之外。Rust 的鄉親們試圖用語言來安裝巨集。

其他語言,如所有的Lisp家族,設法使他們更優雅地適應,但他們有一種方法來定義語法,語法幾乎完全沒有語義。在大多數語言中,語法和語義是齊頭並進的。作為一個在過去一生中寫過很多 Lisps 的人, 我真的沉迷於使用 Lisp 程式來操縱 Lisp 程式的技術。這是我真正非常想念的一件事。有些語言可以讓你以不同的方式做到這一點,所以像在Groovy,你可以直接玩AST。有某種句法整合的巨集。但對我來說,總覺得裡面有一個有趣的研究問題:你能做得更多嗎?

我能感覺到 Lisp 在程式碼片段上進行計算以生成新程式碼嗎?在Java世界,人們這樣做。這是更流行的功能之一,除了它真的很低的水平。因為人們使用註釋和事實的組合,你可以用一些不同的語言生成字形碼。這是超級強大的。它被用在像你意想不到的地方, 就像在傑克遜一樣。它通過計算序列化器獲得了很多效能。

一方面,這是一個非常強大的技術。另一方面,它只是超級難以使用。事實上,這是可能的,是偉大的。但是你能走多遠呢?它們可能有點有限。所以,如果你看看像龍目島的東西,這是我覺得是...嗯, 我對此有強烈的愛恨。因為它增加了一堆 Java 功能, 是相當不錯的, 但另一方面, 它顯示了弱點。部分在這個過程中,因為這是一組功能,應該只是內建。Java社群程序已經變得比它應該少一些社群。這些天我在外面, 已經很多年了, 但有些事情你可以做, 只是整個地圖。

格里戈裡:這就是為什麼我們準備了關於您在建立語言方面出色體驗的問題,而不是一些現代 Java 增強建議。當然,這很好,但從中建立特定域的語言有點棘手。有了 Ruby ,就容易多了。Ruby 開發人員是偉大的, 但他們需要大量的培訓, 以學習所有的 Dsl 魔法。

詹姆斯:具有計算程式碼片段等功能的原因之一是 Java 試圖一直編輯機器程式碼。Ruby幾乎總是被解釋。當你這樣做的時候,當你不想得到所有你能得到的效能時,生活就變得簡單了。但是,如果你試圖獲得強大的功能和最終的表現,生活變得更加困難。

格里戈裡:最近,我們採訪了Ruby的作者松本行弘,他提到他用他最新的主要Ruby3.0版本進行了一個實驗。他試圖在不中斷更改的情況下發布此版本,以檢視將會發生什麼。不破壞任何東西的主要語言版本。我知道Java對不破壞事情持謹慎態度。對於所有語言來說,在沒有不相容的情況下進化是個好主意嗎?還是隻能用於特定語言(如 Ruby 或 Java)的有限方法?

詹姆斯:它幾乎完全是開發人員社群規模的函式。每一次突破性的變化都會在開發人員社群中引起痛苦。如果你沒有很多開發人員,那麼打破變化不是大問題。你還必須考慮成本效益的權衡。如果你做了一個突破性的改變,它增加了一些痛苦,但它也帶來了一些好處。例如,如果您將子指令碼操作員從方括號更改為圓形括號,則它可能完全不會為您購買任何東西,並誘發巨大的疼痛。那可是個愚蠢的主意

在 JDK 9 中,發生了變化,這是極少數被引入的突破性更改之一,它打破了一些變化:如果您使用一些所謂的隱藏的 API,封裝機制就會被攪亂,而那些打破封裝邊界並使用不應以不應使用的方式使用的東西的人, 他們有一些疼痛從 8 移動到 9 。但是,一旦我們超越這一點,它允許平臺更多的創新自由。在這個特殊的8到9過渡的情況下,這意味著平臺可以切片和切碎,你實際上可以定製包裝,使Java執行時間環境將更小。

另一個總是有相當數量的不適的領域是:當某樣東西中有一個 bug,而人們為 bug 做解決方法時,如果你修復了 bug,您可能會破壞解決方法。當然,在Java世界中,我們決定不修復錯誤,或者引入一種做正確事情的方法。這甚至出現在硬體中。

格里戈裡:25年前,當我開始自己的軟體開發者生涯時,我寫了很多C和C++程式碼。我記得這些神祕的Bug,每月發生一次。除錯這些錯誤是一種痛苦。但現在,作為一個軟體開發人員,我看到很多工具整合到我們的工作流程中,比如靜態型別跳棋。現代開發人員使用 IDE,如IntelliJ IDEA,甚至視覺工作室程式碼。他們編寫原始碼,靜態型別檢查器解析程式,構建抽象語法樹,並檢查一切可能。然後在文字編輯器中突出顯示可能的錯誤。這種技巧不僅適用於靜態鍵入的語言,甚至適用於動態鍵入的語言,如 Python、Ruby 和 TypeScript。您對我們今天使用的這些靜態式跳棋有何看法?他們是在編寫更好的軟體上向前邁出了一步,還是我們需要在語言語法中投入更多?

詹姆斯:嗯,兩者都是。我非常喜歡帶有靜態型別系統的語言,因為它們為靜態型別跳棋和 IDE 提供了腳手架。我花了大半場時間作為一個軟體工程師,最不令人滿意的方式,我花時間是尋找晦澀難懂的錯誤,發生在奇怪的時間。我能做任何事情讓Bug在浪費我的時間之前消失都是一件好事。所以,我非常喜歡IDE可以做些什麼來降低Bug的概率。因此,當我們觀察動態鍵入的語言,如JavaScript和Python時,它們沒有一個推理框架來解決它,因為他們不一定知道什麼型別的東西:他們只是有點猜測強鍵入的語言(如 Java)為型別檢查器提供了更嚴格的框架。而且,再上一個臺階,有些事情可以證明完全自動定理。因此,有像達夫尼這樣的系統,它有一個非常複雜的定理證明。因此,如果您想要構建加密演算法,您將能夠在數學上證明屬性。你可以這樣做。這可能有點太遠了,但對於某些程式碼來說,它真的很有用。

這在很大程度上取決於你的目標到底是什麼。如果你是一個大學生,你試圖完成你的作業,或者你是一個博士生,你試圖畢業,那麼當你寫一個程式,你的目標是,它應該工作一次。至少一次因為你必須做一個演示,並能夠炫耀它,看看它是否工作。如果你在工業環境中, 我一生中大部分時間都在工業環境中, 工作一次只是稍微有用。它每次都要工作。工作一次和每次工作之間的差別是巨大的。因此,如果它只需要工作一次,那麼更有活力的語言工作得相當好。如果你必須確保它會一遍又一遍地工作,所有的靜態打字工具可以幫助你獲得信心。但是如果你正在做的事情是...說,你是一個物理學家,你想找出一些計算的結果,它只需要執行一次。這取決於您正在執行的工作的上下文。軟體越需要可靠性,靜態鍵入的語言就越有幫助。