私の知る限り、現代の命令型プログラミング言語はすべて、プロシージャがそれ自体を呼び出すことができるという意味で再帰をサポートしています。これは常にそうであるとは限りませんでしたが、Googleのクイック検索では難しい事実を見つけることができません。だから私の質問は:
最初から再帰をサポートしていなかった言語と、そのサポートが追加されたのはいつですか?
COBOLがそうであるかどうかは確かではありませんが(確かに一度はそうではありませんでした)、だれもが多くのことを気にしている人を想像することはできません。
FortranはFortran 90以降に使用されていますが、recursive
キーワードを使用して、サブルーチンが再帰的であることを通知する必要があります。
PL/Iはほとんど同じでした-再帰がサポートされていましたが、どのプロシージャが再帰的かを明示的に通知する必要がありました。
それ以外にもたくさんあるとは思いません。それに戻ると、再帰の禁止は、IBM(360/370/3090/...)メインフレームがハードウェアのスタックをサポートしていないという単純な理由で、ほとんどの場合、IBMが言語設計で行ったものでした。ほとんどの言語がIBMから来たとき、それらはほとんど再帰を禁止していました。すべてが他の場所から来ているので、再帰は常に許可されています(ただし、他のいくつかのマシン、特に元のCray 1にはスタックのハードウェアサポートもなかったことを付け加えておきます)。
ウィキペディアは言う:
Fortranのような初期の言語は、変数と戻りアドレスの場所が静的に割り当てられていたため、最初は再帰をサポートしていませんでした。
http://en.wikipedia.org/wiki/Subroutine#Local_variables.2C_recursion_and_re-entrancy
FORTRAN 77は再帰を許可しませんが、Fortran 90は再帰を許可します(再帰ルーチンは明示的に宣言する必要があります)。
ほとんどのFORTRAN 77コンパイラは再帰を許可し、一部(たとえばDEC)はコンパイラオプションを使用する必要があります(コンパイラオプションの章を参照)。 GNU g77はFortran 77標準に厳密に準拠していますが、再帰はまったく許可されていません。
OpenCLプログラミング言語は再帰をサポートしていません。 ( OpenCL仕様 のセクション6.8を参照)
そのための現在の動機は、a)深いスタック用のスペースの不足b)大きなレジスターセットと広範なインラインの存在下でパフォーマンスを最適化するために必要な割り当ての合計を静的に知りたいという欲求です。
これは他のGPUプログラミング言語にも当てはまるかもしれません。シェーダー言語。
小さなマイクロコントローラー向けの一部のcコンパイラーは、おそらくスタックサイズが非常に限られているため、再帰をサポートしていません。
BASICは、行番号の時代には、再帰のサポートが不十分である傾向がありました。その当時の(すべて?)BASICの多くはネストされたgosub呼び出しをサポートしていましたが、パラメーターや戻り値を簡単に呼び出す方法をサポートしていなかったため、自己呼び出しが便利でした。
初期のコンピューターの多くは、(PDP8、IASファミリーのマシン、おそらく私が慣れていないより多くのアーキテクチャー)と呼ばれるルーチンの先頭に戻りアドレスを書き込む呼び出し命令を使用したため、再帰に問題がありました。 「ルーチンを呼び出した命令の次の命令にジャンプする」ためのマシンコードでした。
アセンブリ言語は再帰を直接サポートしていません-通常、マシンスタックにパラメーターをプッシュすることにより、「自分で行う」必要があります。
「support」の意味によって異なります。再帰をサポートするには、すべての再入時にローカル変数を再インスタンス化するスタックが必要です。
言語にローカル変数の概念がない場合でも、「サブルーチン」の概念があり、同一の変数(配列)間のインデックスを管理する方法がある場合は、開始/終了ごとにグローバルインデックスをインクリメント/デクリメントできます。関数のアクセスと、それを介した1つ以上の配列のメンバーへのアクセス。
これが「サポート」と呼べるかどうかわかりません。事実は、私がCOBOLのようにFortran77で行ったように、ZX-Spectrum BASICを使用して再帰関数を記述したことです...常にそのトリックで。