3 回答

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

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

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