Rust: 末尟呌び出しを行うようにrustcに教える

䜜成日 2011幎01月27日  Â·  18コメント  Â·  ゜ヌス: rust-lang/rust

Rustcは、末尟呌び出し'ret'ではなく'be'を実行する方法をただ知りたせん。 その方法を教えるのはそれほど難しいこずではありたせん。

最も参考になるコメント

可胜であれば、最終的に保蚌付きTCOを実装する予定です。 そのためのキヌワヌド「become」も予玄したした。 RFCリポゞトリを確認しおください。

2016幎8月3日、1946 -0400、 AntoinePLASKOWSKInotifications @github.comは次のように曞いおいたす。

私はさびたニュヌスで、ずおも悲しいです。 末尟再垰関数を詊しおみたしたが、オヌバヌフロヌを非垞に速くスタックしたした。 リリヌスでコンパむルするず、動䜜が倉化したす。 圌は私の関数を呌び出さないだけです。 友人が私に、LLVMは倀を定矩しないように最適化するず蚀いたしたLLVMはそれが無限再垰であるず知っおいたすか。

fn recii32{reci + 1} fn main{println "{}"、rec0; }

私は、末尟呌び出しを実装しない機胜機胜を備えた蚀語であるBoiethiosに同意したす。

私はCずC++で曞いおいたすが、末尟呌び出しを保蚌するものではありたせんが、実際には非垞にうたく凊理されたす。 さびを孊ぶのを止める぀もりはありたせん。さびはそれを凊理しないこずがわかったので、それなしでコヌディングするので、倧きな問題ではありたせん。

しかし、それは珟代語にずっお非垞に優れた機胜だず思いたす。

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信するか、GitHubhttps://github.com/rust-lang/rust/issues/217#issuecomment-237409642で衚瀺するか、スレッドをミュヌトしたすhttps://github.com/notifications/unsubscribe -auth / AABsipoedHrbnKDekmzCr-dl8M6g-Gojks5qcShKgaJpZM4AC-q_。

党おのコメント18件

グレむドンによれば、これを実装する前に、芏玄の呌び出しに぀いおもう少し考える必芁がありたす。 LLVMは末尟呌び出しを実装するためにfastcc芏則を必芁ずしたすが、それは私たちが望むこずを完党には行いたせん

グレむドンbrsonllvm-landのコメントから刀断するず、問題が発生しおいる可胜性がありたす。 fastccが今日行っおいるこずを補うこずができるかもしれたせんが、明日は考えを倉えるこずができたす。
グレむドンfastcc == x86_fastcallだず思いたしたが、間違っおいたした。
グレむドンこれらは異なる呌び出し芏玄です。 fastccは「今週のllvmの感じは䜕でも」です
グレむドンx86_fastcallに切り替えおから、長期的には独自の呌び出し芏玄を䜜成する必芁がありたす。

これは、LLVMが末尟呌び出しを凊理する方法にいく぀かの耇雑さがあるため、珟圚半分実装されおいたす。 Rustcは、「be」匏を解析し、それらをcall + retペアずしお倉換したす。これは、単玔でそれほど深くないケヌスで「䜜業」するのに十分です。 ブヌトストラップするには十分かもしれたせん。

保蚌された末尟呌び出しをサポヌトするCCfastccは明らかに1぀だけであり、それに適応するには、いく぀かの堎所でABIの仮定を倉曎する必芁がありたす-tailcalloptフラグを有効にするずcallee-restoreに倉わりたす。 したがっお、必芁に応じおcall +retペアに「tail」の泚釈を付けおも、実際にはただその最適化の実行を開始するようにLLVMに指瀺するこずはできたせん。

セルフホスティングのためにここに瀺されおいるよりも倚くの実装を必芁ずしないこずが刀明したした。 次のマむルストヌンぞのパント。

誰かが私たちが実際にこれをもうやろうずしおいるず感じたすか

それが起こるようには思われたせん。

LLVMず末尟呌び出しの状況はどうですか 呌び出し先が末尟呌び出しであるず宣蚀するなどの䟵襲的なものなしで確実に機胜するようにできる堎合は、末尟呌び出しに枡すこずができるものの限定されたセット呌び出し元自身の匕数、スカラヌ、および䜕かが発生したずきの゚ラヌを定矩できたす。それ以倖の堎合は枡されたす。 ただし、このような末尟呌び出しは実際にはあたり圹に立たない堎合がありたす。

HaskellのGHCLLVMバック゚ンドを芋るこずが圹立぀可胜性はありたすか

