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

[インデックス 16467] ファイルの概要

このコミットは、Go言語のリリースノートである doc/go1.2.txt ファイルに対する更新です。具体的には、cmd/cgo および cmd/go が C++ コードの cgo によるインクルードをサポートするようになったこと、そして go/build も同様に C++ コードの cgo によるインクルードをサポートするようになったことに関する記述を追加しています。これは、Go 1.2 リリースに向けた変更点の一部として記録されています。

コミット

commit 1a145cd52db21b07406568106f75d89c07af0ce8
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Mon Jun 3 03:09:47 2013 +0800

    doc/go1.2.txt: update for CL 8248043.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/9949044

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/1a145cd52db21b07406568106f75d89c07af0ce8

元コミット内容

このコミット自体は、doc/go1.2.txt というドキュメントファイルを更新するものです。その内容は以下の通りです。

--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -9,7 +9,9 @@ package or cmd/xxx directory name, and ending in a CL number.
 Please keep the list sorted (as in sort.Strings of the lines).
 
 cmd/5a: removed support for R9/R10 (use m/g instead) (CL 9840043).
+cmd/cgo, cmd/go: support including C++ code with cgo (CL 8248043).
 
 fmt: indexed access to arguments in Printf etc. (CL 9680043).
+go/build: support including C++ code with cgo (CL 8248043).
 io: Copy prioritizes WriterTo over ReaderFrom (CL 9462044).
 testing: AllocsPerRun is now quantized to an integer (the type is still float64) (CL 9837049).

この差分からわかるように、cmd/cgo, cmd/go: support including C++ code with cgo (CL 8248043).go/build: support including C++ code with cgo (CL 8248043). の2行が doc/go1.2.txt に追加されています。これは、Go 1.2 の新機能として、cgo が C++ コードのインクルードをサポートするようになったことを示しています。

変更の背景

このコミットの背景には、Go 1.2 リリースにおける cgo の機能拡張があります。Go言語は、C言語のコードをGoプログラムから呼び出すためのメカニズムとして cgo を提供しています。しかし、従来の cgo は C++ コードの直接的なインクルードを十分にサポートしていませんでした。

CL 8248043 は、この制限を解消し、cgo が C++ コードをよりシームレスに扱えるようにするための変更を導入しました。このコミットは、その機能拡張が Go 1.2 の重要な変更点であることを公式ドキュメントに反映させるために行われました。これにより、Go 1.2 のユーザーは、cgo を介して C++ ライブラリや既存の C++ コードベースをGoプロジェクトに統合することが容易になります。

前提知識の解説

Go言語とcgo

Go言語は、Googleによって開発された静的型付けのコンパイル型言語です。並行処理に優れ、シンプルで効率的なプログラミングを目的としています。

cgo は、GoプログラムからC言語のコードを呼び出すためのGoのツールです。Goのソースファイル内に import "C" という特殊なインポート文を記述することで、C言語の関数やデータ構造をGoコードから利用できるようになります。cgo は、GoとCの間のデータ変換や関数呼び出しの橋渡しを行います。

C++ との相互運用性

Go言語はC言語との相互運用性を重視していますが、C++ との直接的な相互運用性はC言語ほど単純ではありません。C++ はC言語のスーパーセットであり、クラス、テンプレート、例外処理などの高度な機能を持っています。これらの機能は、C言語のABI (Application Binary Interface) とは異なるため、GoからC++ を直接呼び出すには特別な考慮が必要です。

Goのビルドシステム (cmd/go, go/build)

  • cmd/go: Go言語の公式ツールチェーンのコマンドラインインターフェースです。Goプログラムのビルド、テスト、実行、パッケージ管理など、Go開発における主要な操作を行います。
  • go/build: Goの標準ライブラリの一部で、Goパッケージのビルドプロセスに関する情報を提供します。ソースファイルの解析、依存関係の解決、ビルドタグの処理など、ビルドシステムの内部的なロジックを扱います。

リリースノート (doc/go1.2.txt)

Go言語の各メジャーリリースでは、そのバージョンで導入された新機能、変更点、非互換性などがまとめられたリリースノートが提供されます。doc/go1.2.txt は、Go 1.2 のリリースノートの草稿または最終版の一部であり、ユーザーが新しいバージョンで何が変更されたかを把握するための重要なドキュメントです。

技術的詳細

