作者 | David Cassel
譯者 | 平川
策劃 | Tina
本文最初發(fā)布于 THENEWSTACK 博客。
在上個月舉行的 JVM 峰會上,Java 語言架構師 Brian Goetz 在演講中 展望 了 Java 的未來發(fā)展。
Goetz 探討的并非 Java 的現狀,而是假設的一系列特性——這些特性不是為了編寫更好的程序,而是作為一種機制,使語言更具可成長性和可擴展性?!?/p>
簡而言之,Goetz 介紹了他如何看待 Java 語言的演變。
Goetz 說,“我花了很多時間研究其他語言的做法。我們覺得,對于應該如何推進這項工作,我們現在已經有了一個相當清晰的認識。”
在 Reddit 上,Goetz 將他的演講描述為“陳述可能的發(fā)展方向”。目前還沒有正式的 Java 增強提案,他表示,“這實際上是我們第一次詳細討論這個問題??傄獜哪硞€地方開始。”
這是一個絕佳的機會,不僅能見證編程語言的演變歷程,更能窺見推動這些決策背后的深邃哲學。
1 “可成長”語言的哲學
在演講開始時,Goetz 強調,他不是要談論“計劃立即交付的特性”。相反,他將看一些長遠來看“更具啟發(fā)性的例子”。Goetz 將演講標題定為“Java 語言的成長(Growing the Java Language)”是有原因的。Goetz 記得,1998 年,Sun Microsystems 計算機科學家 Guy Steele 發(fā)表過一篇著名的論文(和 演講),標題是“一門語言的成長(Growing a Language)”。
Goetz 說,Steele 發(fā)出了“一個行動號召,要求語言設計者將可成長性作為編程語言設計的核心維度之一?!?/p>
雖然許多語言允許用戶通過用戶創(chuàng)建的庫來擴展“詞匯”,但 Steele 指出,如果新詞匯看起來與語言自己的基本“原語”不同,那無疑會增加困難。Goetz 說,“在很多方面,這篇論文是 Valhalla 項目的發(fā)令槍”——這是一個始于 2014 年的 OpenJDK 項目,由 Goetz 領導,旨在孵化新的 Java 語言特性。
因此,Goetz 想要描述的不是 Java 的新特性,而是一種語言演變哲學——在添加 新的 Java 特性 時優(yōu)先考慮可擴展性——及其實現機制。Goetz 的幻燈片上有這樣一句話,“有人會說這太過分了,有人會說這還不夠。”
“而我們就是這樣知道我們……正好在中間。”
2 在 Java 中引入一個新概念:Witness
那么這個新理念是什么呢?Java 的方法定義接口被稱為“行為藍圖”。Goetz 表示,現在“我們希望實現接口的所有功能——將一組命名行為歸入命名集合(named bundle),用于聲明某種類型或某組類型(并允許編譯器進行類型檢查)?!?/p>
這里有一個關鍵的區(qū)別:Java 語言設計團隊希望它是關于類型的,而不是類型實例。
有一張幻燈片解釋說,“我們想將這種行為轉移到第三方 witness 對象上”。
為此,只需提議增加一個簡單直接的關鍵字——一個 witness 字面量。這樣一來:
public static final Comparator COMPARATOR =
就變成:
public static final witness Comparator COMPARATOR =
后來,Goetz 向聽眾解釋說,“在 Java 中添加類型類,只需在現有的語言結構(如接口、字段和方法)上添加相對較少的內容——一個發(fā)布 witness 的機制和一個查找 witness 的機制。”
為什么不直接定義包含所有所需方法的接口,然后讓類實現那個接口呢?Goetz 指出,事實證明這種抽象方式并不總是有效,它會讓語言設計者面臨大量棘手的邊界情況和“陷阱”。。
Goetz 的下一張幻燈片解釋說,這是“真的用錯了工具?!?/p>
“我們需要某種與接口相似但又不完全相同的東西?!盚askell 有類型類(“對類型本身進行抽象,而不是類型的行為”),而 C# 和 Kotlin 都在“進行他們自己的一系列探索”。C# 社區(qū)提出了類似的東西:shape 和 extension。
“所有這些都是圍繞同一個問題,那就是:如何抽象類型的行為,而不把它作為類型定義的一部分?”
3 發(fā)展機遇:潛在的新 Java 特性
Goetz 說,這個想法已經迭代了許多次,“我們已經將其提煉成更符合 Java 的東西,比之前的一些想法更簡潔?!?/p>
有一張幻燈片說,“這是關于語言成長的”。Goetz 看到了“可成長性”的巨大潛力,并提出了幾個新的潛在特性:
新的數值類,但與“原始類型的運行時行為一樣”——比如 16 位浮點數。
數學運算符。Goetz 說,對于 Float16 變量來說,使用標準的加號“就非常好”,而不是單獨的方法。其他語言已經嘗試了這種所謂的“運算符重載”——根據涉及的變量類型,將符號與多個操作關聯起來。Goetz 說,這“在某種程度上是語言的雷區(qū)……許多語言都在使用運算符重載時都遭遇了各種災難性的問題。”
集合表達式,“用于構建類似序列的結構”,類似于 C# 中提供的功能。“在規(guī)范層面上,這是一個‘你為什么不直接……’的問題。但這似乎是一條可行的路徑,不像 Java 7 時代的提議那樣不可行?!?/p>
創(chuàng)建型表達式(Creational expression)。在創(chuàng)建數組時,元素的值默認總是“null”或零。如果有一個 witness 可以表明何時存在(和不存在)有效的“空白”值會怎樣?Goetz 說,在 Valhalla 項目中,在初始化數組時添加有效性檢查“一直是我們比較猶豫的一個特性”,因為他們不想把它添加到 Java 虛擬機(VM)中。但“這種方法可以將該特性保留在語言中,同時又允許特定的類在參與該特性時以是否需要做額外的工作為依據。因此,這意味著我們可以將這種行為放到一個合適的地方,這感覺很好?!?/p>
多功能語言擴展并非沒有先例。Goetz 提到了兩個早期的“使用庫擴展語言特性的著名例子”——foreach 循環(huán)和 try。開發(fā)者只需實現 Iterable 類就可以使用 foreach 特性。(Goetz 說,為了實現 Iterable,JDK 的開發(fā)者隨后“對許多類進行了改造”——其他 Java 開發(fā)者也這樣做了。)但最重要的是,它看起來就像是“內置的”。
Goetz 很高興 Java 沒有將該特性限制在少數幾個顯而易見的用例(如列表、映射和集合)中。“我真的很高興有人站起來說,‘不,不,除了少數魔法類之外,其他類能夠參與其中真的很重要。’”
Goetz 說,他想延續(xù)這一傳統。
4 Java 未來發(fā)展路線圖
在演講結束時,Goetz 說,它不僅展示了 witness 的概念,還勾勒出了“如何將其用于四個潛在的特性,而這些特性已經困擾我們很長時間了?!?/p>
展望未來,Goetz 相信,witness 將“使你能夠設計出更好、更豐富的特性,讓用戶可以做更多事情的特性。最終,我們將來也許不再需要設計那么多的語言特性。……從長遠來看,希望我們能夠利用這一點來構建功能更豐富的通用庫和條件行為等?!?/p>
“但短期內,我們可以用它來提供可擴展的語言特性,包括人們長期以來一直希望添加的特性?!?/p>
Reddit 上有一位評論者后來甚至開玩笑 說,Goetz 的演講讓他們想起了“龍與地下城”中的法術?!敖^對有那么一個時刻,我感覺 Brian 馬上就要施放魔法飛彈了?!?/p>
他后來補充說,“這是一次很好且非常有趣的演講。我希望這些特性能夠實現?!钡?Goetz 的最后一張幻燈片清楚地說明了我們目前所處的位置?!扒皫讖埢脽羝械睦舆€不是設計,只是想法。”
盡管如此,在 另一條 Reddit 評論 中,Goetz 表示,Java 設計團隊現在有一個讓他們“感到舒適”的故事,“所以我們準備分享它。但請注意,那仍然是一個故事,還需要 Valhalla 項目先完成許多事?!?/p>
Goetz 的演講贏得了熱烈的掌聲,隨后他開始接受觀眾的提問。首位提問者坦言,他看到了該理念的巨大價值,并稱 Goetz 的演講是“一個相當宏大的提案,卻只需要相當小的語法變更”。
Goetz 的回應?“噓,別告訴他們!”
https://thenewstack.io/java-language-architect-brian-goetz-on-how-java-could-evolve
聲明:本文為 InfoQ 翻譯,未經許可禁止轉載。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.