KDOC 151: Goコンパイラの定数式の埋め込みをみる
この文書のステータス
- 作成
- 2024-05-01 貴島
- レビュー
- 2024-05-11 貴島
概要
Goが出力するアセンブリと、Cが出力するアセンブリと比較していると、定数式の扱いが違うことに気づいた。Goアセンブリでは定数どうしの式がアセンブラに現れず、結果だけが埋め込まれる。
違い
↓まずCの、RISC-V向けアセンブリ。見慣れた形式。
↓つぎにGoの、RISC-V向けアセンブリ。
まとめ。
- ↑2言語で書かれた内容はほぼ同じ
- Go言語の生成したアセンブリのほうが短い
- 少なくとも↑このコードでは、Goアセンブリに乗算命令
mulがない。明らかに定数だから、先読みして結果だけ埋め込んでしまうということか。例コードだとGoコンパイラの方が最適化しているといえる
↓引数にすると、最適化しようがないので乗算命令が現れる。
関連
抽象。
- 前もって答えが決まる計算は、実行前に済ませて結果だけを残す
- 同じ計算を書いても、変換する側が事前に済ませるかどうかは実装しだい
関連。
- 類似: KDOC 54: Goのiotaの仕組みを見る。値が実行前に決まって埋め込まれる点で同じ
- 動機: KDOC 145: Goアセンブリの違いを見る。例示コードを書いているときに、計算命令が現れないのに気づいた