このコミット自体はドキュメントの更新ですが、その背後にある技術的変更は、cgo が C++ コードを処理する方法の改善です。

従来の cgo は、C言語のコンパイラ(通常はGCCやClang)を使用してCコードをコンパイルしていました。C++ コードをGoから呼び出す場合、通常はC++ コードをCリンケージでエクスポートし、Cのインターフェースを介してGoから呼び出すという間接的な方法が取られていました。

CL 8248043 によって導入された変更は、cgo ツールが C++ ソースファイルを直接認識し、C++ コンパイラ(g++ など)を使用してコンパイルする能力を獲得したことを意味します。これにより、Go開発者は import "C" ブロック内で C++ のヘッダーファイルをインクルードしたり、C++ の関数を宣言したりすることが可能になりました。

具体的には、以下のコンポーネントが影響を受け、C++ コードのサポートが強化されました。

  1. cmd/cgo: cgo ツール自体が、Goソースファイル内の import "C" ブロックに記述された C++ コードを適切に解析し、C++ コンパイラに渡すためのロジックを実装しました。これにより、GoとC++ の間の型変換や関数呼び出しのメカニズムが改善されました。
  2. cmd/go: Goのビルドコマンドが、cgo を使用するGoパッケージをビルドする際に、C++ ソースファイル(.cpp, .cc, .cxx など)を認識し、適切なコンパイラ(g++ など)を呼び出すように変更されました。
  3. go/build: Goのビルドパッケージが、C++ ソースファイルの検出と処理に関するロジックを更新しました。これにより、Goのビルドシステム全体で C++ コードの存在が認識され、適切にビルドプロセスに組み込まれるようになりました。

この変更により、GoとC++ の間の相互運用性が大幅に向上し、既存のC++ ライブラリをGoプロジェクトで再利用する際の障壁が低減されました。

コアとなるコードの変更箇所

このコミット自体は、doc/go1.2.txt という単一のドキュメントファイルのみを変更しています。

--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -9,7 +9,9 @@ package or cmd/xxx directory name, and ending in a CL number.
 Please keep the list sorted (as in sort.Strings of the lines).
 
 cmd/5a: removed support for R9/R10 (use m/g instead) (CL 9840043).
+cmd/cgo, cmd/go: support including C++ code with cgo (CL 8248043).
 
 fmt: indexed access to arguments in Printf etc. (CL 9680043).
+go/build: support including C++ code with cgo (CL 8248043).
 io: Copy prioritizes WriterTo over ReaderFrom (CL 9462044).
 testing: AllocsPerRun is now quantized to an integer (the type is still float64) (CL 9837049).

追加された行は以下の2行です。

  • cmd/cgo, cmd/go: support including C++ code with cgo (CL 8248043).
  • go/build: support including C++ code with cgo (CL 8248043).

これらの行は、Go 1.2 のリリースノートに、cgo が C++ コードをサポートするようになったという重要な変更点を記録しています。

コアとなるコードの解説

このコミット自体には、Go言語のランタイムやコンパイラの「コアとなるコード」の変更は含まれていません。これはあくまでドキュメントの更新です。

しかし、このドキュメント更新が参照している CL 8248043 は、Goのツールチェーン(特に cmd/cgocmd/go、そして go/build パッケージ)の内部実装に大きな変更をもたらしました。これらの変更は、C++ ソースファイルの検出、コンパイル、リンクの方法を改善し、GoとC++ の間の相互運用性を実現するためのものです。

具体的には、CL 8248043 では、cgo が C++ のヘッダーファイルやソースファイルを認識し、それらを C++ コンパイラ(g++ など)に渡すためのロジックが追加されました。これにより、Goの import "C" ブロック内で C++ の機能(例えば、C++ のクラスのインスタンスを生成したり、C++ の関数を呼び出したり)を直接利用できるようになりました。

この変更は、Goのビルドシステムが C++ のコンパイルとリンクの複雑さを抽象化し、Go開発者が C++ コードをGoプロジェクトに統合する際の労力を削減することを目的としています。

関連リンク

  • Go 1.2 Release Notes (公式): Go 1.2 の最終的なリリースノートは、Goの公式ウェブサイトで公開されています。このコミットが追加した内容は、その一部として含まれているはずです。
  • CL 8248043 (Gerrit): このコミットが参照している実際の変更(cgo の C++ サポート)の Gerrit レビューページ。

参考にした情報源リンク