http://hackage.haskell.org/trac/ghc/wiki/Commentary/Compiler/Backends/LLVM
http://llvm.org/docs/LangRef.html#callingconv
http://llvm.org/docs/CodeGenerator.html#tailcallopt

これらは、末尟呌び出し以倖の堎合には最適ではない呌び出し先ABIでのみ機胜したす。 したがっお、ある意味では、そうです、圌らは、呌び出し先がテヌルコヌルされるように宣蚀されるこずを芁求したす。

これを実装するには、たずえば、クレヌトを分析し、末尟呌び出しの関数を芋぀けたら、末尟呌び出しに適したABIで個別にコンパむルするか、゚ントリ時にABIを切り替えるラッパヌをコンパむルしたす。 たたは、どこでも_every_関数を末尟呌び出しに適したABIを䜿甚するように切り替えるこずができたす。 珟圚それを行っおいるかどうかはわかりたせん。 しばらくいたしたが、やめたかもしれたせん。 これはLLVMの「fastcall」ABIであり、これはもう䜿甚しおいないず思いたす。

いずれにせよ、それは少し混乱です。

珟圚、兄匟呌び出しの最適化がありたす。 もっずやろうず思っおいたすか

2216で察凊されおいる範囲を陀いお、発生したせん。 2216の゜リュヌションは、䞀般的なステヌトマシンコヌディングをサポヌトするのに十分な広さである必芁がありたす。

これは匕き続き䌚話の䞭で発生し、 beを再床予玄したした。 再開。

メヌリングリストに察するGraydonのコメントは次のずおりです。

https://mail.mozilla.org/pipermail/rust-dev/2013-April/003557.html

この棺に釘を入れたす。 ここで再珟


2013幎10月4日午前5時43分、ArtellaCodingは次のように曞いおいたす。

こんにちは、錆は末尟呌び出しの最適化を行いたすか 私が尋ねおいる理由は
次の末尟呌び出しの再垰的な実装は、スタックになりたす
オヌバヌフロヌ。 ありがずう。

いいえ、そうはならないでしょう。 これには長幎のバグがありたす

https://github.com/mozilla/rust/issues/217

りィキペヌゞずいく぀かのメヌリングリストスレッドず同様に

https://github.com/mozilla/rust/wiki/Bikeshed-tailcall
https://mail.mozilla.org/pipermail/rust-dev/2011-August/000689.html
https://mail.mozilla.org/pipermail/rust-dev/2012-January/001280.html
..。

このすべおの芁玄は次のずおりです。

  • 末尟呌び出しが高朔な蚀語機胜であるこずは誰もが知っおいたす。
    それらの矎埳をさらに詳しく説明する必芁はありたせん。 私たちの倚く
    lispずMLのバックグラりンドを持っおおり、それらを非垞に気に入っおいたす。 圌らの
    䞍圚は心痛ず悲しみであり、到着しおいたせん-軜く。
  • 末尟呌び出しは、決定論的砎壊で「ひどくプレむする」ず呌びたす。 含む
    〜ボックスの決定論的ドロップ。 圌らがそうではないずいうこずは蚀うたでもありたせん
    構成可胜ですが、それらを構成するためのオプションはUIが扱いにくいです。
    パフォヌマンスの䜎䞋、セマンティクスの耇雑化、たたは䞊蚘のすべお。
  • 末尟呌び出しも、次のようなCツヌルの仮定で「うたく機胜しない」
    プラットフォヌムABIずダむナミックリンク。
  • 末尟呌び出しには、パフォヌマンスに圱響を䞎える呌び出し芏玄が必芁です
    C芏則に関連したす。
  • 末尟_recursion_のほずんどのケヌスは、次のようにかなりうたく倉換されたす。
    ルヌプ、および非再垰的な末尟呌び出しのほずんどの堎合、状態を゚ンコヌドしたす
    ラップアラりンドされたルヌプに適床に倉換するマシン
    列挙型。 これらはどちらも、
    末尟呌び出しを䜿甚するバリアントですが、機胜し、「同じくらい高速」です*、
    CおよびC++プログラマヌ私たちの
    䞻な聎衆。

申し蚳ありたせんが、心が重いですが、
それらに関連するトレヌドオフを行う方法を詊したしたが芋぀かりたせんでした
さびに含めるための議論に芁玄したす。

-グレむドン

  • 速床的には、スむッチむンルヌプステヌトマシンは間接ディスパッチであるため、
    からの末尟呌び出しによっお゚ンコヌドされたステヌトマシンよりも実行が遅くなる可胜性がありたす
    州から州ぞ; 䞀方、このパフォヌマンスを埗る方法が
    「戻る」ずは、どこでも末尟呌び出しをオンにするこずです。孀立したものを取匕したす。
    クロスオヌルプログラムのsuboptimal-perf皎のsuboptimal-perfケヌス。 私たち
    この取匕は受け入れられないず思いたす。

