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

[インデックス 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): これは、アセンブリコード内の特定の命令やシンボルが見つからなかったことを示すエラーの詳細です。fromto は、コード内のアドレスやオフセット、または命令の範囲を示している可能性があります。(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 -mamd64 を返さない環境(例えば、古い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 -mx86_64 のように異なる文字列を返す環境では、テストが実行できないことを意味します。
  • 変更後: uname -mXamd64 でない場合でも、export A=6 を実行し、assuming amd64 というメッセージを出力するように変更されました。これにより、Goのビルドシステムは amd64 アーキテクチャをターゲットとして動作しようとします。その後、スクリプトは exit 1 で終了しますが、これはおそらく、完全にサポートされていないアーキテクチャでの実行を許可しないという最終的なポリシーを維持しつつも、少なくとも amd64 としてのテスト実行を試みるという意図があったと考えられます。この変更は、Go言語の初期開発段階において、amd64 が主要な開発・テストターゲットであったため、他のアーキテクチャでの厳密なチェックよりも、amd64 環境でのテスト実行の利便性を優先した結果と見られます。

関連リンク

参考にした情報源リンク

  • Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
  • x86アセンブリ言語の基本知識 (一般的な情報源)
  • Go言語の初期開発に関する議論やドキュメント (公開されているものがあれば)
  • uname -m コマンドの動作に関する情報 (Linux manページなど)
  • IDIVL 命令に関する情報 (x86命令セットリファレンス)
  • Go言語のビルドシステムにおける環境変数 A の役割に関する情報 (Goのソースコードやドキュメント)
  • doasm エラーに関するGo言語のIssueや議論 (もし存在すれば)