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