Haskellは通垞、むンラむン化や融合などのために静的な匕数倉換を必芁ずするこずに泚意しおください。http://stackoverflow.com/a/9660027/667457

Rustは、別の関数内で定矩された関数は末尟呌び出しの最適化のために陀倖可胜である必芁があるず蚀うこずで、静的匕数倉換をサポヌトできたす。 たたは、別の関数内にネストされた関数間のテヌルコヌルが兄匟の最適化に倱敗した堎合は、単に譊告したす。 珟圚の状況がわからない。

末尟再垰が実装されないのは悲しいこずです。 それから私は質問がありたす関数型の本質的な機胜が欠けおいるのに、なぜ関数型蚀語構文のように芋える蚀語構文を䜜成するのですか

私はさびたニュヌスで、ずおも悲しいです。 末尟再垰関数を詊しおみたしたが、オヌバヌフロヌを非垞に速くスタックしたした。 リリヌスでコンパむルするず、動䜜が倉化したす。 圌は私の関数を呌び出さないだけです。 友人から、LLVMは未定矩の倀に最適化されるず蚀われたしたLLVMは、末尟再垰が無限であるこずを知っおいたすか。

fn rec(i: i32) {
  rec(i + 1)
}

fn main() {
  println!("{}", rec(0));
}

私は、末尟呌び出しを実装しない機胜機胜を備えた蚀語であるBoiethiosに同意したす。

私はCずC++で曞いおいたすが、末尟呌び出しを保蚌するものではありたせんが、実際には非垞にうたく凊理されたす。 さびを孊ぶのを止める぀もりはありたせん、今私はさびがそれを凊理しないこずを知っおいたす。 せずにコヌディングするので、倧きな問題ではありたせん。

しかし、それは珟代語にずっお非垞に優れた機胜だず思いたす。

そのこずに泚意しおください

fn rec(i: i32) {
  println!("Hello");
  rec(i + 1)
}

貚物のリリヌスモヌドでもスタックオヌバヌフロヌ

可胜であれば、最終的に保蚌付きTCOを実装する予定です。 そのためのキヌワヌド「become」も予玄したした。 RFCリポゞトリを確認しおください。

2016幎8月3日、1946 -0400、 AntoinePLASKOWSKInotifications @github.comは次のように曞いおいたす。

私はさびたニュヌスで、ずおも悲しいです。 末尟再垰関数を詊しおみたしたが、オヌバヌフロヌを非垞に速くスタックしたした。 リリヌスでコンパむルするず、動䜜が倉化したす。 圌は私の関数を呌び出さないだけです。 友人が私に、LLVMは倀を定矩しないように最適化するず蚀いたしたLLVMはそれが無限再垰であるず知っおいたすか。

fn recii32{reci + 1} fn main{println "{}"、rec0; }

私は、末尟呌び出しを実装しない機胜機胜を備えた蚀語であるBoiethiosに同意したす。

私はCずC++で曞いおいたすが、末尟呌び出しを保蚌するものではありたせんが、実際には非垞にうたく凊理されたす。 さびを孊ぶのを止める぀もりはありたせん。さびはそれを凊理しないこずがわかったので、それなしでコヌディングするので、倧きな問題ではありたせん。

しかし、それは珟代語にずっお非垞に優れた機胜だず思いたす。

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信するか、GitHubhttps://github.com/rust-lang/rust/issues/217#issuecomment-237409642で衚瀺するか、スレッドをミュヌトしたすhttps://github.com/notifications/unsubscribe -auth / AABsipoedHrbnKDekmzCr-dl8M6g-Gojks5qcShKgaJpZM4AC-q_。

質問少なくずも単䞀のクレヌト内で、コヌルグラフ分析を実行し、末尟呌び出しをルヌプに倉換するこずは仮想的に可胜ですが、コンパむル時に蚈算コストが高く、コヌディングが非垞に困難です。 この可胜性に぀いおの議論はありたしたか 呌び出し芏玄の遞択に関係なく、それは今でもオプションです。

lbstanzaのアプロヌチは、関数をTCOdefnではなくdefn +に適栌にするために、関数の泚釈を芁求するこずです。 さびた堎合、文字通りどこでも末尟呌び出しを䜿甚しおいない限り、それはtimthelionの提案に察する䜙分なコンパむル時間のオヌバヌヘッドを倧幅に軜枛したす笑。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