GoコンパイラのSSAバックエンドには、コンパイル段階のHTMLデバッグ出力を生成するツールがあります。この記事では、関数メソッドの SSA 出力を表示する方法について説明します。
関数、値メソッド、ポインタ・メソッドを含むサンプル・プログラムから始めましょう:
package mainimport (type Numbers struct {vals []intfunc (n *Numbers) Add(v int) {n.vals = append(n.vals, v)func (n Numbers) Average() float64 {sum := 0.0for _, num := range n.vals {sum += float64(num)return sum / float64(len(n.vals))func main() {var numbers Numbersnumbers.Add(200)numbers.Add(43)numbers.Add(-6)fmt.Println(numbers.Average())
SSAデバッグ出力はGOSSAFUNC環境変数によって制御されます。この変数にはダンプする関数の名前が入ります。これは関数の完全修飾名です。上記のfunc mainの場合、関数名はmain main.mainです。
% env GOSSAFUNC=main go buildruntimedumped SSA to ../../go/src/runtime/ssa.htmldumped SSA to ./ssa.html
この例では、GOSSAFUNC=mainはmain.mainとruntime.mainという関数の両方にマッチします。これは少し不運なことですが、おそらく実際には大したことではありません。なぜなら、もしコードにパフォーマンス上の微調整を加えるのであれば、func mainの巨大なスパゲッティ・ブロックの中ではないからです。
この記事を見て、メソッドをダンプできるSSA出力を探したかもしれません。
ポインタ・メソッド func (n *Numbers) Add の SSA デバッグを表示するには、同等の関数を (*Numbers).Add名前にします:
% env "GOSSAFUNC=(*Numbers).Add" go builddumped SSA to ./ssa.html
値メソッド func (n *Numbers) Add の SSA デバッグを表示するには、同等の関数を (*Numbers).Add, という名前にします:
% env "GOSSAFUNC=(*Numbers).Average" go builddumped SSA to ./ssa.html
Goをソースからビルドしていない場合、ランタイムパッケージへのパスが読み取り専用になり、エラーメッセージが表示されることがあります。この問題を解決するためにsudoを使用しないでください。
シェルの基準注意
を経由して





