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

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

このコミットは、Go言語のgo/astパッケージにおけるWalk関数の挙動に関する修正です。具体的には、抽象構文木(AST)を走査する際に、コメントリストを二重に走査しないように変更されています。

コミット

commit 417a7f80d20b38168cb0c48bffbcd3e0c469cf57
Author: Robert Griesemer <gri@golang.org>
Date:   Fri Jun 15 16:55:15 2012 -0700

    go/ast: Walk: do not walk comment list
    
    A comment to that effect was introduced
    with rev d332f4b9cef5 but the respective
    code wasn't deleted.
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/6304086

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

https://github.com/golang/go/commit/417a7f80d20b38168cb0c48bffbcd3e0c469cf57

元コミット内容

このコミットは、go/astパッケージのWalk関数において、コメントリストの走査に関する冗長なコードを削除するものです。コミットメッセージによると、以前のコミットd332f4b9cef5で、コメントリストを走査すべきではないというコメントが追加されたにもかかわらず、対応するコードが削除されていなかったため、そのコードを削除しています。

変更の背景

Go言語のコンパイラやツールは、ソースコードを解析するために抽象構文木(AST: Abstract Syntax Tree)を生成します。ASTは、プログラムの構造を木構造で表現したもので、各ノードはコードの要素(変数宣言、関数呼び出し、コメントなど)に対応します。go/astパッケージは、このASTを操作するための機能を提供します。

Walk関数は、ASTを深さ優先で走査するためのユーティリティ関数です。この関数は、ASTの各ノードを訪問し、指定されたVisitorインターフェースの実装に対して処理を実行させます。

変更の背景にある問題は、Walk関数がAST内のコメントノードを二重に走査していたことです。GoのASTでは、コメントはast.CommentGroupとして表現され、通常は関連するノード(例えば、宣言やステートメント)の一部として扱われます。つまり、コメントは既に個々のノードを走査する過程で訪問されているはずでした。

以前のコミットd332f4b9cef5("go/ast: Walk: do not walk comment list")では、この二重走査の問題を認識し、コメントリストを直接走査すべきではないというコメントがコードに追加されました。しかし、そのコメントに対応する実際のコード削除が行われていなかったため、冗長な走査が継続していました。このコミット417a7f80d20b38168cb0c48bffbcd3e0c469cf57は、その見落としを修正し、不要なコメントリストの走査コードを削除することで、Walk関数の効率性と正確性を向上させています。

前提知識の解説

抽象構文木 (AST: Abstract Syntax Tree)

ASTは、プログラミング言語のソースコードの抽象的な構文構造を木構造で表現したものです。コンパイラやインタプリタは、ソースコードを解析する際にまずASTを構築します。ASTは、コードの論理的な構造を反映しており、コメントや空白文字といった構文上の詳細の一部は省略されます。Go言語では、go/astパッケージがASTの定義と操作を提供します。

go/astパッケージ

go/astパッケージは、Go言語のソースコードの抽象構文木(AST)を表現するための型と関数を提供します。主要な型には、Nodeインターフェース(ASTのすべてのノードが実装)、File(単一のGoソースファイルを表すASTのルートノード)、Decl(宣言)、Expr(式)、Stmt(ステートメント)などがあります。また、CommentGroup型は、ソースコード内のコメントのグループを表します。

ast.Walk関数

ast.Walk関数は、GoのASTを深さ優先で走査するためのヘルパー関数です。この関数は、ast.Visitorインターフェースを実装したオブジェクトと、走査を開始するast.Nodeを受け取ります。Walk関数は、ASTの各ノードを再帰的に訪問し、訪問するノードに対してVisitorVisitメソッドを呼び出します。これにより、開発者はASTの特定のノードに対してカスタムの処理を実行できます。

ast.CommentGroup

ast.CommentGroupは、Goのソースコード内のコメントのグループを表す構造体です。通常、コメントはコードの特定の要素(例: 関数、変数、構造体)に関連付けられます。go/parserパッケージがソースコードを解析してASTを構築する際、コメントもASTの一部として取り込まれます。

技術的詳細

このコミットは、src/pkg/go/ast/walk.goファイル内のWalk関数の実装に焦点を当てています。Walk関数は、ASTノードの型に応じて異なる走査ロジックを持っています。問題となっていたのは、ast.Fileノード(Goソースファイル全体を表すASTのルート)を走査する部分でした。

ast.File構造体には、Commentsというフィールドがあり、これはファイル内のすべてのコメントグループのリストを保持しています。以前の実装では、Walk関数がast.Fileノードを処理する際に、このn.Commentsリストを明示的にループして、各CommentGroupに対して再度Walkを呼び出していました。

しかし、GoのASTの設計では、コメントは通常、それらが関連付けられている他のASTノード(例えば、関数宣言や変数宣言)の一部として既に訪問されるように構築されています。例えば、関数宣言の前に書かれたコメントは、その関数宣言ノードの一部として処理されるべきです。したがって、ast.FileCommentsリストを個別に走査することは、コメントノードの二重走査につながり、非効率的であるだけでなく、Visitorの実装によっては予期せぬ副作用を引き起こす可能性がありました。

このコミットは、この冗長なループを削除することで、Walk関数がコメントリストを直接走査しないように修正しています。これにより、コメントはそれらが関連付けられている主要なASTノードの一部として一度だけ訪問されることが保証されます。

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

変更はsrc/pkg/go/ast/walk.goファイルにあります。

--- a/src/pkg/go/ast/walk.go
+++ b/src/pkg/go/ast/walk.go
@@ -344,9 +344,6 @@ func Walk(v Visitor, node Node) {
 		}
 		Walk(v, n.Name)
 		walkDeclList(v, n.Decls)
-		for _, g := range n.Comments {
-			Walk(v, g)
-		}
 		// don't walk n.Comments - they have been
 		// visited already through the individual
 		// nodes

コアとなるコードの解説

上記の差分は、Walk関数内のast.File型を処理するcase *File:ブロックから、以下の3行のコードを削除していることを示しています。

		for _, g := range n.Comments {
			Walk(v, g)
		}

このループは、ast.Fileノードが持つCommentsフィールド([]*CommentGroup型)を反復処理し、各CommentGroupに対して再度Walk関数を呼び出していました。この削除により、Walk関数はast.Fileのトップレベルのコメントリストを明示的に走査しなくなります。

削除されたコードの下には、変更の意図を説明するコメントが残されています。

		// don't walk n.Comments - they have been
		// visited already through the individual
		// nodes

このコメントは、コメントが既に個々のノード(例えば、宣言やステートメント)を走査する過程で訪問されているため、n.Commentsを走査する必要がないことを明確に述べています。この修正により、Walk関数はより効率的になり、ASTの走査が意図した通りに一度だけ行われるようになります。

関連リンク

参考にした情報源リンク