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

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

このコミットは、Go言語の初期のコード整形ツールであるprettyのsmoketestの対象ファイルを変更するものです。具体的には、smoketestの対象をparser.goからastprinter.goへと切り替えています。これは、astprinter.goが当該ディレクトリ内で「最も大きな残りのソースファイル」であるという理由に基づいています。

コミット

このコミットは、Go言語のusr/gri/prettyディレクトリ内のMakefileを修正し、smoketestの実行対象ファイルを変更しています。これにより、prettyツールの基本的な機能テストが、より複雑なコードファイルに対して行われるようになります。

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

https://github.com/golang/go/commit/a9c1a3b6206f47d031ef6d64f0281ec54c89ed18

元コミット内容

commit a9c1a3b6206f47d031ef6d64f0281ec54c89ed18
Author: Russ Cox <rsc@golang.org>
Date:   Wed Apr 1 03:32:44 2009 -0700

    change smoketest from parser.go to astprinter.go,
    the largest remaining source file in this directory.
    
    TBR=gri
    OCL=26984
    CL=26984
---
 usr/gri/pretty/Makefile | 2 +-| 1 file changed, 1 insertion(+), 1 deletion(-)| 
diff --git a/usr/gri/pretty/Makefile b/usr/gri/pretty/Makefile
index fae4d97d07..ed28664732 100644
--- a/usr/gri/pretty/Makefile
+++ b/usr/gri/pretty/Makefile
@@ -20,7 +20,7 @@ test: pretty
  ./test.sh
 
 smoketest: pretty
- ./test.sh parser.go
+ ./test.sh astprinter.go
 
 install: pretty
  cp pretty $(HOME)/bin/pretty

変更の背景

この変更の背景には、prettyというGo言語のコード整形ツール(現在のgo fmtの前身または関連プロジェクトと考えられる)の品質保証プロセスにおけるsmoketestの効率化と網羅性の向上が挙げられます。

  • Smoketestの目的: Smoketestは、ソフトウェアの主要な機能が正しく動作するかを迅速に確認するための基本的なテストです。ビルドが成功し、基本的な実行が可能であることを確認する目的で実施されます。
  • 対象ファイルの選定: 以前はparser.goがsmoketestの対象でした。parser.goはGoソースコードを解析し、抽象構文木(AST)を構築する役割を担うファイルの可能性が高いです。しかし、prettyツールの最終的な目的は、コードを整形して出力することにあります。
  • astprinter.goの重要性: コミットメッセージにある「the largest remaining source file in this directory」という記述から、astprinter.goprettyツールの中核的なロジック、特にASTをGoソースコードとして整形し直して出力する部分を担っていると推測されます。このファイルは、複雑なAST構造を適切に処理し、整形されたコードを生成する機能を含んでいるため、その健全性を確認することはprettyツールの品質にとって非常に重要です。
  • テストの網羅性向上: parser.goのテストだけでは、パース機能の健全性は確認できても、整形後の出力機能の健全性は十分に確認できませんでした。astprinter.goをsmoketestの対象とすることで、prettyツールの「入力(パース)から出力(整形)まで」の一連のフロー、特に整形出力の複雑なロジックが正しく機能するかを、より網羅的にテストできるようになります。

この変更は、prettyツールの主要な機能が、より実用的な、かつ複雑な入力に対しても正しく動作することを保証するための、初期開発段階におけるテスト戦略の改善と見ることができます。

前提知識の解説

このコミットを理解するためには、以下の概念について知っておく必要があります。

  • Go言語 (初期): このコミットは2009年に行われており、Go言語がまだ公開されて間もない、非常に初期の段階にあります。Goは、Googleによって開発された静的型付けのコンパイル型言語で、並行処理に優れ、シンプルさを重視しています。当時のGoのツールチェインや標準ライブラリは現在とは異なる部分も多く、usr/gri/prettyのようなパスは、初期の実験的なツールや開発者の個人作業領域を示唆しています。
  • Smoketest (スモークテスト): ソフトウェアテストの一種で、ビルドが成功した後に、システムの最も重要な機能が正しく動作するかどうかを検証するために行われる、迅速かつ基本的なテストです。システムが「煙を吐かずに」起動し、基本的な機能が動作することを確認する目的があります。もしsmoketestが失敗した場合、それ以上の詳細なテストは無意味であると判断されることが多いです。
  • Makefile: makeユーティリティが使用する設定ファイルです。ソフトウェアのビルドプロセスを自動化するために広く使われます。依存関係に基づいてコマンドを実行し、ソースコードのコンパイル、テストの実行、インストールの手順などを定義します。このコミットでは、Makefilesmoketestターゲットが変更されています。
  • 抽象構文木 (Abstract Syntax Tree, AST): ソースコードの構造を木構造で表現したものです。コンパイラやインタープリタ、コード解析ツール(リンター、フォーマッターなど)は、ソースコードを直接操作するのではなく、まずASTに変換してから処理を行います。ASTは、プログラムの構文構造を抽象化し、意味的な解析や変換を容易にします。
  • Go言語におけるparserprinterの概念:
    • parser: Go言語のソースコードを読み込み、その構文を解析してASTを構築するコンポーネントです。Goの標準ライブラリにはgo/parserパッケージがあり、この機能を提供します。parser.goというファイル名から、このファイルがパース処理に関連するコードを含んでいたと推測されます。
    • printer: ASTを読み込み、それをGo言語のソースコードとして出力するコンポーネントです。この際、コードの整形(インデント、改行、空白の調整など)を行うことが一般的です。Goの標準ライブラリにはgo/printerパッケージがあり、この機能を提供します。astprinter.goというファイル名から、このファイルがASTを整形して出力する処理に関連するコードを含んでいたと推測されます。
  • prettyツール: このコミットが存在するusr/gri/prettyというパスから、このツールがGo言語のコードを「きれいに(pretty)」整形する目的を持っていたことが伺えます。これは、現在のgo fmtコマンドの原型、あるいはその開発過程における実験的なツールであった可能性が高いです。コード整形ツールは、通常、ソースコードをパースしてASTを構築し、そのASTを整形ルールに基づいて再構築し、最終的に整形されたソースコードとして出力するという一連の処理を行います。

