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

[インデックス 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 が不要になった後の更新であることを示唆しています。

前提知識の解説

  1. Computer Language Benchmarks Game (CLBG): 異なるプログラミング言語のパフォーマンスを比較するための標準的なベンチマークスイートです。Go言語もこのゲームに参加しており、その結果は言語の効率性を示す重要な指標となります。test/bench/shootout ディレクトリは、このCLBGのGo言語実装とベンチマーク実行スクリプトを格納しています。

  2. Makefile: make ユーティリティが使用するビルド自動化スクリプトです。依存関係に基づいてコマンドを実行し、プロジェクトのビルドプロセスを管理します。C/C++プロジェクトなどで広く使われますが、Goでは go buildgo test といった組み込みコマンドが強力なため、Makefile の必要性は低い傾向にあります。

  3. gomake: 過去のGo言語プロジェクトで使われていた、Goのビルドシステムと連携するための make のラッパーまたは拡張機能です。Goのビルドツールがまだ発展途上だった頃に、Makefile と組み合わせて使われることがありました。

  4. go tool dist env: Goツールチェーンの一部である go tool dist コマンドのサブコマンドです。Goのビルドに必要な環境変数(例: GOARCH, GOOS, GOCHAR など)を、シェルスクリプトで eval できる形式で出力します。これにより、Goのビルド環境をスクリプト内で簡単に設定できます。

  5. GOCHAR: Goツールチェーンが内部的に使用する環境変数の一つで、ターゲットアーキテクチャを示す文字(例: 6amd648386)を格納します。これは、特定のアーキテクチャ向けのコンパイラ(例: 6g)やリンカ(例: 6l)を選択するために使用されます。

  6. go tool 6g / go tool 8g: Goのコンパイラです。6gamd64 アーキテクチャ用、8g386 アーキテクチャ用を指します。これらのツールは通常、go build コマンドの内部で呼び出されますが、低レベルのビルドスクリプトでは直接使用されることもあります。

  7. go tool 6l / go tool 8l: Goのリンカです。6lamd64 アーキテクチャ用、8l386 アーキテクチャ用を指します。コンパイラと同様に、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 for amd64)に対応するGoコンパイラ(6g)とリンカ(6l)へのパスを GCLD 変数に設定しています。これにより、timing.sh 内で直接 go tool 6ggo 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

コアとなるコードの解説

  1. test/bench/shootout/Makefile の削除: このファイル全体が削除されています。これは、ベンチマークの実行とクリーンアップのロジックが、もはや Makefile を介して管理される必要がなくなったことを意味します。timing.sh スクリプトがその役割を完全に引き継ぐことになります。

  2. 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 for amd64)です。
    • +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システムのものである可能性が高いです。

参考にした情報源リンク