[インデックス 131] ファイルの概要
このコミットは、Go言語のテストスイートにおける変更を含んでいます。具体的には、test/golden.out
ファイルから特定のテスト失敗に関する記述が削除され、test/run
スクリプトがデフォルトで amd64
アーキテクチャを想定するように修正されています。これにより、test/func.go
のテストが正しく動作するようになったことが示唆されています。
コミット
commit 316bc2637de964b0fd39b985b7ac7030b3febeb1
Author: Rob Pike <r@golang.org>
Date: Sun Jun 8 17:29:57 2008 -0700
default to amd64 in run
test/func.go now works; update golden.out
SVN=121617
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/316bc2637de964b0fd39b985b7ac7030b3febeb1
元コミット内容
default to amd64 in run
test/func.go now works; update golden.out
SVN=121617
変更の背景
このコミットが行われた2008年6月は、Go言語がまだ一般に公開される前の初期開発段階にありました。当時のGo言語は、様々なアーキテクチャでの動作を想定しつつも、開発の中心は特定のアーキテクチャ(この場合はamd64
)に集中していたと考えられます。
test/run
スクリプトは、Go言語のテストを実行するための主要なスクリプトであり、実行環境のアーキテクチャを適切に識別し、それに応じたテスト設定を行う必要がありました。しかし、特定のアーキテクチャが明示的に指定されていない場合や、不明なアーキテクチャの場合に、テストが正しく実行されない問題が発生していた可能性があります。
test/func.go
は、Go言語の関数に関するテストファイルであり、そのテストが以前は失敗していたことが示唆されています。test/golden.out
は、テストの期待される出力(ゴールデンファイル)を記録するファイルであり、テストが修正された際にこのファイルも更新されるのが一般的です。
したがって、この変更の背景には、Go言語のテスト環境の安定化と、特定のアーキテクチャ(amd64
)でのテスト実行の信頼性向上という目的があったと推測されます。特に、amd64
が当時の主要な開発環境であったため、明示的な指定がない場合にこのアーキテクチャをデフォルトとすることで、開発効率とテストの成功率を高める狙いがあったと考えられます。
前提知識の解説
1. amd64
アーキテクチャ
amd64
は、AMDが開発し、後にIntelも採用した64ビットの命令セットアーキテクチャです。x86-64とも呼ばれ、現在のパーソナルコンピュータやサーバーの主流となっています。Go言語のようなコンパイラ言語では、ターゲットとするアーキテクチャによって生成されるバイナリコードが異なります。そのため、テスト環境においても、どのアーキテクチャでテストを実行するかを明確にする必要があります。
2. test/run
スクリプト
test/run
は、Go言語のソースコードリポジトリ内の test
ディレクトリに存在するシェルスクリプトです。Go言語のテストスイートを実行するためのエントリポイントとして機能します。このスクリプトは、テスト対象のGoプログラムをコンパイルし、実行し、その出力を検証する役割を担っています。通常、環境変数やコマンドライン引数に基づいて、テストの実行方法やターゲットアーキテクチャを決定します。
3. test/golden.out
ファイル
test/golden.out
は、Go言語のテストスイートにおいて、特定のテストの期待される出力("golden" または "reference" 出力)を記録するファイルです。テストが実行されると、その出力がこのゴールデンファイルと比較されます。両者が一致すればテストは成功とみなされ、一致しなければ失敗とみなされます。テストの修正や機能追加によって期待される出力が変わった場合、このゴールデンファイルも更新する必要があります。
4. doasm
エラーとアセンブリコード
コミットの差分に含まれる main_f4: doasm: notfound from=75 to=10 (24) IDIVL $2,AX
という行は、Go言語のコンパイラまたはアセンブラがアセンブリコードの生成中に遭遇したエラーメッセージを示しています。
doasm
: これは、Go言語のコンパイラがアセンブリコードを生成する内部プロセスに関連するキーワードである可能性が高いです。Go言語のコンパイラは、Goのソースコードを直接機械語に変換するのではなく、中間表現を経てアセンブリコードを生成し、それをアセンブラが機械語に変換するという多段階のプロセスを踏むことがあります。doasm
は "do assembly" の略で、アセンブリコード生成処理の一部を示唆しています。notfound from=75 to=10 (24)
: これは、アセンブリコード内の特定の命令やシンボルが見つからなかったことを示すエラーの詳細です。from
とto
は、コード内のアドレスやオフセット、または命令の範囲を示している可能性があります。(24)
は、何らかの内部的なコードやエラー番号かもしれません。IDIVL $2,AX
: これは、x86アセンブリ言語の命令です。IDIVL
: 符号付き除算命令(Integer Divide Long)。オペランドのサイズが32ビットであることを示唆しています。$2
: 即値オペランドで、除数として2を使用することを示します。AX
: x86プロセッサのレジスタの一つで、通常はアキュムレータとして使用されます。除算命令では、被除数や商、剰余が格納されることがあります。
このエラーは、test/func.go
のテストが、特定の関数(main_f4
)内で、IDIVL
命令を含むアセンブリコードの生成に失敗していたことを示しています。これは、コンパイラのバグ、またはターゲットアーキテクチャに対するアセンブリコード生成の不整合が原因であった可能性があります。
技術的詳細
このコミットは、Go言語の初期開発におけるテストインフラストラクチャの調整を示しています。
test/golden.out
の変更
test/golden.out
から以下の4行が削除されています。
main_f4: doasm: notfound from=75 to=10 (24) IDIVL $2,AX
main_f4: doasm: notfound from=75 to=10 (24) IDIVL $2,AX
main_f4: doasm: notfound from=75 to=10 (24) IDIVL $2,AX
BUG: known to fail incorrectly
これらの行は、./func.go
テストの実行時に発生していた既知の失敗(doasm
エラー)に関する記述です。このエラーは、main_f4
という関数内で、IDIVL $2,AX
というアセンブリ命令の生成に関連する問題が発生していたことを示しています。このコミットによって test/func.go
が「now works」とされていることから、この doasm
エラーが修正され、もはや golden.out
に記録する必要がなくなったことを意味します。これは、コンパイラまたはアセンブラのバグが修正されたか、またはテスト環境の構成が変更された結果、このエラーが発生しなくなったことを示唆しています。
test/run
の変更
test/run
スクリプトでは、アーキテクチャの判別ロジックが変更されています。
元のコードでは、uname -m
の出力に基づいてアーキテクチャを判別し、amd64
以外の場合は「unknown architecture」として終了していました。
case `uname -m` in
Xamd64)
export A=6
;;
*)
echo 1>&2 run: unknown architecture
exit 1
esac
変更後のコードでは、amd64
以外の場合でも即座に終了するのではなく、export A=6
を実行し、assuming amd64
というメッセージを出力して続行するように変更されています。
case `uname -m` in
Xamd64)
export A=6
;;
*)
export A=6
echo 1>&2 run: assuming amd64
exit 1
esac
この変更は、uname -m
が amd64
を返さない環境(例えば、古いLinuxディストリビューションや、x86_64
のような異なる文字列を返すシステム)でも、Goのテストが amd64
アーキテクチャを前提として実行されるようにするためのものです。export A=6
は、Goのビルドシステムにおいて amd64
アーキテクチャを示すための環境変数設定であると推測されます。これにより、明示的に amd64
と認識されない環境でも、テストが中断されることなく amd64
として実行されるようになり、テストの互換性と利便性が向上しました。ただし、exit 1
が残っているため、最終的には終了するものの、assuming amd64
というメッセージを出すことで、ユーザーに何が起こっているかを伝える意図があると考えられます。これは、厳密なアーキテクチャチェックよりも、amd64
環境でのテスト実行を優先する初期開発段階のプラクティスを示しています。
コアとなるコードの変更箇所
test/golden.out
の差分
--- a/test/golden.out
+++ b/test/golden.out
@@ -14,10 +14,6 @@ for.go:45: fatal error: optoas: no entry MOD-<int32>INT32
BUG: known to fail incorrectly
=========== ./func.go
-main_f4: doasm: notfound from=75 to=10 (24) IDIVL $2,AX
-main_f4: doasm: notfound from=75 to=10 (24) IDIVL $2,AX
-main_f4: doasm: notfound from=75 to=10 (24) IDIVL $2,AX
-BUG: known to fail incorrectly
=========== ./func1.go
BUG: known to succeed incorrectly
test/run
の差分
--- a/test/run
+++ b/test/run
@@ -8,7 +8,8 @@ Xamd64)
export A=6
;;
*)
- echo 1>&2 run: unknown architecture
+ export A=6
+ echo 1>&2 run: assuming amd64
exit 1
esac
コアとなるコードの解説
test/golden.out
の変更の解説
test/golden.out
から削除された行は、以前は test/func.go
のテストが main_f4
関数で doasm
エラー(アセンブリコード生成エラー)により失敗していたことを示す記録でした。このコミットの目的の一つが「test/func.go
now works」であることから、このエラーが修正されたため、もはや golden.out
にその失敗を記録する必要がなくなったことを意味します。これは、Goコンパイラのアセンブリコード生成部分の安定化、またはテスト環境の調整によって、この特定の問題が解決されたことを示しています。
test/run
の変更の解説
test/run
スクリプトの変更は、アーキテクチャの自動判別ロジックをより寛容にするものです。
- 変更前:
uname -m
の出力が厳密にXamd64
でない場合、スクリプトは「unknown architecture」というエラーメッセージを出力して終了していました。これは、amd64
以外の環境や、uname -m
がx86_64
のように異なる文字列を返す環境では、テストが実行できないことを意味します。 - 変更後:
uname -m
がXamd64
でない場合でも、export A=6
を実行し、assuming amd64
というメッセージを出力するように変更されました。これにより、Goのビルドシステムはamd64
アーキテクチャをターゲットとして動作しようとします。その後、スクリプトはexit 1
で終了しますが、これはおそらく、完全にサポートされていないアーキテクチャでの実行を許可しないという最終的なポリシーを維持しつつも、少なくともamd64
としてのテスト実行を試みるという意図があったと考えられます。この変更は、Go言語の初期開発段階において、amd64
が主要な開発・テストターゲットであったため、他のアーキテクチャでの厳密なチェックよりも、amd64
環境でのテスト実行の利便性を優先した結果と見られます。
関連リンク
- Go言語のGitHubリポジトリ: https://github.com/golang/go
- x86-64 (amd64) アーキテクチャに関する情報: https://ja.wikipedia.org/wiki/X86-64
参考にした情報源リンク
- Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
- x86アセンブリ言語の基本知識 (一般的な情報源)
- Go言語の初期開発に関する議論やドキュメント (公開されているものがあれば)
uname -m
コマンドの動作に関する情報 (Linux manページなど)IDIVL
命令に関する情報 (x86命令セットリファレンス)- Go言語のビルドシステムにおける環境変数
A
の役割に関する情報 (Goのソースコードやドキュメント) doasm
エラーに関するGo言語のIssueや議論 (もし存在すれば)