什麼改動JVM將獲益最多Scala編譯器和運行?提高對JVM斯卡拉
動態語言將從計劃到達JVM 7的InvokeDynamic
字節代碼的引入中獲益良多,並且Scala可能會從尾遞歸中獲益(不確定它是否會出現在JVM 8或更高版本中)。
Scala可以通過JVM獲得哪些其他功能?這些變化是否在地平線上?
具體來說,是否有更改的JVM,可以提高性能與封閉和函數作爲對象?
什麼改動JVM將獲益最多Scala編譯器和運行?提高對JVM斯卡拉
動態語言將從計劃到達JVM 7的InvokeDynamic
字節代碼的引入中獲益良多,並且Scala可能會從尾遞歸中獲益(不確定它是否會出現在JVM 8或更高版本中)。
Scala可以通過JVM獲得哪些其他功能?這些變化是否在地平線上?
具體來說,是否有更改的JVM,可以提高性能與封閉和函數作爲對象?
基本上,約翰·羅斯已經競選:)
Fixnums一切 - 解決裝箱/拆箱圖元的成本。
方法處理 - 將加速高階函數並允許JVM更有效地優化它們。 SAM類型有時需要單態和megamorphic調用點之間的尷尬翻轉/假摔,防止內聯。
Continuations - 支持異步/並行設計,按照的node.js
Interface Injection - 簡化混入組合物和角色的實施,以及消除了對生成一些中間類和使結構類型的需要在許多情況下可能沒有反思。
尾部調用優化 - 應該是一個沒有腦子:)
物化經常被引述的東西,將有利於Scala的模式匹配,但是這將在互操作方面付出了高昂的代價,考慮到兩種語言使用的不同方差方案。在這一點上,我認爲物化可能會造成更多的傷害。
我也認爲期望任何會破壞Java向後兼容性的東西是不合理的。那不會發生。
有一對夫婦的,將在JVM可以更好地實現斯卡拉的功能,例如有:
泛型在運行時可以訪問。目前,scalac保存類型仿製藥隱藏字段(如果有問題的類是一個案例類)。這使得類的泛型不必要地昂貴。
聲明站點差異。斯卡拉指定在定義站點類型參數的變化,而Java在調用網站這樣做。這是不太可能得到修復,因爲它會打破所有現有的Java通用代碼。
尾部呼叫優化。 Scalac可以做它自己的一些尾調用優化的,但只有在最簡單的(自遞歸)的情況下。任何其他的尾部調用都會像使用JVM一樣使用堆棧空間。
刪除空指針。斯卡拉已經可以處理空參與選項[A],但因爲是在JVM上的參考選項本身可能爲空,或者它的參數可以爲空。所以你不能像Haskell那樣獲得非空的保證。
編輯:添加聲明網站差異列表。
具體化將是一件壞事,除非它是在聲明網站差異的條件下實施的。考慮到Java與使用站點差異一起工作,這非常不可能。根據Java的變化實現的實現會主動地傷害互操作。 – 2011-04-18 22:10:14
@凱文:好點!對此暫時忘了。 – keiter 2011-04-18 22:54:33
另外,獲得空值的祝你好運......你需要它:) – 2011-04-19 17:52:40
人們經常關注InvokeDynamic - 沒有意識到MethodHandles框架有很多其他優點,即使MH提供的方法引用從不動態調用。
MethodHandles幾乎就像「Reflection done right」的表現形式。
任何大量使用反射的語言都可以從在語言運行時中使用MethodHandles中獲益。
值類型將有助於元組和案例類的相當多的性能。轉義分析有助於減少此類對象的堆分配,但目前JVM無法足夠積極地嵌入某些方法調用,因此無法消除這些小型不可變對象的堆分配。這會導致堆垃圾和執行時間增加3-4倍。
值類型還有助於增加數據的局部性並減少內存使用量。例如,在一個簡單的Array [(Int,Int)]中,每個數組條目都會有一個指針+對象頭的開銷。通過價值類型,這種開銷可以完全消除。
我聽說有傳言說他們也會來。 Oracle對Java的興趣太高,因爲HPC需要堆棧分配複數和矩陣。 – 2011-04-20 09:47:58
@Kevin Wright:我聽說Mono在HPC圈子裏實際上很流行。它比JVM更受歡迎,因爲CLI *具有值類型,比Microsoft的CLI實現更受歡迎,因爲CLI允許數組索引爲32位或64位,Mono選擇64而MS選擇32。 HPC傢伙只是喜歡*數組中有數十億便宜價值的數組。鑑於這一點(還有[Fortress](http://ProjectFortress.Java.Net/))的存在,對於Oracle來說,這只是有意義的,即使只是爲了吹噓IBM :-) – 2011-04-21 12:16:47
事實上:將虛擬化泛型放入虛擬機中只會*幫助Java。期。它確實是錯誤的。相反的方法是正確的方法:通過使字節碼變爲非類型化並讓每種語言實現它們自己的類型系統,而不是在所有JVM語言上強制使用Java類型系統,從而將JVM從Java中分離出來。如果你感覺很勇敢,爲JVM字節碼實現一個可插入類型系統。 (請注意,在字節碼中代表*類型的廉價方法將是一件好事。) – 2011-04-19 01:51:30