* C++の未定義動作 -(by [[K]], 2019.01.26) ** (0) -以下の2つの記事を読んだ。どちらもC++の未定義動作に関する話題だ。非常に面白い。 -C++でうっかり無限ループを書くと鼻から悪魔が出てくる --https://qiita.com/tkmtSo/items/de3148dd1dcb70f38d6a -Old New Thing: 未定義動作はタイムトラベルを引き起こす(他にもいろいろあるけど、タイムトラベルが一番ぶっ飛んでる) --https://cpplover.blogspot.com/2014/06/old-new-thing.html ** (1) -私の正直な印象を言えば、私はもうC++を使いたくはないかもしれないと思った。 -未定義動作を引き起こすようなコードを書くなという主張はもっともだけど、私は人間なので書き間違うことはきっとあるだろう。そのときに、それを報告することはなく、勝手に都合の良いように解釈してコード生成されたらたまったものではない。100万行を実行したのちに、未定義動作を実行してしまう場合、C++ではその100万行が正しくても正しくなくても、もう結果は最初から何を出力してもよいということになる。それでは「〇〇が表示されているのだから、ここまではOKだな」という手法すら満足に使えないということだ。 -未定義動作を引き起こすようなコードを書くなという主張は一理あるけど、私は人間なので書き間違うことはきっとあるだろう。そのときに、それを報告することはなく、勝手に都合の良いように解釈してコード生成されたらたまったものではない。100万行を実行したのちに、未定義動作を実行してしまう場合、C++ではその100万行が正しくても正しくなくても、もう結果は最初から何を出力してもよいということになる。それでは「〇〇が表示されているのだから、ここまではOKだな」という手法すら満足に使えないということだ。 ** (2) -なぜC++がこんな仕様になってしまったのかといえば、要するにC++は最適化がやりたいからだ。人間がぼろいコードを書いてもC++はそれを華麗に最適化して、あっという間に結果を返してくれる。かっこいい。C++の作者は相当に気分がいいだろう。・・・そしてもはやC++はそういう競争が主目的になってしまった。だから人間がバグのあるプログラムを書くかもしれないということはもはや無視するようになってしまった。つまり神様に使ってもらうための言語になったということだ。 -私はこんな言語は嫌だ。そんな代償を払わなければいけないのなら最適化なんか別にしてくれなくていい。書いた通りに動いてほしいし、おかしなことをやったのだったらそれを盾に好き勝手にするのではなく、確実に止まってほしい。ぼろいコードを書いたときはどんくさい速度で動いてもらって構わない。 -そもそもプログラミング言語は何のためにあったのか。人間を手助けするためだ。それなのにこれじゃ正直手助けされている気がしない。神様を手助けするためのものじゃないし、そもそも全知全能な神様ならコンパイラなんかなくたって完璧なコードをかけるだろう。 ** (3) -とはいえ、それでも私はC++がだめだとは思わない。単に私は使いたくないというだけだ。それでも使いたい人がいて、コンパイラを作りたい人がいる限り、それで何ら問題はない。私はC++さえ使わなければ何も損害を受けるわけではないのだから。 * こめんと欄 #comment