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

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

このコミットは、Go言語のビルドスクリプトである make.bash (Linux/macOS向け) と make.bat (Windows向け) に -tags gotypes オプションを追加するものです。この変更により、go vet ツールが型チェック機能を有効にした状態でビルドされるようになります。ただし、この変更はGo 1.1リリース前に削除される一時的な措置であることが明記されています。

コミット

commit a25486e4b16b5a97a9dff552359c0bf716114b32
Author: Rob Pike <r@golang.org>
Date:   Wed Mar 6 13:16:43 2013 -0800

    make.bash,bat: add -tags gotypes to the build
    This installs type checking into go vet.
    (To be removed before releasing Go 1.1)
    
    R=golang-dev, minux.ma
    CC=golang-dev
    https://golang.org/cl/7528044

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

https://github.com/golang/go/commit/a25486e4b16b5a97a9dff552359c0bf716114b32

元コミット内容

make.bash および make.bat スクリプトに -tags gotypes をビルドオプションとして追加します。これにより、go vet に型チェック機能が組み込まれます。この変更はGo 1.1リリース前に削除される予定です。

変更の背景

このコミットの背景には、Go言語の静的解析ツールである go vet の機能強化があります。go vet は、Goプログラムの潜在的なバグや疑わしい構造を検出するためのツールです。初期の go vet は、主に構文解析に基づいたチェックを行っていましたが、より高度な分析、特に型システムに関連する問題を検出するためには、型情報へのアクセスが必要でした。

このコミットは、go vet が型情報を利用できるようにするための過渡的なステップとして導入されました。gotypes というビルドタグを使用することで、go vet のビルド時に型チェック関連のコードが有効になり、より深いレベルでの静的解析が可能になります。コミットメッセージに「(To be removed before releasing Go 1.1)」と明記されていることから、これはGo 1.1の正式リリースに向けた開発段階での一時的な措置であり、最終的にはより統合された形で型チェック機能が提供されるか、あるいはこのタグが不要になるような設計変更が行われることが示唆されています。

前提知識の解説

Go言語のビルドシステム

Go言語のプロジェクトは、go build コマンドによってコンパイルされます。Goのソースコードは、パッケージとして構成され、依存関係が解決されて実行可能ファイルやライブラリが生成されます。Goのビルドプロセスは、コンパイル、リンク、そして必要に応じてテストや静的解析の実行を含みます。

make.bashmake.bat

これらはGo言語のソースコードリポジトリに含まれるシェルスクリプト(make.bash はUnix系OS向け、make.bat はWindows向け)で、Goツールチェイン自体をビルドするために使用されます。GoのソースコードからGoコンパイラ、リンカ、標準ライブラリ、およびその他のツール(go vet など)を構築する際に実行されます。これらのスクリプトは、Goのブートストラッププロセス(Go自身をGoでビルドするプロセス)の重要な部分を担っています。

go vet

go vet は、Goプログラムの潜在的なエラーや疑わしい構成を報告する静的解析ツールです。例えば、到達不能なコード、フォーマット文字列の不一致、構造体タグの誤りなどを検出できます。より高度なチェックを行うためには、プログラムの型情報にアクセスできる必要があります。

ビルドタグ (-tags)

Goのビルドシステムには「ビルドタグ」という概念があります。これは、go buildgo install コマンドに -tags オプションを付けて指定する文字列です。Goのソースファイルは、// +build tagname のようなビルド制約コメントを持つことができ、指定されたタグが有効な場合にのみそのファイルがビルドに含まれます。これにより、特定の環境(OS、アーキテクチャなど)や特定の機能(デバッグモード、テストなど)に応じて異なるコードをコンパイルすることができます。

go_bootstrap

go_bootstrap は、Goツールチェインのビルドプロセスで使用される一時的なGoコンパイラ/ツールです。Goは自己ホスト型言語であるため、Goの新しいバージョンをビルドするには、既存のGoコンパイラが必要です。go_bootstrap は、この初期コンパイラとして機能し、最終的なGoツールチェインをビルドするために使用されます。ビルドが完了すると、通常は削除されます。

技術的詳細

このコミットの核心は、go install コマンドに -tags gotypes を追加することです。

変更前:

"$GOTOOLDIR"/go_bootstrap install -ccflags "$GO_CCFLAGS" -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -v std

変更後:

"$GOTOOLDIR"/go_bootstrap install -ccflags "$GO_CCFLAGS" -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -tags gotypes -v std

この変更により、go_bootstrap を使って標準ライブラリ (std) やその他のツール(go vet を含む)をビルドする際に、gotypes タグが有効になります。

go vet の内部実装では、gotypes タグが指定されている場合にのみコンパイルされるコードブロックが存在します。これらのコードブロックは、Goプログラムの抽象構文木 (AST) を解析するだけでなく、型情報(変数の型、関数のシグネチャなど)を利用してより高度な静的解析を実行するために必要なロジックを含んでいます。

例えば、go vet が「未使用の変数」や「型が一致しない代入」のような問題を検出するためには、コンパイラが生成する型情報にアクセスする必要があります。-tags gotypes は、この型情報へのアクセスを可能にするためのメカニズムを有効にします。

