2.7 Go ランタイム (runtime)#
Go コンパイラが生成するのはネイティブな実行可能コードですが、このコードは Go のランタイム(この部分のコードは runtime
パッケージにあります)で実行されます。このランタイムは、Java や .NET 言語で使用される仮想マシンに似ており、メモリ割り当て、ガベージコレクション(10.8 節)、スタック処理、ゴルーチン、チャネル、スライス、マップ、リフレクションなどを管理します。
ランタイムは主に C 言語で書かれており(Go 1.5 以降は自己ホスト化)、それぞれの Go パッケージのトップレベルパッケージです。関連する内容は $GOROOT/src/runtime
ディレクトリで見つけることができます。
ガベージコレクタ Go にはシンプルで効率的なマーク - アンド - スイープ型のガベージコレクタがあります。その主なアイデアは、IBM の再利用可能なガベージコレクタから来ており、効率的で低遅延の並行ガベージコレクタを作ることを目指しています。現在、gccgo にはまだガベージコレクタがありませんが、gc と gccgo の両方で使用できる新しいガベージコレクタが開発中です。ガベージコレクション機能を備えたプログラミング言語を使用することは、メモリ割り当てに関連する問題を回避できるわけではありません。メモリの割り当てと解放は、CPU リソースを消費する行動です。
Go の実行可能ファイルは、対応するソースコードファイルよりもはるかに大きくなります。これは、Go のランタイムが各実行可能ファイルに埋め込まれていることを示しています。もちろん、大規模なクラスタにデプロイする場合、大きなファイルサイズは問題となることもあります。しかし、全体的に見れば、Go のデプロイ作業は Java や Python よりもはるかに簡単です。なぜなら、Go は他のファイルに依存しないため、単独の静的ファイルだけが必要であり、他の言語のようにさまざまなバージョンの依存ファイルを混在させる必要がないからです。