3 回答

TA貢獻1883條經驗 獲得超3個贊
這篇文章:遞歸或迭代?可能有幫助。
簡而言之,由于安全模型以及始終需要堆棧跟蹤的需要,在JVM中很難進行尾調用優(yōu)化。理論上可以支持這些要求,但可能需要一個新的字節(jié)碼(參見John Rose的非正式提案)。
在Sun bug#4726340中也有更多的討論,評估(從2002年)結束:
我相信這可以做到,但這不是一項小任務。
目前,Da Vinci Machine項目正在進行一些工作。尾調用子項目的狀態(tài)列為“proto 80%”; 它不太可能進入Java 7,但我認為它在Java 8上有很好的機會。

TA貢獻1815條經驗 獲得超10個贊
基本限制只是JVM不在其字節(jié)代碼中提供尾調用,因此,構建在JVM上的語言本身沒有直接提供尾調用的方法。有一些解決方法可以達到類似的效果(例如蹦床),但它們會帶來糟糕的性能和混淆生成的中間代碼,這使得調試器無用。
因此,在Sun實現(xiàn)JVM本身的尾調用之前,JVM不能支持任何生產質量的函數(shù)式編程語言。他們多年來一直在討論它,但我懷疑它們是否會實現(xiàn)尾調用:它將非常困難,因為它們在實現(xiàn)這些基本功能之前過早地優(yōu)化了它們,而Sun的工作主要集中在動態(tài)語言而不是函數(shù)語言上。
因此,有一個非常強烈的論點,即Scala不是一種真正的函數(shù)式編程語言:自從30多年前首次引入Scheme以來,這些語言一直認為尾調用是一個必不可少的特性。

TA貢獻1876條經驗 獲得超5個贊
Scala 2.7.x支持對最終方法和本地函數(shù)的自遞歸(一個函數(shù)調用自身)進行尾調用優(yōu)化。
Scala 2.8也可能帶有對trampoline的庫支持,這是一種優(yōu)化相互遞歸函數(shù)的技術。
有關Scala遞歸狀態(tài)的大量信息可以在Rich Dougherty的博客中找到。
- 3 回答
- 0 關注
- 667 瀏覽
添加回答
舉報