亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么JVM仍然不支持尾調用優化?

為什么JVM仍然不支持尾調用優化?

幕布斯6054654 2019-08-27 10:16:12
為什么JVM仍然不支持尾調用優化?在jvm-prevent-tail-call-optimization之后的兩年,似乎有一個原型 實現,MLVM已經將該功能列為“proto 80%”一段時間了。Sun的/ Oracle方面是否沒有積極的興趣支持尾調用,或者只是尾部調用“ 在每個功能優先級列表中排在第二位 [...]”如JVM所述語言峰會?如果有人測試了MLVM構建并且可以分享它的工作效果(如果有的話),我會非常感興趣。更新: 請注意,像Avian這樣的某些虛擬機支持正確的尾部調用,沒有任何問題。
查看完整描述

3 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

診斷Java代碼:提高Java代碼的性能alt)解釋了JVM不支持尾調用優化的原因。

但是,盡管眾所周知如何將尾遞歸函數自動轉換為簡單循環,但Java規范并不要求進行此轉換。據推測,不是要求的一個原因是,通常,轉換不能在面向對象的語言中靜態地進行。相反,從尾遞歸函數到簡單循環的轉換必須由JIT編譯器動態完成。

然后給出了一個不會轉換的Java代碼示例。

因此,正如清單3中的示例所示,我們不能指望靜態編譯器在保留語言語義的同時對Java代碼執行尾遞歸轉換。相反,我們必須依靠JIT的動態編譯。根據JVM,JIT可能會也可能不會這樣做。

然后它給出了一個測試,您可以用它來確定您的JIT是否這樣做。

當然,由于這是一篇IBM論文,它包含一個插件:

我用幾個Java SDK運行了這個程序,結果令人驚訝。在Sun的Hotspot JVM上運行版本1.3顯示Hotspot不執行轉換。在默認設置下,堆棧空間在我的機器上耗盡不到一秒鐘。另一方面,IBM的版本1.3的JVM沒有問題,表明它確實以這種方式轉換代碼。


查看完整回答
反對 回復 2019-08-27
  • 3 回答
  • 0 關注
  • 1059 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號