問題タブ [tail-call-optimization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
loops - Lua末尾呼び出しとループ
私はCプログラムに埋め込むためにLuaで小さなCLIモジュールを書いています。
末尾呼び出しとループのどちらかを選択して、プロンプトを処理するための最良のアプローチは何であるか疑問に思いました。
末尾呼び出しとして、私は次のようなことをします:
私は次の質問をします:
末尾呼び出しの除去の正しい使用/実装ですか?末尾呼び出しの除去
call[cmd] ()
を利用しないように、スタックに障害が発生しますか?次のようなループを使用する方が良いですか?はいの場合、なぜですか?
/li>Luaでのプログラミングでは
末尾呼び出しは、呼び出しに扮した後藤です。
では、末尾呼び出しとループの間に具体的な違いはありますか?
ありがとうございました。
go - Goでの末尾呼び出しの最適化
現在のところ、Goプログラミング言語は末尾呼び出しを最適化していますか?そうでない場合は、少なくとも関数の末尾再帰呼び出しをそれ自体に最適化しますか?
c - C で末尾呼び出しの最適化を保証する
重複の可能性:
末尾再帰の最適化を行う C++ コンパイラはどれですか?
私は教育目的で Lisp に似た言語の小さなランタイムを作成していますが、私の言語では C コードに依存しているため、C コードが末尾呼び出しに最適化されていることを確認したいと考えています。テールコール再帰が最適化されることを保証するコンパイラはありますか? もしそうなら、再帰を最適化するためのルールについてのドキュメントはありますか?
明らかに、gcc または clang が適していますが、コードはそれに依存しているため、コードが適切に最適化されていることを確認する必要があります。
haskell - Haskell には末尾再帰の最適化がありますか?
今日、UNIX で「time」コマンドを発見し、それを使用して、Haskell の末尾再帰関数と通常の再帰関数の実行時間の違いを確認しようと考えました。
私は次の関数を書きました:
これらは、このプロジェクトでのみ使用するためのものであることを念頭に置いて有効であるため、わざわざゼロや負の数をチェックしませんでした.
ただし、それぞれのメイン メソッドを記述し、それらをコンパイルし、「time」コマンドで実行すると、どちらも、通常の再帰関数が末尾再帰関数を縁取る同様のランタイムになりました。これは、Lisp の末尾再帰最適化に関して私が聞いたこととは反対です。これの理由は何ですか?
c++ - C++ 11 はラムダの末尾再帰呼び出しを最適化しますか?
次のテスト コードで観察されるように、私の暫定的な答えはノーです。
ラムダで再帰的な末尾呼び出しを最適化するようにコンパイラに強制する方法はありますか?
よろしくお願いします。
編集
C++11 がラムダの再帰的な末尾呼び出しを最適化するかどうかを尋ねるつもりだったことを明確にしたかっただけです。私は Visual Studio 2012 を使用していますが、GCC が目的の最適化を行うことが確実にわかっている場合は、環境を切り替えることができます。
lisp - リストに要素を追加する末尾再帰関数
リストに要素を実装append
する例をいくつか見てきましたが、すべて末尾再帰を使用していません。そのような機能を機能的なスタイルで実装する方法は?
lua - lua での末尾呼び出しの最適化
Lua は、末尾呼び出しを適切に実装しているため、呼び出しごとにスタックを維持する必要がないため、無限再帰が可能であると主張しています。合計関数を作成しようとしました。1 つは末尾呼び出しではなく、もう 1 つは末尾呼び出しです。
無テイルコールバージョン
期待通りのスタックオーバーフロー。
テールコールバージョン
この場合はテールコールであるため、スタックオーバーフローは発生しないと思いますが、スタックオーバーフローが原因で失敗しました。
lua は本当に末尾呼び出しの最適化をサポートしていますか、それとも私の関数は実際には末尾呼び出しではありませんか?
redhat 5でlua 5.1.4を使用しています
c - Arduinoは末尾呼び出しの除去をサポートしていますか?
標準のArduino環境が末尾呼び出しの除去をサポートしているかどうか疑問に思っていました...誰かがそれについて何か知っていますか?
optimization - 末尾呼び出しの最適化はパフォーマンス/CPU をターゲットにしますか、それともメモリを節約するだけですか?
コードが最適化されたテール コールの場合、最適化されていないコードと比較して、パフォーマンス/複雑性が優れているか、CPU リソースの消費が少ないか、それともメモリのみを節約し、他には何も節約しないか?
c - このコードが gcc と llvm の末尾呼び出しの最適化を妨げるのはなぜですか?
Linux の gcc 4.4.5 と Mac OSX (Xcode 4.2.1) の gcc-llvm で次のコードを試しました。以下は、関連する関数のソースと生成された逆アセンブリです。(追加: でコンパイルgcc -O2 main.c
)
と は、 (と無関係なand ) の引数の横にある (のアドレス) 演算子を除いて、ほとんど同じであるg()
ことがわかります。ただし、テールコールは最適化されており、そうではありません。なんで?h()
&
m
printf()
%ld
%p
h()
g()