github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/cmd/compile/doc.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 /* 6 コンパイルは通常、 ``go tool compile'' として呼び出され、コマンドラインで指定されたファイルの名前を持つ単一のGoパッケージをコンパイルします。それはその後、最初のソースファイルのベース名に.oの接尾辞を付けた単一のオブジェクトファイルを書き込みます。オブジェクトファイルは、他のオブジェクトと組み合わせてパッケージアーカイブに結合するか、直接リンカ( ``go tool link'')に渡すことができます。-packを使用して呼び出された場合、コンパイラは中間オブジェクトファイルを経由せずに直接アーカイブを書き込みます。 7 8 生成されたファイルには、パッケージがエクスポートするシンボルに関する型情報と、パッケージが他のパッケージからインポートされたシンボルで使用される型に関する情報が含まれています。したがって、パッケージPのクライアントCをコンパイルする場合、Pの依存関係のファイルを読み込む必要はありません。コンパイルされたPの出力のみが必要です。 9 10 コマンドライン 11 12 使用法: 13 14 go tool compile [フラグ] ファイル... 15 16 指定されたファイルはGoのソースファイルでなければなりません。すべて同じパッケージの一部です。 17 すべてのターゲットオペレーティングシステムとアーキテクチャには同じコンパイラが使用されます。 18 GOOSとGOARCHの環境変数が目標となるものを設定します。 19 20 フラグ: 21 22 -D パス 23 ローカルインポートの相対パスを設定します。 24 -I dir1 -I dir2 25 dir1、dir2などのインポートされたパッケージを検索します。 26 この後、$GOROOT/pkg/$GOOS_$GOARCHを参照します。 27 -L 28 エラーメッセージに完全なファイルパスを表示します。 29 -N 30 最適化を無効にします。 31 -S 32 アセンブリリストを標準出力に表示します(コードのみ)。 33 -S -S 34 アセンブリリスト(コードとデータ)を標準出力に表示します。 35 -V 36 コンパイラのバージョンを表示して終了します。 37 -asmhdr ファイル 38 アセンブリヘッダをファイルに書き込みます。 39 -asan 40 C/C++アドレスサニタイザへの呼び出しを挿入します。 41 -buildid ID 42 エクスポートメタデータのビルドIDとしてIDを記録します。 43 -blockprofile ファイル 44 コンパイルのためのブロックプロファイルをファイルに書き込みます。 45 -c int 46 コンパイル中の並行性を設定します。並行性を行わない場合は1を設定します(デフォルトは1)。 47 -complete 48 パッケージに非Goコンポーネントがないと想定します。 49 -cpuprofile ファイル 50 コンパイルのためのCPUプロファイルをファイルに書き込みます。 51 -dynlink 52 共有ライブラリ内のGoシンボルへの参照を許可します(実験的)。 53 -e 54 エラーの数に制限を解除します(デフォルトの制限は10です)。 55 -goversion string 56 ランタイムの必要なgoツールバージョンを指定します。 57 ランタイムのgoバージョンがgoversionと一致しない場合は終了します。 58 -h 59 最初のエラーが検出されたときにスタックトレースで停止します。 60 -importcfg ファイル 61 インポート構成をファイルから読み取ります。 62 ファイルでは、importmap、packagefileを設定してインポートの解決を指定します。 63 -installsuffix suffix 64 $GOROOT/pkg/$GOOS_$GOARCH_suffixのかわりに$GOROOT/pkg/$GOOS_$GOARCHでパッケージを検索します。 65 -l 66 インライニングを無効にします。 67 -lang version 68 コンパイルするための言語バージョンを設定します(-lang=go1.12など)。 69 デフォルトは現在のバージョンです。 70 -linkobj file 71 リンカー固有のオブジェクトをファイルに書き込み、コンパイラ固有の 72 オブジェクトを通常の出力ファイルに書き込みます(-oで指定)。 73 このフラグがない場合、-oの出力はリンカーとコンパイラの入力の両方の組み合わせです。 74 -m 75 最適化の決定を印刷します。より高い値または繰り返し 76 詳細を生成します。 77 -memprofile file 78 コンパイルのメモリプロファイルをファイルに書き込みます。 79 -memprofilerate rate 80 コンパイルのruntime.MemProfileRateをrateに設定します。 81 -msan 82 C/C++メモリサニタイザーへの呼び出しを挿入します。 83 -mutexprofile file 84 コンパイルのミューテックスプロファイルをファイルに書き込みます。 85 -nolocalimports 86 ローカル(相対)インポートを禁止します。 87 -o file 88 オブジェクトをファイルに書き込みます(デフォルトはfile.oまたは、-packがある場合はfile.a)。 89 -p path 90 コンパイルされるコードの予想されるパッケージインポートパスを設定し、 91 循環依存関係を引き起こすインポートを診断します。 92 -pack 93 オブジェクトファイルではなくパッケージ(アーカイブ)ファイルを書き込みます 94 -race 95 レースディテクターを有効にしてコンパイルします。 96 -s 97 簡略化できる複合リテラルについて警告します。 98 -shared 99 共有ライブラリにリンクできるコードを生成します。 100 -spectre list 101 リスト(all, index, ret)のスペクター軽減を有効にします。 102 -traceprofile file 103 実行トレースをファイルに書き込みます。 104 -trimpath prefix 105 記録されたソースファイルパスからプレフィックスを削除します。 106 107 デバッグ情報に関連するフラグ: 108 109 -dwarf 110 DWARFシンボルを生成します。 111 -dwarflocationlists 112 最適化モードでDWARFにロケーションリストを追加します。 113 -gendwarfinl int 114 DWARFインライン情報レコードを生成します(デフォルトは2)。 115 116 コンパイラ自体をデバッグするためのフラグ: 117 118 -E 119 シンボルエクスポートをデバッグします。 120 -K 121 行番号が欠落していることをデバッグします。 122 -d list 123 リスト内のアイテムについてのデバッグ情報を印刷します。詳細については、-d helpを試してみてください。 124 -live 125 ライブネス分析をデバッグします。 126 -v 127 デバッグの詳細度を増やします。 128 -% 129 静的初期化子ではないものをデバッグします。 130 -W 131 型チェック後のパースツリーをデバッグします。 132 -f 133 スタックフレームをデバッグします。 134 -i 135 行番号スタックをデバッグします。 136 -j 137 ランタイムで初期化された変数をデバッグします。 138 -r 139 生成されたラッパーをデバッグします。 140 -w 141 型チェックをデバッグします。 142 143 コンパイラディレクティブ 144 145 コンパイラは、コメントの形式でディレクティブを受け入れます。 146 ディレクティブを非ディレクティブコメントと区別するために、ディレクティブの名前とコメントの開始の間にはスペースが必要ありません。しかし、 147 それらはコメントであるため、ディレクティブの規則や特定の 148 ディレクティブを知らないツールは、他のコメントと同様にディレクティブをスキップできます。 149 */ 150 // ラインディレクティブはいくつかの形式で存在します: 151 // 152 // //line :line 153 // //line :line:col 154 // //line filename:line 155 // //line filename:line:col 156 // /*line :line*/ 157 // /*line :line:col*/ 158 // /*line filename:line*/ 159 // /*line filename:line:col*/ 160 // 161 // ラインディレクティブとして認識されるためには、コメントは 162 // //lineまたは/*lineに続くスペースで始まり、少なくとも一つのコロンを含んでいなければなりません。 163 // //line形式は行の始まりでなければなりません。 164 // ラインディレクティブは、コメントの直後の文字のソース位置を指定したファイル、行、列から来たものとして指定します: 165 // //lineコメントの場合、これは次の行の最初の文字であり、 166 // /*lineコメントの場合、これは閉じる*/の直後の文字位置です。 167 // ファイル名が指定されていない場合、記録されたファイル名は列番号もない場合は空であり、 168 // それ以外の場合は最近記録されたファイル名(実際のファイル名または前のラインディレクティブで指定されたファイル名)です。 169 // ラインディレクティブが列番号を指定していない場合、列は"未知"であり、 170 // 次のディレクティブまでコンパイラはその範囲の列番号を報告しません。 171 // ラインディレクティブのテキストは後ろから解釈されます:まず、dddが有効な数値> 0である場合、 172 // ディレクティブテキストから末尾の:dddが剥がされます。次に、それが有効である場合、 173 // 同じ方法で2番目の:dddが剥がされます。それ以前のものはすべてファイル名と見なされます 174 // (空白とコロンを含む可能性があります)。無効な行または列の値はエラーとして報告されます。 175 // 176 // 例: 177 // 178 // //line foo.go:10 ファイル名はfoo.goで、次の行の行番号は10です 179 // //line C:foo.go:10 ファイル名にはコロンが許可されています。ここではファイル名はC:foo.goで、行は10です 180 // //line a:100 :10 ファイル名には空白が許可されています。ここではファイル名は " a:100 "(引用符を除く) 181 // /*line :10:20*/x xの位置は現在のファイル内で、行番号は10、列番号は20です 182 // /*line foo: 10 */ このコメントは無効な行ディレクティブとして認識されます(行番号の周囲に余分な空白があります) 183 // 184 // ラインディレクティブは通常、機械生成されたコードに現れます。これにより、コンパイラとデバッガは 185 // ジェネレータへの元の入力の位置を報告します。 186 /* 187 ラインディレクティブは歴史的な特例であり、他のすべてのディレクティブは 188 //go:nameの形式で、それらがGoツールチェーンによって定義されていることを示しています。 189 各ディレクティブは自身の行に配置する必要があり、コメントの前には先頭のスペースとタブのみが許可されます。 190 各ディレクティブは、それに直後に続くGoコードに適用され、 191 通常は宣言でなければなりません。 192 193 //go:noescape 194 195 //go:noescape ディレクティブは、本体を持たない関数宣言(つまり、Goで書かれていない実装を持つ関数)に続く必要があります。 196 これは、関数が引数として渡されたポインタをヒープに逃がしたり、関数から返される値に逃がしたりしないことを指定します。 197 この情報は、関数を呼び出すGoコードのコンパイラのエスケープ解析中に使用できます。 198 199 //go:uintptrescapes 200 201 //go:uintptrescapes ディレクティブは、関数宣言に続く必要があります。 202 これは、関数のuintptr引数がuintptrに変換されたポインタ値であり、 203 呼び出しの期間中、型だけから見てオブジェクトが呼び出し中には必要ないように見える場合でも、 204 ヒープ上に保持され、生きていなければならないことを指定します。 205 ポインタからuintptrへの変換は、この関数への任意の呼び出しの引数リストに現れなければなりません。 206 このディレクティブは、一部の低レベルシステムコールの実装に必要であり、それ以外の場合は避けるべきです。 207 208 //go:noinline 209 210 //go:noinline ディレクティブは、関数宣言に続く必要があります。 211 これは、関数への呼び出しがインライン化されないように指定し、 212 コンパイラの通常の最適化ルールを上書きします。これは通常、 213 特別なランタイム関数やコンパイラのデバッグ時にのみ必要です。 214 215 //go:norace 216 217 //go:norace ディレクティブは、関数宣言に続く必要があります。 218 これは、関数のメモリアクセスがレース検出器によって無視されるべきであることを指定します。 219 これは最も一般的に、レース検出器ランタイムに呼び出すことが安全でない時期に呼び出される低レベルのコードで使用されます。 220 221 //go:nosplit 222 223 //go:nosplitディレクティブは、関数宣言に続く必要があります。 224 これは、関数が通常のスタックオーバーフローチェックを省略する必要があることを指定します。 225 これは最も一般的に、呼び出し元のゴルーチンがプリエンプトされるのが安全でない時期に呼び出される低レベルのランタイムコードで使用されます。 226 227 //go:linkname localname [importpath.name] 228 229 //go:linknameディレクティブは、通常、「localname」で指定されたvarまたはfunc宣言の前に配置されますが、 230 その位置はその効果を変えません。 231 このディレクティブは、Goのvarまたはfunc宣言に使用されるオブジェクトファイルシンボルを決定し、 232 2つのGoシンボルが同じオブジェクトファイルシンボルをエイリアスとして使用できるようにします。 233 これにより、一つのパッケージが、通常は未エクスポート宣言のカプセル化を侵害する、 234 または型安全性を侵害する場合でも、別のパッケージのシンボルにアクセスできます。 235 そのため、"unsafe"をインポートしたファイルでのみ有効になります。 236 237 二つのシナリオで使用することができます。パッケージupperがパッケージlowerを 238 インポートしていると仮定しましょう、おそらく間接的に。最初のシナリオでは、 239 パッケージlowerは、そのオブジェクトファイル名がパッケージupperに属するシンボルを定義します。 240 両方のパッケージにはlinknameディレクティブが含まれています:パッケージlowerは 241 二つの引数形式を使用し、パッケージupperは一つの引数形式を使用します。 242 以下の例では、lower.fは関数upper.gのエイリアスです: 243 244 package upper 245 import _ "unsafe" 246 //go:linkname g 247 func g() 248 249 package lower 250 import _ "unsafe" 251 //go:linkname f upper.g 252 func f() { ... } 253 254 パッケージupperのlinknameディレクティブは、本体を持たない関数に対する通常のエラーを抑制します。 255 (そのチェックは、パッケージに.sファイル(空でも可)を含めることで、代わりに抑制することもできます。) 256 257 二つ目のシナリオでは、パッケージupperが一方的にパッケージlowerのシンボルのエイリアスを作成します。 258 以下の例では、upper.gは関数lower.fのエイリアスです。 259 260 package upper 261 import _ "unsafe" 262 //go:linkname g lower.f 263 func g() 264 265 package lower 266 func f() { ... } 267 268 lower.fの宣言には、単一の引数fを持つlinknameディレクティブも含まれているかもしれません。 269 これはオプションですが、関数がパッケージ外からアクセスされることを読者に警告するのに役立ちます。 270 271 //go:wasmimport importmodule importname 272 273 //go:wasmimportディレクティブはwasm専用で、関数宣言に続く必要があります。 274 これは、関数が``importmodule``と``importname``で識別されるwasmモジュールによって提供されることを指定します。 275 276 //go:wasmimport a_module f 277 func g() 278 279 Go関数のパラメータと戻り値の型は、以下の表に従ってWasmに変換されます: 280 281 Go types Wasm types 282 int32, uint32 i32 283 int64, uint64 i64 284 float32 f32 285 float64 f64 286 unsafe.Pointer i32 287 288 コンパイラは他のすべてのパラメータ型を許可しません。 289 290 */ 291 package main