MemoSTM関係のことをメモっていこうと思います。この広告は、90日以上更新していないブログに表示しています。2023の11日目の記事です。godboltをご存知だろうか。godbolt.orgブラウザから誰でもアクセスできる無料サービスでコンパイラの挙動について学ぶ事ができる。簡単に「渡された数Nに対し1+2+....+Nを返す関数sum」を例にするとこんな感じにコンパイル結果のアセンブリを表示してくれる。アセンブリはマウスカーソルを置くとそれが元のコードのどの場所に対応したものなのかを逐一ハイライト表示してくれる。この機能を実現するために必要な労力は並では無いと思うが詳細はわからない。アセンブリ側も複数色あるのは元のコードの1行が同じ背景色のブロックになった事を表している。これがすごいのはコンパイラの選択肢の豊富さである。6502-c++(???)など様々なコンパイラが選べる。m68kの他聞いたこと無いものまでたくさんのターゲットが選べる。コンパイルオプションも-O2など指定し放題なので最適化オプションごとのアセンブリの違いも一目瞭然のとっても便利なツールである。ここまでの話ならコンパイラ愛好家の皆さんなら当然知っていた情報だと思う。見ないうちにLLVM関連の機能が超強化されていたので紹介したい。Representation)の事でコンパイラ内部でいったん独自言語に置き換えることでCPU固有の問題(レジスタ割付等)を後回しにして最適化を行い、その後で各CPU固有のコード出力を行うまでの間に使う仮想的なアセンブリ言語である。見たところはアセンブリに似ているがレジスタの数に制限が無いので%1などと名付けられているレジスタは必要に応じてどこまでも大きくなりうるし、一度代入されたレジスタは書き換える事ができない。機械語に落とす際にCPUの台所事情に合わせて適宜物理レジスタに割り付け直す事で最適なコードを出力する。この辺は静的単一代入とかで検索すれば多分解説している記事がある。Block)という単位で管理されている。目で追いかけるのが辛いこともあるのでこのようにエッジを張ったグラフとして可視化してくれる。これはLLVMに限らず普通のアセンブリのも出せる。以下のはx86のもの。GraphLLVMのAST表現も出せる。これはLLVM使ってコンパイラ作ってる人には嬉しいLLVMの最適化は「LLVM-IRで表現されたコード」を入力として「LLVM-IRで表現されたコード」を出力とする最適化パイプラインを通り抜ける事で最適化が実行される。入力と出力の型が一致している。この方法の優れた点は最適化ロジックを新規追加する際にはパイプラインを長くするだけなので既存の最適化ロジックに一切触らなくて良い個々の最適化ロジックについて入力前と出力後のコードが明らかなので単体テストしやすいパイプラインを組み替えれば特定のバグがどの最適化ロジックによってもたらされたかを簡単に見つけられるなどが挙げられる。スケーラブルなソフトウェアアーキテクチャをしている。何よりびっくりしたのがその可視化である。左端が最適化パイプラインに並ぶロジック名、中央がそのステップでの最適化前コード、右が最適化後コードこれはかなりすごい。前に「等差数列の和の公式をコンパイラが使ってループを自動で潰してくれる」という話は一部で話題になったが、この最適化パイプラインを追いかけるとどこでそれが起きたか一目瞭然である。緑色のロジックがコードの最適化に成功したロジックなのでそれを上から順番にクリックしていけばアセンブリ上でループが消えた瞬間がわかる。New」のドロップダウンリストから選択できる。ここで紹介していない機能や僕には理解できなかった機能も山ほどあるのでコンパイラ好きの各位は是非いろいろ探して共有して欲しい。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。