[インデックス 12198] ファイルの概要
このコミットは、Go言語のベンチマークテストスイートである test/bench/shootout
ディレクトリ内のビルドおよび実行スクリプトを更新するものです。具体的には、Makefile
を削除し、ベンチマークの実行を制御する timing.sh
スクリプトが、Goツールチェーンの環境変数をより直接的に利用するように変更されています。これにより、ビルドプロセスの依存関係が簡素化され、Goの標準ツールとの整合性が向上しています。
コミット
commit 832dcecc994ca00c0777e9d51c4ebfb2ea564a88
Author: Rob Pike <r@golang.org>
Date: Fri Feb 24 16:59:09 2012 +1100
test/bench/shootout: update post-Makefile
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5696054
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/832dcecc994ca00c0777e9d51c4ebfb2ea564a88
元コミット内容
test/bench/shootout
: Makefile後の更新
変更の背景
このコミットの背景には、Go言語のビルドシステムとツールチェーンの進化があります。以前は、Goプロジェクトの一部で Makefile
を使用してビルドプロセスを管理することが一般的でした。しかし、Goのツールチェーン自体が成熟し、go
コマンド(特に go tool dist env
のようなサブコマンド)が提供する機能が充実するにつれて、Makefile
の役割は徐々に減少していきました。
test/bench/shootout
ディレクトリは、Go言語のパフォーマンスを他の言語と比較するための「Computer Language Benchmarks Game」に関連するベンチマークを含んでいます。これらのベンチマークを正確かつ一貫して実行するためには、Goのビルド環境が適切に設定されていることが不可欠です。
このコミットは、Makefile
が提供していた環境設定の役割を timing.sh
スクリプトに直接移管することで、ビルドプロセスの簡素化とGoツールチェーンへの依存の強化を図っています。これにより、外部のビルドツール(make
)への依存を減らし、Goの標準的な方法でベンチマークを実行できるようになります。コミットメッセージの「update post-Makefile」は、Makefile
が不要になった後の更新であることを示唆しています。
前提知識の解説
-
Computer Language Benchmarks Game (CLBG): 異なるプログラミング言語のパフォーマンスを比較するための標準的なベンチマークスイートです。Go言語もこのゲームに参加しており、その結果は言語の効率性を示す重要な指標となります。
test/bench/shootout
ディレクトリは、このCLBGのGo言語実装とベンチマーク実行スクリプトを格納しています。 -
Makefile:
make
ユーティリティが使用するビルド自動化スクリプトです。依存関係に基づいてコマンドを実行し、プロジェクトのビルドプロセスを管理します。C/C++プロジェクトなどで広く使われますが、Goではgo build
やgo test
といった組み込みコマンドが強力なため、Makefile
の必要性は低い傾向にあります。 -
gomake
: 過去のGo言語プロジェクトで使われていた、Goのビルドシステムと連携するためのmake
のラッパーまたは拡張機能です。Goのビルドツールがまだ発展途上だった頃に、Makefile
と組み合わせて使われることがありました。 -
go tool dist env
: Goツールチェーンの一部であるgo tool dist
コマンドのサブコマンドです。Goのビルドに必要な環境変数(例:GOARCH
,GOOS
,GOCHAR
など)を、シェルスクリプトでeval
できる形式で出力します。これにより、Goのビルド環境をスクリプト内で簡単に設定できます。 -
GOCHAR
: Goツールチェーンが内部的に使用する環境変数の一つで、ターゲットアーキテクチャを示す文字(例:6
はamd64
、8
は386
)を格納します。これは、特定のアーキテクチャ向けのコンパイラ(例:6g
)やリンカ(例:6l
)を選択するために使用されます。 -
go tool 6g
/go tool 8g
: Goのコンパイラです。6g
はamd64
アーキテクチャ用、8g
は386
アーキテクチャ用を指します。これらのツールは通常、go build
コマンドの内部で呼び出されますが、低レベルのビルドスクリプトでは直接使用されることもあります。 -
go tool 6l
/go tool 8l
: Goのリンカです。6l
はamd64
アーキテクチャ用、8l
は386
アーキテクチャ用を指します。コンパイラと同様に、go build
の内部で呼び出されます。
技術的詳細
このコミットの主要な変更点は、test/bench/shootout/Makefile
の削除と、test/bench/shootout/timing.sh
スクリプトの修正です。
Makefile
の削除:
Makefile
は、../../../src/Make.inc
をインクルードし、timing
ターゲットで timing.sh
を呼び出すだけのシンプルなものでした。また、clean
ターゲットも定義されていました。この Makefile
が削除されたということは、timing.sh
が単独でベンチマークの実行に必要なすべての環境設定とコマンド実行を処理するようになったことを意味します。これにより、ビルドプロセスの外部依存が減り、Goのツールチェーンに直接統合される形になります。
timing.sh
の変更:
timing.sh
スクリプトは、ベンチマークの実行環境をセットアップする部分が大きく変更されました。
-
環境設定の変更: 変更前:
eval $(gomake --no-print-directory -f ../../../src/Make.inc go-env)
変更後:eval $(go tool dist env)
この変更は非常に重要です。以前はgomake
を介してMake.inc
からGoの環境変数を取得していましたが、これはGoのビルドシステムがまだ発展途上だった頃の名残です。新しいgo tool dist env
は、Goツールチェーン自体が提供する標準的な方法で、現在のGoのビルドに必要な環境変数を正確に取得します。これにより、より堅牢で将来性のある環境設定が可能になります。 -
コンパイラとリンカのパス設定: 変更後:
O=$GOCHAR GC="go tool ${O}g" LD="go tool ${O}l"
go tool dist env
によって設定されるGOCHAR
変数を利用して、特定のアーキテクチャ(例:6
foramd64
)に対応するGoコンパイラ(6g
)とリンカ(6l
)へのパスをGC
とLD
変数に設定しています。これにより、timing.sh
内で直接go tool 6g
やgo tool 6l
のようなコマンドを呼び出すことが可能になり、ベンチマークのコンパイルとリンクを細かく制御できるようになります。これは、Makefile
が削除されたことで失われたビルド制御の一部をtiming.sh
が引き継いだ形です。
これらの変更は、Goのビルドシステムが成熟し、go
コマンドがより強力になった結果として、外部のビルドツール(make
)への依存を減らし、Goのネイティブツールチェーンを最大限に活用する方向への移行を示しています。
コアとなるコードの変更箇所
diff --git a/test/bench/shootout/Makefile b/test/bench/shootout/Makefile
deleted file mode 100644
index e1c9b7b80e..0000000000
--- a/test/bench/shootout/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2011 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-include ../../../src/Make.inc
-
-all:
- @echo "make clean or timing"
-
-timing:
- ./timing.sh
-
-clean:
- rm -f [568].out *.[568]
diff --git a/test/bench/shootout/timing.sh b/test/bench/shootout/timing.sh
index 3e190e15c8..dd3e664f4c 100755
--- a/test/bench/shootout/timing.sh
+++ b/test/bench/shootout/timing.sh
@@ -5,7 +5,11 @@
set -e
-eval $(gomake --no-print-directory -f ../../../src/Make.inc go-env)
+eval $(go tool dist env)
+O=$GOCHAR
+GC="go tool ${O}g"
+LD="go tool ${O}l"
+
PATH=.:$PATH
havegccgo=false
コアとなるコードの解説
-
test/bench/shootout/Makefile
の削除: このファイル全体が削除されています。これは、ベンチマークの実行とクリーンアップのロジックが、もはやMakefile
を介して管理される必要がなくなったことを意味します。timing.sh
スクリプトがその役割を完全に引き継ぐことになります。 -
test/bench/shootout/timing.sh
の変更:-eval $(gomake --no-print-directory -f ../../../src/Make.inc go-env)
: この行は削除されました。以前はgomake
を使用して、Goのソースツリー内の共通Makefile
(Make.inc
) からGoのビルド環境変数を取得していました。これは、Goのビルドシステムがまだ発展途上だった頃の、やや間接的な方法でした。+eval $(go tool dist env)
: この行が追加されました。これは、Goツールチェーンが提供するgo tool dist env
コマンドを直接実行し、その出力(Goのビルドに必要な環境変数の定義)をeval
することで、現在のシェルセッションに適用します。これにより、Goのビルド環境がより直接的かつ正確に設定されます。+O=$GOCHAR
:go tool dist env
によって設定されるGOCHAR
環境変数の値をO
という新しいシェル変数に代入しています。GOCHAR
は、現在のターゲットアーキテクチャを示す文字(例:6
foramd64
)です。+GC="go tool ${O}g"
:O
変数(GOCHAR
の値)を使用して、特定のアーキテクチャ向けのGoコンパイラ(例:go tool 6g
)へのパスをGC
変数に設定しています。これにより、スクリプト内で直接このコンパイラを呼び出す準備ができます。+LD="go tool ${O}l"
: 同様に、O
変数を使用して、特定のアーキテクチャ向けのGoリンカ(例:go tool 6l
)へのパスをLD
変数に設定しています。これにより、スクリプト内で直接このリンカを呼び出す準備ができます。
これらの変更により、timing.sh
はGoの標準ツールチェーンとより密接に連携し、ベンチマークのビルドと実行に必要な環境を自己完結的に設定できるようになりました。
関連リンク
- コミットメッセージに記載されている Go CL (Change List) のリンク: https://golang.org/cl/5696054
- 注: このリンクは、現在のGoのコードレビューシステム(Gerrit)のURL形式とは異なり、Web検索でも直接的な情報が見つかりませんでした。これは、コミットが作成された2012年当時の古いCLシステムのものである可能性が高いです。
参考にした情報源リンク
- Go言語のベンチマークに関する一般的な情報:
go tool dist env
に関する情報:- Web検索では直接的なドキュメントが見つかりませんでしたが、Goのソースコードや関連する議論からその機能が推測されます。
- Go言語の公式ウェブサイト:
- Computer Language Benchmarks Game:
- The Computer Language Benchmarks Game (一般的な情報源として)