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

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

このコミットは、Go言語のコンパイラまたはツールが出力するエラーメッセージの書式に関する変更です。具体的には、ファイル名と行番号の後にコロン(:)を追加することで、メッセージの可読性と一貫性を向上させています。

コミット

commit 30706a7ee7bcd997e7b6317ed5cdddc23f408dbc
Author: Rob Pike <r@golang.org>
Date:   Sun Jun 15 12:22:35 2008 -0700

    error messages now have colon after line number
    
    SVN=122803

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

https://github.com/golang/go/commit/30706a7ee7bcd997e7b6317ed5cdddc23f408dbc

元コミット内容

error messages now have colon after line number

このコミットメッセージは非常に簡潔で、変更の目的を明確に示しています。エラーメッセージのファイル名と行番号の後にコロンを追加するという、書式に関する変更です。SVN=122803 は、このコミットがSubversionリポジトリからの移行時に対応するリビジョン番号であることを示しています。Goプロジェクトは初期にSubversionを使用しており、後にGitに移行しました。

変更の背景

この変更が行われた2008年6月は、Go言語がまだ一般に公開される前の初期開発段階でした。この時期は、言語仕様、コンパイラ、ランタイム、標準ライブラリなど、Go言語の基盤が精力的に構築されていた時期です。

エラーメッセージの書式統一は、開発ツールやIDEがエラーメッセージを解析しやすくするために非常に重要です。多くのプログラミング言語のコンパイラやリンタは、ファイル名:行番号:メッセージ のような形式でエラーを出力します。これは、テキストエディタやIDEがこのパターンを認識し、エラーが発生したコードの正確な位置にジャンプする機能を提供するためです。

このコミットは、Goのエラーメッセージがこの一般的な慣習に沿うようにするための初期のステップと考えられます。これにより、Go言語のエラー出力がより標準的になり、既存のツールエコシステムとの統合が容易になることが期待されます。また、人間がエラーメッセージを読んだ際にも、ファイル名と行番号が明確に区切られることで、どこで問題が発生したのかを一目で把握しやすくなります。

さらに、このコミットでは一部の「fatal error」が「warning」に変更されています。これは、初期のコンパイラ開発段階において、特定の状況が致命的なエラーとして扱われていたものが、開発の進行に伴い、より軽微な警告として扱うべきであると判断されたことを示唆しています。これはコンパイラの成熟度向上の一環であり、より正確な診断と、開発者への適切なフィードバックを提供するための改善です。

前提知識の解説

コンパイラのエラーメッセージ

コンパイラやリンタは、ソースコードの構文エラー、型エラー、その他の問題を発見した際に、その情報を開発者に伝えるためにエラーメッセージを出力します。これらのメッセージは通常、以下の要素を含みます。

  • ファイル名: エラーが発生したソースコードファイルの名前。
  • 行番号: エラーが発生したファイル内の行番号。
  • 列番号 (オプション): エラーが発生した行内の列番号。
  • エラーの種類: 構文エラー、型エラー、未定義の変数など、問題の種類。
  • エラーメッセージ: 問題の詳細な説明。

これらの情報は、開発者が問題の箇所を特定し、修正するために不可欠です。特に、ファイル名と行番号は、IDEやテキストエディタがエラー箇所に直接ジャンプする機能を提供するために利用されます。

標準的なエラーメッセージの書式

多くのUNIX系ツールやプログラミング言語のコンパイラは、エラーメッセージの書式として ファイル名:行番号:メッセージ または ファイル名:行番号:列番号:メッセージ の形式を採用しています。この書式は、grepawk といったコマンドラインツールでの解析や、EmacsやVimなどのエディタにおけるエラーリストのパースに広く利用されています。

例えば、GCC (GNU Compiler Collection) のエラーメッセージは以下のような形式です。

main.c:5: error: expected ‘;’ before ‘return’

このコミットは、Go言語のコンパイラ出力がこのような広く認知された慣習に沿うようにするための調整です。

test/golden.out ファイル

test/golden.out は、Go言語のテストスイートの一部として使用される「ゴールデンファイル」または「リファレンス出力ファイル」です。このようなファイルは、テスト対象のプログラム(この場合はGoコンパイラやツール)の出力が、期待される正確な出力と一致するかどうかを検証するために使用されます。

テスト実行時、コンパイラは特定のテストケースに対して出力を生成し、その出力が test/golden.out に記述されている内容とバイト単位で比較されます。もし出力が一致しない場合、テストは失敗します。

