私の知る限り、現代のすべての命令型プログラミング言語は、プロシージャがそれ自体を呼び出すことができるという意味で再帰をサポートしています。これは必ずしもそうではありませんでしたが、簡単なGoogle検索で難しい事実を見つけることはできません。だから私の質問は:
最初から再帰をサポートしていなかったのはどの言語で、そのサポートはいつ追加されましたか?
私の知る限り、現代のすべての命令型プログラミング言語は、プロシージャがそれ自体を呼び出すことができるという意味で再帰をサポートしています。これは必ずしもそうではありませんでしたが、簡単なGoogle検索で難しい事実を見つけることはできません。だから私の質問は:
最初から再帰をサポートしていなかったのはどの言語で、そのサポートはいつ追加されましたか?
回答:
COBOLがそうするかどうかは確かではありません(確かに一度もそうではありませんでしたが)。
FortranにはFortran 90以降がありますが、recursive
キーワードを使用して、サブルーチンが再帰的であることを伝える必要があります。
PL / Iはほぼ同じでした。再帰はサポートされていましたが、どのプロシージャが再帰的であるかを明示的に指定する必要がありました。
しかし、それ以上のものがあるとは思いません。簡単に言うと、IBM(360/370/3090 / ...)メインフレームはハードウェアのスタックをサポートしていないという単純な理由から、再帰を禁止することは、IBMが言語設計で行うことでした。ほとんどの言語がIBMから来たとき、彼らはほとんど再帰を禁止しました。それらはすべて他の場所から来ているので、再帰は常に許可されます(ただし、他のいくつかのマシン、特に元のCray 1もスタックのハードウェアサポートを持っていなかったことを追加する必要があります)。
notably the original cray 1
それでは、恐竜のクローンを作成するのに再帰は必要ありませんか?サルが木々の間を揺れるのは本当に私たち次第だと思います。
ウィキペディアによると:
Fortranのような初期の言語は、変数と戻りアドレスの場所が静的に割り当てられていたため、最初は再帰をサポートしていませんでした。
http://en.wikipedia.org/wiki/Subroutine#Local_variables.2C_recursion_and_re-entrancy
FORTRAN 77では再帰が許可されていませんが、Fortran 90では許可されています(再帰ルーチンは明示的に宣言する必要があります)。
ほとんどのFORTRAN 77コンパイラは再帰を許可し、一部(DECなど)はコンパイラオプションを使用する必要があります(コンパイラオプションの章を参照)。Fortran 77標準に厳密に準拠しているGNU g77は、再帰をまったく許可していません。
小さなマイクロコントローラー用の一部のcコンパイラーは、おそらくスタックサイズが極端に制限されているため、再帰をサポートしていません。
「サポート」の意味によって異なります。再帰をサポートするには、再入のたびにローカル変数を再インスタンス化するスタックが必要です。
言語にローカル変数の概念がなくても、「サブルーチン」の概念があり、同一変数(別名配列)間のインデックス作成を管理する方法がある場合、入力/終了ごとにグローバルインデックスをインクリメント/デクリメントできます。関数の1つ以上の配列のメンバーへのアクセス。
これが「サポート」と呼ばれるかどうかはわかりません。事実は、COBOLのようにFortran77で行ったように、ZX-Spectrum BASICで再帰関数を作成したということです...常にそのトリックで。
アセンブリ言語は再帰を直接サポートしていません-通常はマシンスタックにパラメーターをプッシュすることで、「自分で実行する」必要があります。
CALL
、サブルーチンにジャンプする前にIPを自動的にスタックにプッシュするRET
命令と、リターンアドレスをIPにポップする命令があります。CALL
独自のエントリポイントを取得できない理由はありません。
void f() { f(); }
再帰的です。