私はcとpythonでプログラミングするときに再帰を使っていますが、他の多くの言語でも使われていると思いますが、どのようにコンパイラが実際に再帰関数を解釈しますか?それはそれ自身の定義でどのように関数を使用することができますか?コンパイラは再帰をどのように理解していますか?
答えて
が、どのようにコンパイラが実際に再帰関数を解釈していますか?それはそれ自身の定義でどのように関数を使用することができますか?
これを理解するには、コンパイラが関数をどのように解釈するかを理解する必要があります。 Cの場合、関数は単なるシンボル、またはメモリ内のエントリアドレスを指すポインタです。直観的には厳密にはそうではありませんが、関数呼び出しはそのようなアセンブル命令にコンパイルされます。
CALL address_of_function
参照してください。コンパイラは、関数が再帰的かどうかを知る必要はありません。それは単にCPUが機能エントリのアドレスにジャンプし、命令を実行し続けるだけです。
そのため、その定義が完了していなくてもその機能を使用することができます。コンパイラは開始アドレスまたはシンボルを知る必要があり、ジャンプする場所を知るだけです。関数の本体は後で生成することができます。
ただし、のテール再帰を知りたい場合があります。これは、一般的に関数型プログラミング言語では特殊なケースです。 「末尾再帰」は、再帰関数呼び出しが関数定義の最後の文であることを意味します。前述の@ paulsm4のように、関数を呼び出すとき、コンパイラはコンテキストとパラメータをスタックにプッシュし、コンテキストをリカバリし、そこから戻り値を取得する必要があります。したがって、あなたの関数がそれ自身を呼び出して、次にそれ自身を呼び出すと、メモリがなくなるまでスタックは深くなります。しかし、関数呼び出しが関数定義の最後のステートメントであれば、スタックにコンテキストを保存する必要はなく、単に上書きすることができます。したがって、関数が無限に呼び出しても、スタックはオーバーフローしません。
これは完全にコンパイラ依存ですが、ほとんどの言語のほとんどのコンパイラはスタックを使用して再帰を実装しています。
コンパイラは、プログラムの引数をプッシュし、現在のスタックポインタとフレームポインタを保存したコードを生成し、(新しく更新されたスタックを使用して)同じ関数を呼び出します。ここで
は非常に良い記事です:Understanding the stack
- 1. Delphi 2009コンパイラは再帰インラインメソッドをどのように処理しますか?
- 2. コンパイラ/アセンブラはどのようにプロセッサコアレジスタを理解していますか?
- 3. Python再帰関数を理解しようとしています
- 4. コンパイラの再帰的閉包のモデリングの理解
- 5. 再帰の理解
- 6. 再帰の使い方を理解しようとしているC#
- 7. コンパイラはどのようにスコープを解決しますか?
- 8. コンパイラはどのようにメモリフットプリントを管理しますか?
- 9. 再帰関数のエラーについて理解していますか?
- 10. 再帰の仕組みを理解しようとしている
- 11. どのように再帰関数を管理するには?
- 12. 理解再帰はエリクシール
- 13. 再帰関数で関数が未定義に戻る理由を理解しようとしています
- 14. 再帰またはリストの理解?
- 15. 再帰なしでこれをどのように解決できますか?
- 16. 再帰はどのようにVerilogで動作しますか?
- 17. リニア再帰はどのように機能しますか?
- 18. 再帰関数の理解
- 19. この再帰関数を理解していない
- 20. どのようにこの再帰的なオーバーフローを解決できますか?
- 21. mergesortの再帰を理解する
- 22. 私はこの再帰の使用を理解していません
- 23. どのようにしてctagsファイルを再帰的に作成しますか?
- 24. linuxのperfユーティリティはスタックトレースをどのように理解していますか?
- 25. rxjava、どのように再試行するか(retryWhen)特定の状況を理解していますか?
- 26. re.sub()はユニコードをどのように理解していますか?
- 27. どのように再帰で連続シーケンスのギャップを解決するには?
- 28. コンパイラはどのように解析されたトークンツリーを評価しますか?
- 29. 再帰関数pythonを理解する
- 30. Python再帰を理解する
逆に、多くのコンパイラは再帰について何も知らないと思います。機能が自分自身を呼び続けることが起こるということは、主にあなたの目にだけです。 –
他の機能を使用するのと同じ方法です。 – SLaks