Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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を効果的に利用できるようにすることを目的としています。

前提知識の解説

このコミットの変更内容を理解するためには、以下の前提知識があると役立ちます。

  1. Go言語: Googleによって開発された静的型付けのコンパイル型プログラミング言語。並行処理に強く、シンプルで効率的な設計が特徴です。
  2. GCC (GNU Compiler Collection): GNUプロジェクトが開発している、様々なプログラミング言語に対応したコンパイラ群。C、C++、Fortran、Ada、Goなど、多くの言語のコンパイラが含まれています。gccgoは、このGCCのフロントエンドの一つとしてGo言語をサポートします。
  3. gccgo: Go言語のコンパイラの一つで、GCCのフロントエンドとして実装されています。Go言語のコードをGCCのバックエンドを通じてネイティブコードにコンパイルします。Go言語の公式コンパイラであるgc6g, 8gなど)とは異なる実装であり、それぞれ異なる特性を持ちます。例えば、gccgoはGCCの最適化パスを利用できる利点があります。
  4. gcコンパイラ: Go言語の公式配布に含まれる標準のコンパイラ群(例: go buildコマンドが内部的に使用する6g, 8gなど)。gccgoとは異なり、Go言語のためにゼロから設計されたコンパイラです。
  5. リンカ (Linker): コンパイラによって生成されたオブジェクトファイル(.oファイル)やライブラリを結合し、実行可能なプログラムを生成するツール。
  6. goldリンカ: GNU Binutilsプロジェクトの一部として開発された、新しい高速なリンカ。従来のldリンカと比較して、大規模なプロジェクトでのリンク時間を大幅に短縮できる特徴があります。gccgoにおいては、特にGoのgoroutineのスタック管理において重要な役割を果たします。
  7. Goroutine: Go言語における軽量な並行処理の単位。OSのスレッドよりもはるかに軽量で、数百万のgoroutineを同時に実行することも可能です。gccgoでは、goldリンカと連携することで、goroutineのスタックを効率的に管理し、メモリ使用量を削減します。
  8. C言語との相互運用性: 異なるプログラミング言語で書かれたコードが互いに呼び出し合ったり、データを共有したりする能力。gccgoはGCCのフロントエンドであるため、C言語との連携が比較的容易です。
  9. cgo: Go言語とC言語の相互運用を可能にするGoのツール。Cの関数をGoから呼び出したり、Goの関数をCから呼び出したりするためのバインディングを生成します。gccgoのC相互運用性に関する記述では、cgoの利用が推奨されています。
  10. RTEMS: Real-Time Executive for Multiprocessor Systemsの略。組み込みシステム向けのリアルタイムオペレーティングシステム(RTOS)。gccgoがRTEMSに移植されていることは、Go言語が組み込み分野でも利用可能であることを示唆しています。
  11. Subversion (SVN): 集中型バージョン管理システム。このコミットの時点では、GCCのソースコード(gccgoを含む)はSubversionリポジトリで管理されていました。
  12. 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=defaultflexbisonのインストール要件など)が追加されています。
  • --with-ldオプション: gccgogoldリンカと連携させるために、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のstringsliceがCの構造体としてどのように表現されるか(__go_string, __go_slice)が示されています。これらの内部表現は変更される可能性があることが警告されています。
  • 関数呼び出し: Go関数からC関数を呼び出すための//extern NAME構文が導入されています。これは、gccgoが提供するCとの直接的なインターフェースです。
  • CからGo関数を呼び出す: CからGo関数を呼び出す際の命名規則(myprefix.mypackage.Function)と、GCCの__asm__拡張を使用した宣言方法が示されています。
  • CコードからのGo宣言の自動生成: 以前のgcc -S -ggogrepを組み合わせた「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ドキュメントの各セクションにおける加筆、修正、および削除です。