このコミットで test/golden.out が変更されているのは、エラーメッセージの書式変更によってコンパイラの出力が変わったため、その新しい出力を「正しい」ものとしてテストスイートに認識させる必要があるからです。つまり、このファイルへの変更は、コンパイラの動作変更そのものではなく、その動作変更に伴うテストの更新を意味します。

技術的詳細

このコミットの技術的詳細は、主にGoコンパイラ(または関連ツール)がエラーメッセージを生成する際の内部ロジックの変更と、それに伴うテスト出力の更新に集約されます。

エラーメッセージの書式変更

コミットメッセージが示す通り、変更の核心は「行番号の後にコロンを追加する」ことです。これは、コンパイラの診断メッセージ出力ルーチンにおいて、ファイル名と行番号の後に区切り文字としてコロンを挿入するように修正されたことを意味します。

元の書式: filename:linenumber message 変更後の書式: filename:linenumber: message

この変更は、Goコンパイラのソースコード内の、エラーや警告メッセージを出力する関数(例えば、fmt.Printf のような書式付き出力関数を使用している箇所)において、書式文字列が変更されたことを示唆しています。具体的には、%s:%d のような書式指定が %s:%d: のように変更されたと考えられます。

fatal error から warning への変更

test/golden.out の差分を見ると、いくつかの箇所で fatal error:warning: に変更されています。これは、コンパイラが特定の状況を処理する際の厳格さのレベルが調整されたことを意味します。

例えば、nil.go:30: fatal error: naddr: const <T>{<i><int32>INT32;}nil.go:30 fatal error: naddr: const <T>{<i><int32>INT32;} に変更され、さらに test0.go:23: addtyp: renaming Point/...test0.go:23 warning: addtyp: renaming Point/... に変更されています。

これは、コンパイラの開発が進むにつれて、初期段階ではコンパイルを中断させるほどの致命的な問題と見なされていたものが、実際にはコンパイルを継続できる程度の警告レベルの問題であると判断されたことを示しています。このような変更は、コンパイラの堅牢性を高め、開発者がより多くのコードをコンパイルできるようにするために行われます。

test/golden.out の更新

test/golden.out ファイルは、Goコンパイラのテストスイートの一部であり、特定の入力に対するコンパイラの期待される出力を記録しています。このコミットでは、エラーメッセージの書式変更と、一部のエラーが警告に格下げされたことにより、コンパイラの実際の出力が変わったため、このゴールデンファイルを更新する必要がありました。

差分を見ると、変更はすべて test/golden.out 内で行われており、Goコンパイラの実際のソースコード(例えば src/cmd/gcsrc/cmd/6g など)の変更は含まれていません。これは、このコミットがコンパイラ自体のロジック変更ではなく、その出力形式の変更と、それに伴うテストリファレンスの更新であることを明確に示しています。

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

このコミットで直接変更された「コアとなるコード」は、test/golden.out ファイルのみです。

--- a/test/golden.out
+++ b/test/golden.out
@@ -27,11 +27,11 @@ BUG: known to succeed incorrectly
 =========== ./literal.go
 
 =========== ./nil.go
-nil.go:30: fatal error: naddr: const <T>{<i><int32>INT32;}\n+nil.go:30 fatal error: naddr: const <T>{<i><int32>INT32;}\n BUG: known to fail incorrectly
 
 =========== ./sieve.go
-sieve.go:8: fatal error: walktype: switch 1 unknown op SEND l(8)\n+sieve.go:8 fatal error: walktype: switch 1 unknown op SEND l(114)\n BUG: known to fail incorrectly
 
 =========== ./string_lit.go
@@ -42,7 +42,7 @@ BUG: known to fail incorrectly
 BUG: known to succeed incorrectly
 
 =========== ./test0.go
-test0.go:23: addtyp: renaming Point/<Point>{<x><int32>INT32;<y><int32>INT32;} to Point2/<Point2>FORW\n+test0.go:23 warning: addtyp: renaming Point/<Point>{<x><int32>INT32;<y><int32>INT32;} to Point2/<Point2>FORW\n test0.go:48: illegal types for operand
 \t(<float32>FLOAT32) AS (<int32>INT32)
 test0.go:49: illegal types for operand
@@ -121,7 +121,7 @@ BUG: known to succeed incorrectly
 
 =========== bugs/bug003.go
 bugs/bug003.go:6: switch statement must have case labels
-bugs/bug003.go:6: fatal error: walkswitch: not case EMPTY\n+bugs/bug003.go:6 fatal error: walkswitch: not case EMPTY\n 
 BUG: fatal error
 
@@ -139,7 +139,7 @@ bugs/bug006.go:6: expression must be a constant
 bugs/bug006.go:6: expression must be a constant
 bugs/bug006.go:6: expression must be a constant
 bugs/bug006.go:6: expression must be a constant
