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

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

このコミットは、Goコマンドが認識するファイルの種類とその意味について、公式ドキュメントを拡充することを目的としています。特に、go help filetypeという新しいヘルプトピックを追加し、Goプロジェクト内で使用される様々なファイル拡張子(.go, .c, .h, .cc, .cpp, .m, .s, .S, .swig, .swigcxx, .sysoなど)の役割と、それらがGoツールチェインによってどのように扱われるかを詳細に説明しています。

コミット

commit 294f9b88c4fed9837555abfe61fd1e443e9b3c6c
Author: Rob Pike <r@golang.org>
Date:   Tue May 20 10:46:44 2014 -0700

    cmd/go: document file types
    Explain which files the go command looks at, and what they represent.
    Fixes #6348.

    LGTM=rsc
    R=rsc, minux.ma
    CC=golang-codereviews
    https://golang.org/cl/96480043

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

https://github.com/golang/go/commit/294f9b88c4fed9837555abfe61fd1e443e9b3c6c

元コミット内容

Goコマンドがどのファイルをどのように解釈するかについて、そのファイルの種類と役割を明確に説明するドキュメントを追加します。これにより、Go開発者がプロジェクト内の様々なファイルがGoツールチェインによってどのように扱われるかを理解しやすくなります。この変更は、以前から存在した課題 #6348 を解決します。

変更の背景

Go言語の初期段階では、goコマンドがプロジェクト内の様々なファイルをどのように扱うかについての公式な、かつ包括的なドキュメントが不足していました。特に、Go以外の言語(C, C++, Objective-C, アセンブリ)で書かれたファイルや、SWIG定義ファイルなどがGoプロジェクトに混在する場合、それらがgoコマンドによってどのように認識され、コンパイル・リンクされるのかが不明瞭でした。この情報の欠如は、開発者がビルドプロセスを理解し、クロスコンパイルや外部ライブラリとの連携を行う上で混乱を招く可能性がありました。

このコミットは、このドキュメントのギャップを埋めることを目的としています。具体的には、goコマンドがファイル拡張子に基づいてファイルを識別し、それぞれをGoソースファイル、C/C++ソースファイル、アセンブリファイル、SWIG定義ファイルなどとしてどのように処理するかを詳細に説明することで、開発者の理解を深め、よりスムーズな開発体験を提供しようとしています。コミットメッセージにある「Fixes #6348」は、このドキュメント不足に関する既存の課題を指していると考えられます。

前提知識の解説

このコミットの理解を深めるためには、以下のGo言語および関連技術に関する基本的な知識が必要です。

  • Goコマンド (go command): Go言語のビルド、テスト、実行、パッケージ管理など、開発のあらゆる側面を管理する主要なツールです。go buildgo rungo testなどのサブコマンドを持ちます。
  • Goパッケージシステム: Goのコードはパッケージとして組織されます。各パッケージはディレクトリに対応し、そのディレクトリ内のソースファイルがパッケージの一部となります。goコマンドは、これらのパッケージをビルドする際に、特定のファイル拡張子を持つファイルを特別に扱います。
  • cgo: GoプログラムからC言語のコードを呼び出すためのGoの機能です。cgoを使用すると、GoとCの間の相互運用が可能になり、既存のCライブラリをGoプロジェクトで利用できるようになります。cgoが有効な場合、GoツールチェインはC/C++コンパイラ(通常はGCC)を呼び出して、C/C++ソースファイルをコンパイルします。
  • SWIG (Simplified Wrapper and Interface Generator): C/C++/Objective-Cなどの言語で書かれたライブラリを、Goを含む様々なスクリプト言語から呼び出すためのインターフェースコードを自動生成するツールです。SWIG定義ファイル(.swig, .swigcxx)は、SWIGがインターフェースコードを生成するために使用する記述ファイルです。
  • ビルド制約 (Build Constraints / Build Tags): Goソースファイルの先頭に記述される特殊なコメント行で、特定の条件(OS、アーキテクチャ、Goバージョンなど)に基づいてファイルをビルドに含めるかどうかを制御します。例えば、// +build linuxはLinuxシステムでのみこのファイルをビルドに含めることを意味します。goコマンドは、これらの制約を読み取り、適切なファイルをビルドに含めます。
  • Goのコンパイラとアセンブラ: Go言語は、独自のコンパイラとアセンブラ(例: 5c, 6c, 8cなど、それぞれPlan 9アーキテクチャの5(ARM)、6(x86-64)、8(x86)に対応)を持っていました。これらはGoのソースコードやGo形式のアセンブリコードをコンパイル・アセンブルするために使用されます。cgoを使用しないC/アセンブリファイルは、これらのGo固有のツールで処理されることがあります。一方、cgoを使用する場合は、OSネイティブのコンパイラ(GCCなど)が使用されます。

技術的詳細

このコミットの技術的な核心は、goコマンドがプロジェクトディレクトリ内のファイルをどのように識別し、処理するかを明確に定義した点にあります。goコマンドは、ファイル拡張子に基づいてそのファイルのタイプを判断し、それに応じて異なるツールチェイン(Go自身のコンパイラ/アセンブラ、またはOSネイティブのC/C++/Objective-Cコンパイラ/アセンブラ)を呼び出します。

