パスワードを忘れた? アカウント作成
14997876 journal
日記

okkyの日記: COMPILER EXPLORER 1

日記 by okky

なんか10回位アドレスを調べなおしているので、もうここに書いておこう。

https://godbolt.org/

このページ、今時のコンパイラがどういうコードを吐くか知りたいときに便利です。
例えばこれ:
https://godbolt.org/z/6q5fhj

from, to を整数で与えると、from .. to の間の数字の話を求めて printf() で出してくれるという、要するに有名なガウスの等差級数の和を求める話を一般化した奴なのだが。

見ての通り、アセンブラ側にループが無い。

今時のコンパイラ、等差級数の和ごときは自動検出して、いきなり公式に当てはめてしまうのだ。

こうなると、何をどう書いた時に「コンパイラがそのアルゴリズムを知らなくて」素直に書かれた通りのコードを出すのか、どう書いた時は
「ふふん、そんなの私はお見通しですよ」
と全然違うコードを出してくるのか、正直判らない。で、コンパイラが見抜けるものについては「わかりやすい」「コンパイラが最適化のためのパターンを見つけやすい」書き方の方が、凝ったアルゴリズムを直接書くよりも良い、と言う事になりかねない。

そしてそういう議論をするときには、
「こういうコードが出ているんだからこう書いた方が良い」
的な内容を皆で共有するには、こういうページを使った方が便利なのだ(少し変更したらどうなるか、とか気になるポイントを各々実験できるから)。

この議論は、okky (2487)によって「 ログインユーザだけ」として作成されている。 ログインしてから来てね。
  • by ribbon (11750) on 2020年11月27日 23時15分 (#3932067) 日記

    gccとclang の出し方が違うとか、バージョンによって結構差があるとか実に興味深いです。
    gcc は途中からxmmレジスタ使うようになったみたいですが、そっちの方が速いのかな。

    ただ、こういうソースの意味を読む、というコンパイラの動作は、スーパーコンピュータの世界ではずいぶんと前からやってたような気がします(ソースは記憶)。Fortranですけど。

typodupeerror

最初のバージョンは常に打ち捨てられる。

読み込み中...