技術的詳細

このコミットの技術的な詳細を掘り下げると、prettyツールの機能とテスト戦略の進化が見えてきます。

prettyツールは、Go言語のソースコードを整形することを目的としています。この種のツールは、以下の主要なステップで動作します。

  1. パース (Parsing): 入力されたGoソースコードを読み込み、その構文を解析して抽象構文木(AST)を構築します。このステップは、parserコンポーネント(おそらくparser.goが関連)によって行われます。
  2. 整形 (Formatting): 構築されたASTを、定義された整形ルール(インデント、改行、空白、括弧の位置など)に基づいて走査し、必要に応じてASTの構造を調整します。
  3. 出力 (Printing): 整形されたASTを、最終的なGoソースコードとして出力します。このステップは、printerコンポーネント(おそらくastprinter.goが関連)によって行われます。

コミットの変更は、smoketestの対象をparser.goからastprinter.goに変更しています。

  • parser.goを対象としたsmoketest: parser.goをsmoketestの対象とする場合、それは主にprettyツールがGoソースコードを正しくパースし、有効なASTを生成できるかどうかの基本的な健全性を確認するものです。これはツールの最初のステップの検証としては重要ですが、整形機能全体を網羅するものではありません。
  • astprinter.goを対象としたsmoketest: astprinter.goは、ASTを整形してGoソースコードとして出力する部分を担うため、このファイルをsmoketestの対象とすることは、prettyツールの「整形」と「出力」という、より本質的な機能の健全性を確認することに繋がります。コミットメッセージにある「the largest remaining source file in this directory」という記述は、astprinter.goが単体で複雑なロジックを含んでおり、その処理能力をテストするのに適していることを示唆しています。つまり、このファイル自体が、複雑なAST構造を処理し、整形されたコードを生成する能力を試すのに十分な複雑さを持っていると考えられます。

この変更は、単にテスト対象のファイルを切り替えるだけでなく、prettyツールのsmoketestが、その主要な機能である「コード整形と出力」の側面をより効果的にカバーするように進化していることを示しています。これにより、ツールのビルドが成功し、かつ最も重要な出力機能が基本的なレベルで動作することを確認できるようになります。

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

変更はusr/gri/pretty/Makefileファイルにあります。

diff --git a/usr/gri/pretty/Makefile b/usr/gri/pretty/Makefile
index fae4d97d07..ed28664732 100644
--- a/usr/gri/pretty/Makefile
+++ b/usr/gri/pretty/Makefile
@@ -20,7 +20,7 @@ test: pretty
  ./test.sh
 
 smoketest: pretty
- ./test.sh parser.go
+ ./test.sh astprinter.go
 
 install: pretty
  cp pretty $(HOME)/bin/pretty

具体的には、smoketestターゲット内の./test.shコマンドの引数がparser.goからastprinter.goに変更されています。

コアとなるコードの解説

この変更は、Makefile内のsmoketestというターゲット(目標)の定義を修正しています。

  • smoketest: pretty: この行は、smoketestターゲットを実行する前に、まずprettyターゲット(おそらくpretty実行可能ファイルをビルドするターゲット)が実行されるべきであることを示しています。
  • - ./test.sh parser.go: 変更前の行です。これは、smoketestが実行される際に、./test.shというシェルスクリプトがparser.goというファイルを引数として実行されることを意味します。このtest.shスクリプトは、おそらくprettyツールを使ってparser.goを処理し、その結果を検証する役割を担っていました。
  • + ./test.sh astprinter.go: 変更後の行です。これにより、smoketest./test.shスクリプトをastprinter.goというファイルを引数として実行するようになります。

この変更の直接的な効果は、prettyツールのsmoketestが、parser.goというファイルではなく、astprinter.goというファイルを対象として実行されるようになることです。これにより、smoketestは、prettyツールがastprinter.goのようなより複雑な、かつ出力機能に密接に関連するファイルを正しく処理できるかどうかを確認するようになります。これは、ツールの基本的な健全性を確認する上で、より実用的なテストケースを提供することになります。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント (go.dev)
  • ソフトウェアテストに関する一般的な知識 (Smoketestなど)
  • Makefileの基本的な構文と使用法
  • 抽象構文木 (AST) に関する一般的なコンピュータサイエンスの知識
  • コミットメッセージの内容と、Go言語の初期開発に関する一般的な理解
  • GitHubのコミットページ: https://github.com/golang/go/commit/a9c1a3b6206f47d031ef6d64f0281ec54c89ed18