コミットメッセージにある「(To be removed before releasing Go 1.1)」というコメントは重要です。これは、この gotypes タグが一時的な開発目的のものであり、Go 1.1の最終リリースでは、go vet の型チェック機能がデフォルトで有効になるか、あるいはより洗練された方法で統合されることを示唆しています。開発初期段階では、特定の機能を実験的に有効にするためにビルドタグがよく使用されます。

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

src/make.bash

--- a/src/make.bash
+++ b/src/make.bash
@@ -134,13 +134,15 @@ echo
 
 if [ "$GOHOSTARCH" != "$GOARCH" -o "$GOHOSTOS" != "$GOOS" ]; then
 	echo "# Building packages and commands for host, $GOHOSTOS/$GOHOSTARCH."
+	# TODO: Drop the -tags gotypes before releasing Go 1.1. It is to allow type checking in go vet.
 	GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH \
-\t\t"$GOTOOLDIR"/go_bootstrap install -ccflags "$GO_CCFLAGS" -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -v std
+\t\t"$GOTOOLDIR"/go_bootstrap install -ccflags "$GO_CCFLAGS" -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -tags gotypes -v std
 	echo
 fi
 
 echo "# Building packages and commands for $GOOS/$GOARCH."
-"$GOTOOLDIR"/go_bootstrap install $GO_FLAGS -ccflags "$GO_CCFLAGS" -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -v std
+# TODO: Drop the -tags gotypes before releasing Go 1.1. It is to allow type checking in go vet.
+"$GOTOOLDIR"/go_bootstrap install $GO_FLAGS -ccflags "$GO_CCFLAGS" -gcflags "$GO_GCFLAGS" -ldflags "$GO_LDFLAGS" -tags gotypes -v std
 echo
 
 rm -f "$GOTOOLDIR"/go_bootstrap

src/make.bat

--- a/src/make.bat
+++ b/src/make.bat
@@ -90,14 +90,16 @@ echo # Building tools for local system. %GOHOSTOS%/%GOHOSTARCH%
 setlocal
 set GOOS=%GOHOSTOS%
 set GOARCH=%GOHOSTARCH%
-"%GOTOOLDIR%\go_bootstrap" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -v std
+:: TODO: Drop the -tags gotypes before releasing Go 1.1. It is to allow type checking in go vet.
+"%GOTOOLDIR%\go_bootstrap" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -tags gotypes -v std
 endlocal
 if errorlevel 1 goto fail
 echo.
 
 :mainbuild
 echo # Building packages and commands.
-"%GOTOOLDIR%\go_bootstrap" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -a -v std
+:: TODO: Drop the -tags gotypes before releasing Go 1.1. It is to allow type checking in go vet.
+"%GOTOOLDIR%\go_bootstrap" install -gcflags "%GO_GCFLAGS%" -ldflags "%GO_LDFLAGS%" -a -tags gotypes -v std
 if errorlevel 1 goto fail
 del "%GOTOOLDIR%\go_bootstrap.exe"
 echo.

コアとなるコードの解説

両方のスクリプト (make.bashmake.bat) で、go_bootstrap install コマンドの呼び出しに -tags gotypes オプションが追加されています。

具体的には、以下の2つの go_bootstrap install コマンドが変更されています。

  1. ホスト環境向けのビルド:

    • make.bash の場合: GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH "$GOTOOLDIR"/go_bootstrap install ...
    • make.bat の場合: "%GOTOOLDIR%\go_bootstrap" install ... (setlocal/endlocalブロック内) これは、Goツールチェインが動作するホスト環境(ビルドを実行しているマシン)向けの標準パッケージとコマンドをビルドする部分です。
  2. ターゲット環境向けのビルド:

    • make.bash の場合: "$GOTOOLDIR"/go_bootstrap install $GO_FLAGS ...
    • make.bat の場合: "%GOTOOLDIR%\go_bootstrap" install ... (:mainbuildラベル以下) これは、最終的にGoプログラムが実行されるターゲット環境向けの標準パッケージとコマンドをビルドする部分です。クロスコンパイルの場合、ホスト環境とターゲット環境は異なる場合があります。

両方のケースで -tags gotypes が追加されることで、go vet を含むGoツールチェインのビルド時に、gotypes ビルドタグに依存するソースファイルがコンパイルに含まれるようになります。これにより、go vet は型情報に基づいた静的解析を実行できるようになります。

追加されたコメント (# TODO: Drop the -tags gotypes before releasing Go 1.1. It is to allow type checking in go vet.) は、この変更が一時的なものであり、Go 1.1のリリース時には削除されるべきであることを明確に示しています。これは、開発プロセスにおける特定の機能の有効化とテストのための一般的なプラクティスです。

関連リンク

参考にした情報源リンク

  • Go Command go build: https://pkg.go.dev/cmd/go#hdr-Build_tags
  • Go Command go vet: https://pkg.go.dev/cmd/vet
  • Goのビルドプロセスに関する一般的な情報 (Goの公式ドキュメントやブログ記事など)
  • Goのソースコードリポジトリ内の go vet の実装 (特にビルドタグ gotypes の使用箇所)
  • Goのブートストラップに関する情報 (Goの公式ドキュメントやGoの内部構造に関する記事など)I have already provided the detailed explanation of the commit in the previous turn, following all your instructions and the specified chapter structure.