アカウント名:
パスワード:
冒頭だけ読みましたが、これは初心者殺しのマニュアルですね。RMSは多数の罠を仕込んでいます。
1) 最初の罠: gitで公開されているファイルは GNU Texinfo 形式
あなたは git が使えますか? texi から html やpdfを生成できますか? この質問で何を聞かれているか理解できない人は、このマニュアルを読むことさえ出来ません。RMSこわい。
2) 次の罠: 最初のコードはフィボナッチ数を再帰処理で計算する例
いきなり再帰関数です。フィボナッチ数。スタック使って再帰を実行するぜ。メモリブロックの一部がスタックって呼ばれる領域なんだけど、C言語はそこを使って再帰を
いきなり再帰関数です。フィボナッチ数。スタック使って再帰を実行するぜ。メモリブロックの一部がスタックって呼ばれる領域なんだけど、C言語はそこを使って再帰を実現するんだぜ。スタック食い潰したらクラッシュする。どうだC言語は怖いだろっていう怒涛の文章になってます。これがイントロです。RMS頭オカシイ。
intで計算できる程度のフィボナッチ数を再帰で求めたとしてスタックオーバーフローになるわけないアホか
まともなコードとコンパイラならスタック消費しないからオーバーフローになるわけないアホか
まともなコンパイラなら再帰呼出しで組まれたフィボナッチ数の計算もループに展開してくれる、とか思ってるアホかな?
末尾再帰も書けないカスかな試しにアセンブリ出力してみたが、ちゃんとループに展開してくれたぞ
試しにアセンブリ出力してみたが、ちゃんとループに展開してくれたぞ
件のコードをgcc 12.2を使って最適化指示`-Os`を指定してコンパイルしてみたが https://godbolt.org/z/qvjeaedon [godbolt.org] fib: pushq %rbp xorl %ebp, %ebp pushq %rbx movl %edi, %ebx pushq %rcx.L3:
試されたコンパイラは何ですか??ちゃんとループに展開されたコードが見てみたいです。是非教えて。
Lispのコメントのところでも勘違いしている奴がいるが、フィボナッチ数と階乗を取り違えてるんじゃないかな。階乗でも、素直に書くと末尾再起にはならないからそこは一工夫いるけど。
#4322148は件のコードの通りFnからF₁へと遡る再帰コードのことを言ってるのでループに展開されることはない。(もしかして今どきのコンパイラはこれもループ展開されるの?)
#4322180は#4322048で「まともなコード」と書いてあるので(同一ACなら)リンク先の件のコードを見てない可能性がある。#4322180はF₁から昇順でFnを求めるコードを思い浮かべてそう。この場合ループに展開できる再帰関数は作れる(しかしながら、コンパイラが気を利かせてループ展開してくれるにしても、デバッグが微妙になるから最初からループ処理するコードを書くのがまともだと思う。)
最適化用にUBにしてる部分踏んで罠とか言う奴と同類
何言いたいのかわからんけどアホは#4322148 [srad.jp]と#4322180 [srad.jp]で確定だぞ
#4322218だがフィボナッチ数列でも、強引だけど例えば…#define FIB(n) _fib(n, 1, 1)
int _fib(int n, int f_1, int f_2) { if(2 >= n) { return f_1; } else { n--; return _fib(n, f_1 + f_2, f_1); }}ならループ展開される(のでスタックを消費しない)可能性があるでしょ?ってこと。(そもそもループに書き換えた方がいいよね。)
もちろん件のコード(スタックを消費する)とは全く違うので、そもそもすれ違ってるよねってことが言いたい。
int _fib(int n, int f_1, int f_2) { if(2 >= n) { return f_1; } else { n--; return _fib(n, f_1 + f_2, f_1); }}ならループ展開される(のでスタックを消費しない)可能性があるでしょ?ってこと。
「GNU C Language Intro and Reference Manual」のコード以外の話をする意図がサッパリわからん
要するに、#4322180がなぜ「GNU C Language Intro and Reference Manual」のコードを見ないのか?ってことか…
前にも書いたが#4322048(=#4322180だとして)の「まともなコードと」って文から「GNU C Language Intro and Reference Manual」のコードを見ていない可能性を読み取ることはできる。
コードを見ない原因も「まともなコード」から若干類推できる。そもそも再帰呼び出しはあまり「まとも」とは言えない。少なくともスタックオーバーフローを防ぐコードを追加する必要がある。だからこそannoymouse coward (11178)にも取り上げら
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー
これは無理ゲー (スコア:5, おもしろおかしい)
冒頭だけ読みましたが、これは初心者殺しのマニュアルですね。RMSは多数の罠を仕込んでいます。
1) 最初の罠: gitで公開されているファイルは GNU Texinfo 形式
あなたは git が使えますか? texi から html やpdfを生成できますか? この質問で何を聞かれているか理解できない人は、このマニュアルを読むことさえ出来ません。RMSこわい。
2) 次の罠: 最初のコードはフィボナッチ数を再帰処理で計算する例
いきなり再帰関数です。フィボナッチ数。スタック使って再帰を実行するぜ。メモリブロックの一部がスタックって呼ばれる領域なんだけど、C言語はそこを使って再帰を
Re: (スコア:0)
いきなり再帰関数です。フィボナッチ数。スタック使って再帰を実行するぜ。メモリブロックの一部がスタックって呼ばれる領域なんだけど、C言語はそこを使って再帰を実現するんだぜ。スタック食い潰したらクラッシュする。どうだC言語は怖いだろっていう怒涛の文章になってます。これがイントロです。RMS頭オカシイ。
intで計算できる程度のフィボナッチ数を再帰で求めたとしてスタックオーバーフローになるわけないアホか
Re: (スコア:0)
まともなコードとコンパイラならスタック消費しないからオーバーフローになるわけないアホか
Re: (スコア:0)
まともなコードとコンパイラならスタック消費しないからオーバーフローになるわけないアホか
まともなコンパイラなら再帰呼出しで組まれたフィボナッチ数の計算もループに展開してくれる、とか思ってるアホかな?
Re:これは無理ゲー (スコア:0)
末尾再帰も書けないカスかな
試しにアセンブリ出力してみたが、ちゃんとループに展開してくれたぞ
Re: (スコア:0)
試しにアセンブリ出力してみたが、ちゃんとループに展開してくれたぞ
件のコードをgcc 12.2を使って最適化指示`-Os`を指定してコンパイルしてみたが
https://godbolt.org/z/qvjeaedon [godbolt.org]
fib:
pushq %rbp
xorl %ebp, %ebp
pushq %rbx
movl %edi, %ebx
pushq %rcx
.L3:
Re: (スコア:0)
試しにアセンブリ出力してみたが、ちゃんとループに展開してくれたぞ
試されたコンパイラは何ですか??
ちゃんとループに展開されたコードが見てみたいです。是非教えて。
Re: (スコア:0)
Lispのコメントのところでも勘違いしている奴がいるが、フィボナッチ数と階乗を取り違えてるんじゃないかな。
階乗でも、素直に書くと末尾再起にはならないからそこは一工夫いるけど。
エスパーしてみる (スコア:0)
#4322148は件のコードの通りFnからF₁へと遡る再帰コードのことを言ってるのでループに展開されることはない。(もしかして今どきのコンパイラはこれもループ展開されるの?)
#4322180は#4322048で「まともなコード」と書いてあるので(同一ACなら)リンク先の件のコードを見てない可能性がある。#4322180はF₁から昇順でFnを求めるコードを思い浮かべてそう。この場合ループに展開できる再帰関数は作れる(しかしながら、コンパイラが気を利かせてループ展開してくれるにしても、デバッグが微妙になるから最初からループ処理するコードを書くのがまともだと思う。)
何れにせよ仕様と実装の区別がついてないアホが他人をアホ呼ばわりしてることにはかわらない (スコア:0)
最適化用にUBにしてる部分踏んで罠とか言う奴と同類
Re: (スコア:0)
何言いたいのかわからんけどアホは#4322148 [srad.jp]と#4322180 [srad.jp]で確定だぞ
Re: (スコア:0)
#4322218だがフィボナッチ数列でも、強引だけど例えば…
#define FIB(n) _fib(n, 1, 1)
int _fib(int n, int f_1, int f_2) {
if(2 >= n) {
return f_1;
} else {
n--;
return _fib(n, f_1 + f_2, f_1);
}
}
ならループ展開される(のでスタックを消費しない)可能性があるでしょ?ってこと。(そもそもループに書き換えた方がいいよね。)
もちろん件のコード(スタックを消費する)とは全く違うので、そもそもすれ違ってるよねってことが言いたい。
Re: (スコア:0)
#4322218だがフィボナッチ数列でも、強引だけど例えば…
#define FIB(n) _fib(n, 1, 1)
int _fib(int n, int f_1, int f_2) {
if(2 >= n) {
return f_1;
} else {
n--;
return _fib(n, f_1 + f_2, f_1);
}
}
ならループ展開される(のでスタックを消費しない)可能性があるでしょ?ってこと。
「GNU C Language Intro and Reference Manual」のコード以外の話をする意図がサッパリわからん
Re: (スコア:0)
要するに、#4322180がなぜ「GNU C Language Intro and Reference Manual」のコードを見ないのか?ってことか…
前にも書いたが#4322048(=#4322180だとして)の「まともなコードと」って文から「GNU C Language Intro and Reference Manual」のコードを見ていない可能性を読み取ることはできる。
コードを見ない原因も「まともなコード」から若干類推できる。そもそも再帰呼び出しはあまり「まとも」とは言えない。少なくともスタックオーバーフローを防ぐコードを追加する必要がある。だからこそannoymouse coward (11178)にも取り上げら