スタックオーバーフローの公開を記念して、スタックオーバーフローを引き起こす最も短いコードは何ですか?どんな言語でも大歓迎です。
ETA:この質問を明確にするために、私が時々Schemeユーザーであることを確認します。末尾呼び出しの「再帰」は実際には反復であり、適切なコンパイラによって比較的簡単に反復ソリューションに変換できるソリューションは、カウントされます。:-P
ETA2:「ベストアンサー」を選択しました。根拠については、この投稿を参照してください。貢献してくれた皆さん、ありがとう!:-)
スタックオーバーフローの公開を記念して、スタックオーバーフローを引き起こす最も短いコードは何ですか?どんな言語でも大歓迎です。
ETA:この質問を明確にするために、私が時々Schemeユーザーであることを確認します。末尾呼び出しの「再帰」は実際には反復であり、適切なコンパイラによって比較的簡単に反復ソリューションに変換できるソリューションは、カウントされます。:-P
ETA2:「ベストアンサー」を選択しました。根拠については、この投稿を参照してください。貢献してくれた皆さん、ありがとう!:-)
回答:
これらの答えはすべてあり、Befungeはありませんか?私はかなりの額を賭けます、それはそれらすべての最も短い解決策です:
1
冗談じゃない。ぜひお試しください:http : //www.quirkster.com/iano/js/befunge.html
編集:私はこれを説明する必要があると思います。1オペランドはBefungeの内部スタックに1をプッシュし、他に何もないため、言語のルールに従ってループに入れられます。
提供されたインタープリターを使用すると、最終的に(つまり最終的には)、Befungeスタックを表すJavascript配列が大きくなりすぎてブラウザーが再割り当てできなくなる点に到達します。以下のほとんどの言語でそうであるように、小さくて制限されたスタックを持つ単純なBefungeインタープリターがある場合、このプログラムはより顕著なオーバーフローをより速く引き起こします。
" それは、数32の79枚のコピー、それがラップアラウンドするすべての2倍ではなく、数1の2つのコピーロード
C#.netでもこれを試すことができます
throw new StackOverflowException();
ネメルレ:
これにより、StackOverflowExceptionでコンパイラーがクラッシュします。
def o(){[o()]}
私の現在のベスト(x86アセンブリ)は次のとおりです。
push eax
jmp short $-1
これにより、3バイトのオブジェクトコード(50 EB FD)が生成されます。16ビットコードの場合、これも可能です。
call $
これも3バイト(E8 FD FF)になります。
TKのによって与えられたPIC18の答え以下の手順で結果(バイナリ):
overflow
PUSH
0000 0000 0000 0101
CALL overflow
1110 1100 0000 0000
0000 0000 0000 0000
ただし、CALLだけではスタックオーバーフローが実行されます。
CALL $
1110 1100 0000 0000
0000 0000 0000 0000
ただし、RCALL(相対呼び出し)はさらに小さくなります(グローバルメモリではないため、追加の2バイトは必要ありません)。
RCALL $
1101 1000 0000 0000
したがって、PIC18で最小のものは、16ビット(2バイト)の単一命令です。これはループごとに2命令サイクルかかります。命令サイクルごとに4クロックサイクルで、8クロックサイクルを得ます。PIC18には31レベルのスタックがあるため、32回目のループの後、256クロックサイクルでスタックがオーバーフローします。64MHzでは、4マイクロ秒と2バイトでスタックがオーバーフローします。
ただし、PIC16F5xシリーズは12ビット命令を使用します。
CALL $
1001 0000 0000
この場合も、ループあたり2命令サイクル、命令あたり4クロックなので、ループあたり8クロックサイクルです。
ただし、PIC16F5xには2つのレベルのスタックがあるため、3番目のループでは24命令でオーバーフローします。20MHzでは、1.2マイクロ秒と1.5バイトでオーバーフローします。
インテル4004は、 8ビットの呼び出しサブルーチン命令があります。
CALL $
0101 0000
アスキー「P」に対応する好奇心のために。合計32.4マイクロ秒、1バイトで 24クロックサイクルかかる3レベルのスタック。(あなたが4004をオーバークロックしない限り-さあ、あなたはあなたがしたいのを知っています。)
これはbefungeの回答と同じくらい小さいですが、現在のインタープリターで実行されているbefungeコードよりはるかに高速です。
すべてのタスクには適切なツールが必要です。スタックオーバーフローを生成するように最適化されたSOオーバーフロー言語を満たします。
so
TeX:
\def~{~.}~
結果:
!TeXの容量を超えています。申し訳ありません[入力スタックサイズ= 5000]。
〜->〜
。
〜->〜
。
〜->〜
。
〜->〜
。
〜->〜
。
〜->〜
。
...
<*> \ def〜{〜。}〜
ラテックス:
\end\end
結果:
!TeXの容量を超えています。申し訳ありません[入力スタックサイズ= 5000]。
\ end#1-> \ csname end#1
\ endcsname \ @checkend {#1} \ expandafter \ endgroup \ if @ e ...
<*> \ end \ end
~はアクティブなので、の代わりに使用できます\a。そして、偶然にLaTeXコードを完全に発見しました。:)
英語で:
recursion = n. See recursion.
BASICの以下についてはどうでしょうか。
10 GOSUB 10
(私は恐れているBASICインタープリターがいないので、それは推測です)。
GOSUBではなくGOTOです。RETURNそれが呼び出された場所に向かっているので、確かにスタックを使用していますか?
私はコーディの回答ヒープが大好きだったので、C ++での私の同様の貢献を次に示します。
template <int i>
class Overflow {
typedef typename Overflow<i + 1>::type type;
};
typedef Overflow<0>::type Kaboom;
決してコードゴルフエントリではありませんが、それでもメタスタックの何かがオーバーフローしています!:-P
これが私のCの貢献です。18文字の重さです。
void o(){o();o();}
これは、最適化を末尾呼び出しするのがはるかに困難です!:-P
「s.bat」という名前のウィンドウのバッチファイルを使用します。
call s
JavaScript
さらに数文字をトリミングし、より多くのソフトウェアショップから追い出されるようにするには、次のようにします。
eval(i='eval(i)');
Groovy:
main()
$ groovy stack.groovy:
Caught: java.lang.StackOverflowError
at stack.main(stack.groovy)
at stack.run(stack.groovy:1)
...
「GNU」という頭字語の意味を教えてください。
Person JeffAtwood;
Person JoelSpolsky;
JeffAtwood.TalkTo(JoelSpolsky);
ここでは、末尾再帰がないことを期待しています!
C-最短ではありませんが、再帰はありません。また、移植性もありません。Solarisでクラッシュしますが、一部のalloca()実装はここでエラーを返す可能性があります(またはmalloc()を呼び出します)。printf()の呼び出しが必要です。
#include <stdio.h>
#include <alloca.h>
#include <sys/resource.h>
int main(int argc, char *argv[]) {
struct rlimit rl = {0};
getrlimit(RLIMIT_STACK, &rl);
(void) alloca(rl.rlim_cur);
printf("Goodbye, world\n");
return 0;
}
1つのハンバーガーに4つ以上のパテを入れてみてください。スタックオーバーフロー。
Python:
so=lambda:so();so()
または:
def so():so()
so()
そしてPythonが最適化されたテールが呼び出す場合...:
o=lambda:map(o,o());o()
この投稿の後に「ベストアンサー」を選択します。しかし、最初に、いくつかの非常に独創的な貢献を認めたいと思います。
上記を気に入っているように、課題はコードゴルフをすることであり、回答者に公平を期すために、Befungeエントリである最短のコードに「ベストアンサー」を授与する必要があります。誰もそれを打つことができるとは信じていません(ただし、Konradは確かに試しましたが)。
多数の再帰によるスタックオーバーフローソリューションを見て、誰も(現在の執筆時点で)Yコンビネーターを持ち出していないことに驚いています(入門については、Dick Gabrielのエッセイ「The Why of Y」を参照してください)。Yコンビネーターとakuのf(f(x))アプローチを使用する再帰的な解決策があります。:-)
((Y (lambda (f) (lambda (x) (f (f x))))) #f)
これは、Schemeからのもう1つの興味深いものです。
((ラムダ(x)(xx))(ラムダ(x)(xx)))
ジャワ
Javaソリューションの少し短いバージョン。
class X{public static void main(String[]a){main(a);}}