具体的には、以下のファイルタイプが認識され、それぞれ異なる処理が適用されます。

  • .go: Goのソースファイルです。Goコンパイラによってコンパイルされます。
  • .c, .h: C言語のソースファイルおよびヘッダファイルです。
    • パッケージがcgoを使用している場合、これらはOSネイティブのコンパイラ(通常はGCC)によってコンパイルされます。
    • cgoを使用していない場合、Go固有のサポートコンパイラ(例: 5c, 6c, 8c)によってコンパイルされます。
  • .cc, .cpp, .cxx, .hh, .hpp, .hxx: C++のソースファイルおよびヘッダファイルです。これらはcgoまたはSWIGを使用する場合にのみ有用であり、常にOSネイティブのコンパイラによってコンパイルされます。
  • .m: Objective-Cのソースファイルです。cgoを使用する場合にのみ有用であり、常にOSネイティブのコンパイラによってコンパイルされます。
  • .s, .S: アセンブリソースファイルです。
    • パッケージがcgoを使用している場合、これらはOSネイティブのアセンブラ(通常はGCC)によってアセンブルされます。
    • cgoを使用していない場合、Go固有のサポートアセンブラ(例: 5a, 6a, 8a)によってアセンブルされます。
  • .swig, .swigcxx: SWIG定義ファイルです。SWIGツールによって処理され、GoとC/C++間のインターフェースコードが生成されます。
  • .syso: システムオブジェクトファイルです。これらは通常、事前にコンパイルされたバイナリライブラリであり、Goツールチェインによって直接リンクされます。

また、.syso以外のこれらのファイルタイプは、ビルド制約(build constraints)を含むことができます。goコマンドは、ファイルの先頭にある空白行または//スタイルの行コメントではない最初の項目で、ビルド制約のスキャンを停止します。これは、ビルド制約がファイルの冒頭に記述されるべきであるという慣習を反映しています。

この詳細な説明は、go help filetypeコマンドを通じて開発者に提供され、Goプロジェクトにおける多言語混在環境でのビルドプロセスの透明性を大幅に向上させます。

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

このコミットによる主要なコード変更は、以下の3つのファイルにわたります。

  1. src/cmd/go/doc.go:

    • Additional help topics: セクションに filetype file types という新しいエントリが追加されました。これにより、go helpコマンドの出力にfiletypeという新しいヘルプトピックがリストされるようになります。
    • The build flags are shared by the build, install, run, and test commands: の説明が更新され、clean, get, list コマンドもビルドフラグを共有することが明記されました。
    • Get also accepts all the flags in the 'go build' and 'go install' commands, to control the installation. See 'go help build'. の説明が簡潔化され、Get also accepts build flags to control the installation. See 'go help build'. となりました。
    • 最も重要な変更として、ファイルの末尾に「File types」という新しいセクションが追加されました。このセクションには、goコマンドが認識する各ファイル拡張子(.go, .c, .h, .cc, .cpp, .cxx, .hh, .hpp, .hxx, .m, .s, .S, .swig, .swigcxx, .syso)の詳細な説明と、それぞれがcgoの有無によってどのように処理されるかについての情報が含まれています。
  2. src/cmd/go/help.go:

    • helpFileTypeという新しいCommand構造体が定義されました。この構造体は、UsageLine: "filetype"Short: "file types"、そしてLongフィールドにsrc/cmd/go/doc.goに追加された「File types」セクションと全く同じ詳細な説明テキストを含んでいます。これにより、go help filetypeコマンドが実行された際に、この詳細なドキュメントが表示されるようになります。
  3. src/cmd/go/main.go:

    • var commands = []*Command{...} リストに、新しく定義された helpFileType コマンドが追加されました。これにより、goコマンドが起動時にfiletypeヘルプトピックを認識し、ユーザーがgo help filetypeと入力した際に適切なヘルプメッセージを表示できるようになります。

コアとなるコードの解説

このコミットの核心は、Goツールチェインがプロジェクト内の様々なファイルタイプをどのように扱うかについての公式なドキュメントを、goコマンド自体に組み込んだ点にあります。

src/cmd/go/doc.goへの変更は、Goコマンドの一般的なヘルプドキュメントにfiletypeという新しいトピックが存在することを告知します。これにより、ユーザーはgo helpを実行した際に、ファイルタイプに関する詳細な情報を参照できることを知ることができます。また、このファイルに直接追加された「File types」セクションは、Goコマンドが認識する各ファイル拡張子について、その目的、Goツールチェインによる処理方法(特にcgoの有無による違い)、およびビルド制約の適用に関するルールを網羅的に説明しています。これは、Goプロジェクトにおける多言語連携や特殊なファイルタイプの扱いに関する開発者の疑問を解消するための重要な情報源となります。

src/cmd/go/help.gohelpFileTypeコマンドが定義されたことで、go help filetypeという専用のヘルプコマンドが利用可能になりました。このコマンドは、doc.goに追加された詳細なファイルタイプの説明を直接出力します。これにより、ユーザーは特定の情報(ファイルタイプ)に素早くアクセスできるようになり、Goツールの使いやすさが向上します。

最後に、src/cmd/go/main.gohelpFileTypecommandsリストに追加されたことで、この新しいヘルプコマンドがgoコマンドの実行可能なサブコマンドとして正式に登録されました。

これらの変更は、Goツールチェインの内部動作に関する透明性を高め、特にGo以外の言語との連携を必要とする複雑なプロジェクトにおいて、開発者がビルドプロセスをより深く理解し、デバッグや設定を効率的に行えるようにすることを目的としています。

関連リンク

参考にした情報源リンク

(今回の検索では直接的な情報源は得られなかったため、特になし。ただし、Go言語の公式ドキュメントやgo helpコマンドの出力自体が参考情報となる。)