主要な変更点(差分から読み取れる範囲で):

  1. 冒頭部分の修正:
    • gccgoがGCCの一部であり、GNU General Public Licenseの対象となること、およびgccgoが生成するコードにはライセンスが適用されないことが明確化されました。
    • 6gコンパイラではなくgcコンパイラとの比較に修正され、リンク先も/doc/install.htmlに更新されました。
  2. Releasesセクションの追加:
    • GCCのバイナリリリースにGoサポートが含まれること、およびGCC 4.7.0と4.7.1におけるGo 1サポートの状況に関する情報が追加されました。
  3. Source codeセクションの更新:
    • gccgoのソースコードがGCCのSubversionリポジトリに含まれていること、および安定版がbranches/gccgoブランチで利用可能であることが追記されました。
  4. Buildingセクションの更新:
    • configureオプションに--with-arch-32=i586が追加されました。
    • Goldサブセクションの追加: goldリンカの要件(バージョン2.22以降)、ビルド手順、および--with-ldオプションの使用方法に関する詳細な説明が追加されました。
    • Prerequisitesサブセクションの追加: GCCのビルドに必要な前提条件に関するGCCウェブサイトへのリンクが追加されました。
    • Build commandsサブセクションの更新: configureコマンドに--prefix=/opt/gccgoが追加され、より具体的なビルドコマンドが示されました。
    • Ubuntuサブセクションの追加: Ubuntu環境でのライブラリパスの問題と、その回避策としての環境変数設定が追加されました。
  5. Using gccgoセクションの更新:
    • goコマンドとgccgoの連携(-compiler gccgoオプション)に関する説明が追加されました。
    • コンパイルとリンクの例が更新され、特に実行時にGoパッケージを見つけるための複数の方法(LD_LIBRARY_PATH, -Wl,-R, -static-libgo, -static)が詳細に説明されました。
  6. Optionsセクションの更新:
    • -fno-require-return-statementオプションに関する記述が削除されました。
  7. Importsセクションの更新:
    • インポートデータの検索パスに関する説明が更新され、gccgoがオブジェクトファイルにインポートされたパッケージのファイル名を記録しないことが明記されました。
  8. Unimplementedセクションの削除:
    • 以前の未実装機能に関するセクションが削除されました。これは、これらの機能が実装されたか、またはドキュメントの焦点が変更されたことを示唆しています。
  9. Debuggingセクションの更新:
    • GDBがGoに関する知識が限定的であること、Goの型がC/C++の型として表示されることに関する詳細が追加されました。
  10. C Interoperabilityセクションの更新:
    • Typesサブセクションの更新: Goのint32がCのint32_tにマッピングされること、Goのstringsliceの内部構造(__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 -ggogrep)が非推奨となり、-fdump-go-spec=<FILENAME>オプションの使用が推奨されました。また、cgoツールとの連携が強調されました。
  11. RTEMS Portセクションの更新:
    • gccgoがRTEMSに移植されていることが明確に記述されました。

これらの変更は、gccgoの機能と利用方法に関するドキュメントを大幅に改善し、Go 1のリリースという文脈において、より正確で、詳細で、実用的な情報を提供することを目的としています。

コアとなるコードの解説

このコミットは、Go言語のgccgoコンパイラのインストールと使用方法に関するドキュメントであるdoc/gccgo_install.htmlの更新です。したがって、Go言語の「コアとなるコード」そのものの変更ではなく、そのコンパイラに関する「ドキュメントのコアとなる変更」について解説します。

このドキュメントのコアとなる変更は、以下の主要なテーマに集約されます。

  1. gccgoのGo 1への対応とリリース状況の明確化:

    • 以前のドキュメントでは不明瞭だったgccgoのGo 1サポートの状況が、GCCのバージョン(4.7.0および4.7.1)と関連付けて詳細に説明されました。これは、Go言語の主要なリリースであるGo 1へのgccgoの準備状況を示す重要な情報です。
    • 変更箇所: 新しい「Releases」セクションの追加。
  2. Goroutineの効率的なスタック管理のためのgoldリンカの導入と詳細な手順:

    • gccgoがgoroutineのために「小さな非連続スタック」を使用できるという重要なパフォーマンス改善が強調されました。この機能は、Goアプリケーションがより多くのgoroutineを効率的に実行するために不可欠です。
    • この機能を実現するために、特定のバージョンのgoldリンカ(2.22以降)が必要であることが明記され、そのビルド方法とgccgoとの連携方法(--with-ldオプション)が非常に詳細に説明されました。これは、gccgoの高度な利用における重要な技術的要件です。
    • 変更箇所: 「Building」セクション内の「Gold」サブセクションの追加と詳細な説明。
  3. C言語との相互運用性の詳細な説明とcgoとの連携の強化:

    • gccgoがGCCのフロントエンドであるため、C言語との相互運用性は重要な機能です。このコミットでは、GoとCの型マッピング(特にGoのstringsliceの内部構造)が詳細に解説されました。
    • GoからC関数を呼び出すための新しい、よりGoらしい構文//extern NAMEが導入されました。
    • CコードからGo宣言を自動生成する機能が改善され、cgoツールとの連携が推奨されました。これは、GoとCのハイブリッド開発をよりスムーズにするための重要な指針です。
    • 変更箇所: 「C Interoperability」セクション内の「Types」と「Function names」サブセクションの更新、および「Automatic generation of Go declarations from C source code」サブセクションの刷新。
  4. ビルド環境固有の問題(特にUbuntu)への対処:

    • 特定のLinuxディストリビューション(Ubuntu)でgccgoをビルドする際に発生する可能性のあるライブラリパスの問題に対する具体的な回避策が提供されました。これは、ユーザーが直面する可能性のある実用的な問題を解決するための重要な情報です。
    • 変更箇所: 「Building」セクション内の「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リポジトリに移行されているかは確認が必要です。)

参考にした情報源リンク