スタックオーバーフローの仕様の続き

いろいろコメントをいただきました。ありがとうございます。

問題点を整理すると、
1. 「無限に再帰呼び出しをする」という意味は、リソースが有限な現実のコンピュータでは実現不可能である (末尾再帰だけとか特殊な例はできるけど、一般的には無理だと思う) 。
2. C 言語の規格を流し読みする限り、くだんのプログラムは「無限に再帰呼び出しをする」という意味になりそう。そうならない理由が見つからない。
3. 1 と 2 より、現実のコンピュータで C 言語の規格に完全に準拠することは不可能である。
で、それはなんか変な気がしたので、2 が間違ってるかと思って聞いてみたのでした。

具体的に何を心配しているかというと、例えば、ものすごくスタックが短くて main 関数の呼び出しすら失敗するような環境 *1 でも、「C 言語の規格に準拠しています」と言っていいんでしょうか。別にいいのか。

ちなみにこの問題を解決するような規格は作れると思っています。例えば Java の言語仕様では

If there is not sufficient memory available to create such an activation frame, an StackOverflowError is thrown.

15.12.4.5 Create Frame, Synchronize, Transfer Control

となっているようです。memory とかの用語はどっかで定義してるんでしょう、多分。


しかしよく考えたら、例えばλ計算チューリングマシンに基づいた他の言語の仕様でも、現実のコンピュータで実現できないことは implementation-defined とせざるを得ないわけですよね。C 言語も実は同様で、規格には明記せず、各実装はそのあたりを未定義挙動としているのかな。つまり「現実のコンピュータで C 言語の規格に準拠することはできない」は真であると。
しかし C 言語の規格はポータビリティのためにやたら細やかな limitation を規定している *2 ので、再帰回数の上限にも一言あってもいいと思うんですよね。Rationale あたりになんか書いてあるのかな。まあ規格書も拾い読みしかしてないんで、見落としてる可能性はものすごくあるんですが。


あと、てっさんに教えてもらった余談。いや、本質?

準拠(じゅんきょ)とは、合致はしていないが、概ね(準)よりどころとしている事(拠)。

wikipedia:準拠

えっ、そうなのか。そんないい加減な話なら、何でもありですね。

*1:C の規格に準拠するのはコンパイラの責任だけでなく、OS やハードウェアも含めた環境全体の責任です。

*2:例えば「ブロックのネストは最低 127 個まではサポートしないといけない」とか。