[インデックス 12702] ファイルの概要
このコミットは、Go言語のgccgo
コンパイラのインストールと使用方法に関する公式ドキュメントであるdoc/gccgo_install.html
の一般的な更新を目的としています。具体的には、gccgo
のリリース情報、ソースコードの取得方法、ビルド手順(特にgold
リンカの使用とUbuntu環境での注意点)、gccgo
の使用方法、オプション、インポート、デバッグ、C言語との相互運用性、そしてRTEMSへの移植に関する記述が大幅に加筆・修正されています。
コミット
commit a84e3baf9a4008aea78babca18048c96ec46d598
Author: Ian Lance Taylor <iant@golang.org>
Date: Tue Mar 20 14:16:34 2012 -0700
doc: general update of gccgo_install
Fixes #3325.
R=golang-dev, bradfitz, minux.ma, r
CC=golang-dev
https://golang.org/cl/5858043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/a84e3baf9a4008aea78babca18048c96ec46d598
元コミット内容
doc: general update of gccgo_install
このコミットは、gccgo_install
ドキュメントの一般的な更新です。
Go Issue #3325を修正します。
レビュー担当者: golang-dev, bradfitz, minux.ma, r CC: golang-dev Go Code Review: https://golang.org/cl/5858043
変更の背景
このコミットの主な背景は、Go言語の公式リリースであるGo 1のリリースが間近に迫っていたことです。gccgo
はGo言語の代替コンパイラであり、GCCのフロントエンドとして機能します。Go 1のリリースに伴い、gccgo
もGo 1の仕様に準拠するように更新され、そのインストールおよび使用方法に関するドキュメントも最新の状態に保つ必要がありました。
具体的には、以下の点が変更の動機となっています。
- Go 1への対応:
gccgo
がGo 1のライブラリと互換性を持つように更新されたため、その情報がドキュメントに反映される必要がありました。特に、GCC 4.7.0および4.7.1リリースにおけるGoサポートの状況が追記されています。 gc
コンパイラとの区別: Go言語には公式のgc
コンパイラ(6g
,8g
など)とgccgo
の2つの主要なコンパイラが存在します。このドキュメントはgccgo
に特化しており、両者の違いを明確にする必要がありました。gold
リンカの重要性:gccgo
でGoのgoroutineを効率的に利用するためには、gold
リンカの特定のバージョンが必要であることが判明しました。この重要な技術的要件と、そのビルド方法に関する詳細な手順がドキュメントに追加されました。- C言語との相互運用性の明確化:
gccgo
はGCCのフロントエンドであるため、C言語との相互運用性が重要な機能です。GoとCの型マッピング、関数呼び出し規約、そしてcgo
ツールとの関連性について、より詳細な説明が求められました。 - Ubuntu環境でのビルド問題への対応: 特定のLinuxディストリビューション(特にUbuntu)で
gccgo
をビルドする際に発生する可能性のあるライブラリパスの問題に対する回避策が提供されました。 - ドキュメントの網羅性と正確性の向上: 全体的に、
gccgo
の利用者がよりスムーズに環境構築と開発を行えるよう、情報が整理され、不足していた情報が補完されました。
これらの変更は、Go言語のエコシステムにおけるgccgo
の役割を強化し、より多くの開発者がgccgo
を効果的に利用できるようにすることを目的としています。
前提知識の解説
このコミットの変更内容を理解するためには、以下の前提知識があると役立ちます。
- Go言語: Googleによって開発された静的型付けのコンパイル型プログラミング言語。並行処理に強く、シンプルで効率的な設計が特徴です。
- GCC (GNU Compiler Collection): GNUプロジェクトが開発している、様々なプログラミング言語に対応したコンパイラ群。C、C++、Fortran、Ada、Goなど、多くの言語のコンパイラが含まれています。
gccgo
は、このGCCのフロントエンドの一つとしてGo言語をサポートします。 gccgo
: Go言語のコンパイラの一つで、GCCのフロントエンドとして実装されています。Go言語のコードをGCCのバックエンドを通じてネイティブコードにコンパイルします。Go言語の公式コンパイラであるgc
(6g
,8g
など)とは異なる実装であり、それぞれ異なる特性を持ちます。例えば、gccgo
はGCCの最適化パスを利用できる利点があります。gc
コンパイラ: Go言語の公式配布に含まれる標準のコンパイラ群(例:go build
コマンドが内部的に使用する6g
,8g
など)。gccgo
とは異なり、Go言語のためにゼロから設計されたコンパイラです。- リンカ (Linker): コンパイラによって生成されたオブジェクトファイル(
.o
ファイル)やライブラリを結合し、実行可能なプログラムを生成するツール。 gold
リンカ: GNU Binutilsプロジェクトの一部として開発された、新しい高速なリンカ。従来のld
リンカと比較して、大規模なプロジェクトでのリンク時間を大幅に短縮できる特徴があります。gccgo
においては、特にGoのgoroutineのスタック管理において重要な役割を果たします。- Goroutine: Go言語における軽量な並行処理の単位。OSのスレッドよりもはるかに軽量で、数百万のgoroutineを同時に実行することも可能です。
gccgo
では、gold
リンカと連携することで、goroutineのスタックを効率的に管理し、メモリ使用量を削減します。 - C言語との相互運用性: 異なるプログラミング言語で書かれたコードが互いに呼び出し合ったり、データを共有したりする能力。
gccgo
はGCCのフロントエンドであるため、C言語との連携が比較的容易です。 cgo
: Go言語とC言語の相互運用を可能にするGoのツール。Cの関数をGoから呼び出したり、Goの関数をCから呼び出したりするためのバインディングを生成します。gccgo
のC相互運用性に関する記述では、cgo
の利用が推奨されています。- RTEMS: Real-Time Executive for Multiprocessor Systemsの略。組み込みシステム向けのリアルタイムオペレーティングシステム(RTOS)。
gccgo
がRTEMSに移植されていることは、Go言語が組み込み分野でも利用可能であることを示唆しています。 - Subversion (SVN): 集中型バージョン管理システム。このコミットの時点では、GCCのソースコード(
gccgo
を含む)はSubversionリポジトリで管理されていました。 - Issue Tracker (Go Issue #3325): ソフトウェア開発における課題管理システム。
Fixes #3325
は、このコミットがGoプロジェクトの課題トラッカーにおける3325番の課題を解決したことを意味します。
これらの知識があると、ドキュメントの変更がなぜ行われたのか、そしてそれがGo言語のエコシステムにおいてどのような意味を持つのかを深く理解することができます。
技術的詳細
このコミットは、doc/gccgo_install.html
という単一のHTMLドキュメントに対する広範な更新であり、gccgo
コンパイラのインストール、ビルド、および使用に関する多くの技術的詳細を網羅しています。
1. リリース情報とGo 1への対応
- GCC 4.7.0/4.7.1とGo 1:
gccgo
がGo 1のライブラリと互換性を持つように更新されたことが明記されています。GCC 4.7.0にはGo 1のライブラリの最終変更の一部が含まれていないが、GCC 4.7.1では完全なGo 1コンパイラとライブラリが含まれる予定であることが示されています。これは、gccgo
がGo言語の進化に追随していることを示唆しています。
2. ソースコードの取得とビルド
- Subversionからの取得:
gccgo
のソースコードがGCCのSubversionリポジトリ(svn://gcc.gnu.org/svn/gcc/branches/gccgo
)から取得できることが説明されています。これは、gccgo
がGCCプロジェクトの公式な一部であることを強調しています。 - ビルドオプション:
configure
スクリプトに--enable-languages=c,c++,go
オプションを追加することで、Go言語のサポートを有効にできることが示されています。 --with-arch
と--with-arch-32
: 32ビットx86ターゲットの場合に--with-arch=i586
を使用すること、および64ビットx86システムでm32
オプションを使用する場合に--with-arch-32=i586
を使用することが追加されています。これは、特定のアーキテクチャでのコンパイルの最適化と互換性に関する詳細な指示です。
3. gold
リンカの利用とGoroutineスタック
- Discontiguous Stack for Goroutines:
gccgo
がgoroutineのために「小さな非連続スタック」を使用できることが強調されています。これにより、各goroutineが比較的少ないスタックを使用できるため、より多くのgoroutineを実行できるようになります。 gold
リンカの要件: この機能を実現するためには、gold
リンカのバージョン2.22以降が必要であることが明記されています。gold
リンカのビルド手順:gold
リンカを自分でビルドするための詳細な手順(BinutilsのSubversionからのチェックアウト、configure
オプション--enable-gold=default
、flex
とbison
のインストール要件など)が追加されています。--with-ld
オプション:gccgo
をgold
リンカと連携させるために、configure
時に--with-ld=<GOLD_BINARY>
オプションを使用する必要があることが説明されています。これは、gccgo
が特定のリンカと密接に連携して動作する複雑なシステムであることを示しています。
4. Ubuntu環境でのビルドに関する注意点
- ライブラリパスの問題: Ubuntuの現在のバージョンとGCCの現在のバージョンとの間で、システムライブラリとヘッダファイルの検索パスに関する不一致があることが指摘されています。
- 回避策:
LIBRARY_PATH
,C_INCLUDE_PATH
,CPLUS_INCLUDE_PATH
といった環境変数を設定することで、この問題を回避できる具体的なコマンドが提供されています。これは、特定のOS環境でのビルドの困難さに対処するための実用的な情報です。
5. gccgo
の使用方法とライブラリのリンク
go
コマンドとの連携:gccgo
のインストールにはgo
コマンドが含まれていないが、gc
コンパイラのgo
コマンドに-compiler gccgo
オプションを渡すことで連携できることが説明されています。これは、Go開発者が既存のツールチェーンを維持しつつgccgo
を利用できる柔軟性を示しています。- ライブラリの検索パス: 実行時にコンパイルされたGoパッケージを見つけるための方法が複数提示されています。
LD_LIBRARY_PATH
環境変数の設定。- リンク時に
-Wl,-R
オプションを使用する。 -static-libgo
オプションで静的にリンクする。-static
オプションで完全に静的にリンクする。 これらのオプションは、動的リンクと静的リンクの選択肢を提供し、デプロイメントの柔軟性を高めます。
6. C言語との相互運用性
- 型マッピング: GoとCの基本的な型(
int
,byte
, ポインタ, 構造体)がどのようにマッピングされるかが詳細に説明されています。特に、Goのstring
とslice
がCの構造体としてどのように表現されるか(__go_string
,__go_slice
)が示されています。これらの内部表現は変更される可能性があることが警告されています。 - 関数呼び出し: Go関数からC関数を呼び出すための
//extern NAME
構文が導入されています。これは、gccgo
が提供するCとの直接的なインターフェースです。 - CからGo関数を呼び出す: CからGo関数を呼び出す際の命名規則(
myprefix.mypackage.Function
)と、GCCの__asm__
拡張を使用した宣言方法が示されています。 - CコードからのGo宣言の自動生成: 以前の
gcc -S -ggo
とgrep
を組み合わせた「awkward」な方法から、より洗練された-fdump-go-spec=<FILENAME>
オプションの使用が推奨されています。これにより、CのヘッダファイルからGoの宣言を自動生成し、cgo
ツールとの連携が強化されます。これは、GoとCのハイブリッド開発を容易にするための重要な改善です。
7. デバッグ
- GDBとの連携:
-g
オプションでコンパイルすることでGDBでデバッグできることが説明されています。ただし、GDBはGoに関する知識が限定的であり、Goの型がC/C++の型として表示されること、Goの文字列、インターフェース、マップ、チャネルがCのポインタや構造体として表示されることが注意点として挙げられています。
8. RTEMSへの移植
- RTEMSサポート:
gccgo
がRTEMS(組み込みシステム向けのリアルタイムOS)に移植されていることが言及されています。これは、Go言語が組み込み開発の分野でも利用可能であることを示しており、gccgo
の多様なターゲットプラットフォームへの対応能力を強調しています。
全体として、このコミットはgccgo
のドキュメントを大幅に強化し、Go 1のリリースという重要なマイルストーンに合わせて、より正確で、詳細で、実用的な情報を提供しています。特に、gold
リンカとの連携によるgoroutineの効率化、C言語との相互運用性の詳細、および特定の環境でのビルド問題への対処は、gccgo
の利用者にとって非常に価値のある情報です。
コアとなるコードの変更箇所
このコミットは、doc/gccgo_install.html
という単一のHTMLドキュメントの変更のみを含んでいます。コードの変更ではなく、ドキュメントの更新が主目的です。
変更の概要は以下の通りです。
- 追加: 213行
- 削除: 114行
具体的な変更箇所は、HTMLドキュメントの各セクションにおける加筆、修正、および削除です。
主要な変更点(差分から読み取れる範囲で):
- 冒頭部分の修正:
gccgo
がGCCの一部であり、GNU General Public Licenseの対象となること、およびgccgo
が生成するコードにはライセンスが適用されないことが明確化されました。6g
コンパイラではなくgc
コンパイラとの比較に修正され、リンク先も/doc/install.html
に更新されました。
Releases
セクションの追加:- GCCのバイナリリリースにGoサポートが含まれること、およびGCC 4.7.0と4.7.1におけるGo 1サポートの状況に関する情報が追加されました。
Source code
セクションの更新:gccgo
のソースコードがGCCのSubversionリポジトリに含まれていること、および安定版がbranches/gccgo
ブランチで利用可能であることが追記されました。
Building
セクションの更新:configure
オプションに--with-arch-32=i586
が追加されました。Gold
サブセクションの追加:gold
リンカの要件(バージョン2.22以降)、ビルド手順、および--with-ld
オプションの使用方法に関する詳細な説明が追加されました。Prerequisites
サブセクションの追加: GCCのビルドに必要な前提条件に関するGCCウェブサイトへのリンクが追加されました。Build commands
サブセクションの更新:configure
コマンドに--prefix=/opt/gccgo
が追加され、より具体的なビルドコマンドが示されました。Ubuntu
サブセクションの追加: Ubuntu環境でのライブラリパスの問題と、その回避策としての環境変数設定が追加されました。
Using gccgo
セクションの更新:go
コマンドとgccgo
の連携(-compiler gccgo
オプション)に関する説明が追加されました。- コンパイルとリンクの例が更新され、特に実行時にGoパッケージを見つけるための複数の方法(
LD_LIBRARY_PATH
,-Wl,-R
,-static-libgo
,-static
)が詳細に説明されました。
Options
セクションの更新:-fno-require-return-statement
オプションに関する記述が削除されました。
Imports
セクションの更新:- インポートデータの検索パスに関する説明が更新され、
gccgo
がオブジェクトファイルにインポートされたパッケージのファイル名を記録しないことが明記されました。
- インポートデータの検索パスに関する説明が更新され、
Unimplemented
セクションの削除:- 以前の未実装機能に関するセクションが削除されました。これは、これらの機能が実装されたか、またはドキュメントの焦点が変更されたことを示唆しています。
Debugging
セクションの更新:- GDBがGoに関する知識が限定的であること、Goの型がC/C++の型として表示されることに関する詳細が追加されました。
C Interoperability
セクションの更新:Types
サブセクションの更新: Goのint32
がCのint32_t
にマッピングされること、Goのstring
とslice
の内部構造(__go_string
,__go_slice
)に関する詳細が追加されました。Function names
サブセクションの更新: GoからC関数を呼び出すための__asm__("NAME")
構文が//extern NAME
に置き換えられ、よりGoらしい構文が導入されました。Automatic generation of Go declarations from C source code
サブセクションの更新: CコードからGo宣言を自動生成する古い方法(gcc -S -ggo
とgrep
)が非推奨となり、-fdump-go-spec=<FILENAME>
オプションの使用が推奨されました。また、cgo
ツールとの連携が強調されました。
RTEMS Port
セクションの更新:gccgo
がRTEMSに移植されていることが明確に記述されました。
これらの変更は、gccgo
の機能と利用方法に関するドキュメントを大幅に改善し、Go 1のリリースという文脈において、より正確で、詳細で、実用的な情報を提供することを目的としています。
コアとなるコードの解説
このコミットは、Go言語のgccgo
コンパイラのインストールと使用方法に関するドキュメントであるdoc/gccgo_install.html
の更新です。したがって、Go言語の「コアとなるコード」そのものの変更ではなく、そのコンパイラに関する「ドキュメントのコアとなる変更」について解説します。
このドキュメントのコアとなる変更は、以下の主要なテーマに集約されます。
-
gccgo
のGo 1への対応とリリース状況の明確化:- 以前のドキュメントでは不明瞭だった
gccgo
のGo 1サポートの状況が、GCCのバージョン(4.7.0および4.7.1)と関連付けて詳細に説明されました。これは、Go言語の主要なリリースであるGo 1へのgccgo
の準備状況を示す重要な情報です。 - 変更箇所: 新しい「Releases」セクションの追加。
- 以前のドキュメントでは不明瞭だった
-
Goroutineの効率的なスタック管理のための
gold
リンカの導入と詳細な手順:gccgo
がgoroutineのために「小さな非連続スタック」を使用できるという重要なパフォーマンス改善が強調されました。この機能は、Goアプリケーションがより多くのgoroutineを効率的に実行するために不可欠です。- この機能を実現するために、特定のバージョンの
gold
リンカ(2.22以降)が必要であることが明記され、そのビルド方法とgccgo
との連携方法(--with-ld
オプション)が非常に詳細に説明されました。これは、gccgo
の高度な利用における重要な技術的要件です。 - 変更箇所: 「Building」セクション内の「Gold」サブセクションの追加と詳細な説明。
-
C言語との相互運用性の詳細な説明と
cgo
との連携の強化:gccgo
がGCCのフロントエンドであるため、C言語との相互運用性は重要な機能です。このコミットでは、GoとCの型マッピング(特にGoのstring
とslice
の内部構造)が詳細に解説されました。- GoからC関数を呼び出すための新しい、よりGoらしい構文
//extern NAME
が導入されました。 - CコードからGo宣言を自動生成する機能が改善され、
cgo
ツールとの連携が推奨されました。これは、GoとCのハイブリッド開発をよりスムーズにするための重要な指針です。 - 変更箇所: 「C Interoperability」セクション内の「Types」と「Function names」サブセクションの更新、および「Automatic generation of Go declarations from C source code」サブセクションの刷新。
-
ビルド環境固有の問題(特にUbuntu)への対処:
- 特定のLinuxディストリビューション(Ubuntu)で
gccgo
をビルドする際に発生する可能性のあるライブラリパスの問題に対する具体的な回避策が提供されました。これは、ユーザーが直面する可能性のある実用的な問題を解決するための重要な情報です。 - 変更箇所: 「Building」セクション内の「Ubuntu」サブセクションの追加。
- 特定のLinuxディストリビューション(Ubuntu)で
これらの変更は、単なるドキュメントの修正に留まらず、gccgo
コンパイラの機能、パフォーマンス特性、および他の言語やツールとの連携に関する重要な技術的側面を明確にしています。特に、gold
リンカに関する詳細な記述は、gccgo
がGoのランタイムとどのように連携して効率的な並行処理を実現しているかを示す、技術的に深い洞察を提供しています。また、C相互運用性の改善は、gccgo
がより広範なシステムプログラミングのシナリオで利用される可能性を示唆しています。
関連リンク
- Go言語公式サイト: https://golang.org/
- GCC公式サイト: https://gcc.gnu.org/
- GNU Binutils (Gold Linker): https://www.gnu.org/software/binutils/
- RTEMS公式サイト: https://www.rtems.org/
- Go Issue #3325: (Goの公式Issueトラッカーで検索可能ですが、直接のURLは提供されていません。通常は
https://github.com/golang/go/issues/3325
のような形式になりますが、このIssueは古いものであり、現在のGitHubリポジトリに移行されているかは確認が必要です。)
参考にした情報源リンク
- GitHubコミットページ: https://github.com/golang/go/commit/a84e3baf9a4008aea78babca18048c96ec46d598
- Go Code Review (CL 5858043): https://golang.org/cl/5858043
- GCC
gccgo
ドキュメント (現在のバージョン): https://gcc.gnu.org/onlinedocs/gccgo/ (このコミットの時点のドキュメントとは内容が異なる可能性がありますが、一般的な情報源として) - Go 1 Release Notes: https://golang.org/doc/go1 (Go 1のリリースに関する一般的な情報)
- GCC Installation: https://gcc.gnu.org/install/ (GCCのビルドに関する一般的な情報)
- GNU Binutils Gold Linker: https://sourceware.org/binutils/docs/ld/Gold.html (Goldリンカに関する公式ドキュメント)
- Go
cgo
Command: https://golang.org/cmd/cgo/ (cgo
ツールに関する公式ドキュメント)