-bugs/bug006.go:6: fatal error: too many errors\n+bugs/bug006.go:6 fatal error: too many errors\n BUG: known to fail incorrectly
 
 =========== bugs/bug010.go
@@ -149,11 +149,11 @@ bugs/bug010.go:9: error in shape across assignment
 BUG: known to fail incorrectly
 
 =========== bugs/bug014.go
-bugs/bug014.go:6: non-oct character in escape sequence: '\n-bugs/bug014.go:6: non-oct character in escape sequence: '\n-bugs/bug014.go:7: non-oct character in escape sequence: '\n-bugs/bug014.go:8: non-hex character in escape sequence: '\n-bugs/bug014.go:9: non-hex character in escape sequence: '\n+bugs/bug014.go:6 warning: non-oct character in escape sequence: '\n+bugs/bug014.go:6 warning: non-oct character in escape sequence: '\n+bugs/bug014.go:7 warning: non-oct character in escape sequence: '\n+bugs/bug014.go:8 warning: non-hex character in escape sequence: '\n+bugs/bug014.go:9 warning: non-hex character in escape sequence: '\n BUG: errors caught but exit code should be non-zero
 
 =========== bugs/bug015.go
@@ -167,11 +167,11 @@ bugs/bug022.go:8: illegal types for operand
 BUG: known to fail incorrectly
 
 =========== bugs/bug023.go
-bugs/bug023.go:20: fatal error: naddr: const <Type>I{<TypeName>110(<_t138>{},<_o140>{},{});}\n+bugs/bug023.go:20 fatal error: naddr: const <Type>I{<TypeName>110(<_t138>{},<_o140>{},{});}\n BUG: known to fail incorrectly
 
 =========== bugs/bug025.go
-bugs/bug025.go:7: fatal error: dumpexportvar: oname nil: Foo\n+bugs/bug025.go:7 fatal error: dumpexportvar: oname nil: Foo\n 
 BUG: known to fail incorrectly or at least with a bad message
 
@@ -240,7 +240,7 @@ bugs/bug044.go:23: error in shape across assignment
 BUG: compilation should succeed
 
 =========== bugs/bug045.go
-bugs/bug045.go:13: fatal error: naddr: const <T>{<i><int32>INT32;}\n+bugs/bug045.go:13 fatal error: naddr: const <T>{<i><int32>INT32;}\n BUG: known to fail incorrectly
 
 =========== bugs/bug046.go
@@ -252,7 +252,7 @@ BUG: known to fail incorrectly
 =========== fixedbugs/bug005.go
 
 =========== fixedbugs/bug007.go
-fixedbugs/bug007.go:7: addtyp: renaming Point/<Point>{<x><float32>FLOAT32;<y><float32>FLOAT32;} to Polar/<Polar>FORW\n+fixedbugs/bug007.go:7 warning: addtyp: renaming Point/<Point>{<x><float32>FLOAT32;<y><float32>FLOAT32;} to Polar/<Polar>FORW\n 
 =========== fixedbugs/bug008.go
 

コアとなるコードの解説

このコミットは、Goコンパイラやツールの出力形式を変更するものであり、直接的な「コアとなるコード」(例えば、コンパイラのパーサーや型チェッカーのロジック)の変更は含まれていません。変更は、コンパイラが生成するエラーメッセージの「書式」に限定されています。

test/golden.out ファイルの変更は、以下の2つのパターンに分類できます。

  1. 行番号の後にコロンを追加:

    • 例: -nil.go:30: fatal error:+nil.go:30 fatal error: に変更されています。
    • これは、ファイル名と行番号の後に続くスペースがコロンに置き換えられたことを示しています。これにより、ファイル名:行番号: という標準的なエラーメッセージの書式に統一されます。
  2. fatal errorwarning に変更:

    • 例: -test0.go:23: addtyp: renaming Point/...+test0.go:23 warning: addtyp: renaming Point/... に変更されています。
    • これは、特定の診断メッセージの深刻度が「致命的なエラー」から「警告」に格下げされたことを示します。これは、コンパイラの診断ロジックが改善され、以前はコンパイルを中断させていた問題が、コンパイルを継続できる程度の軽微な問題として扱われるようになったことを意味します。

これらの変更は、Go言語の初期開発段階におけるコンパイラの成熟度向上と、開発者体験の改善に向けた継続的な取り組みの一環です。エラーメッセージの書式統一は、Goツールチェインの使いやすさと、既存の開発ツールとの互換性を高める上で重要なステップでした。

関連リンク

参考にした情報源リンク