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

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

このコミットは、Go言語のソースコードベースから、exp (experimental) および old (古い/非推奨) なツリーやパッケージへの言及を削除するものです。具体的には、以下の3つのファイルが変更されています。

  • src/cmd/api/goapi.go: Go APIの生成に関連するツール。
  • src/cmd/dist/build.c: Goのビルドシステムの一部。
  • src/cmd/vet/taglit.go: Goコードの静的解析ツールであるvetの一部。

これらの変更は、Goプロジェクトが進化し、実験的な機能が安定版に取り込まれるか、あるいは非推奨のコードが完全に削除される過程で、コードベースのクリーンアップを行う一環として行われました。

コミット

commit bcb1da7065424913dda7e25d62f33bfc71afd8a2
Author: Rob Pike <r@golang.org>
Date:   Wed Mar 6 16:52:03 2013 -0800

    all: delete a couple of mentions of the exp and old trees
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/7551043

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

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

元コミット内容

all: delete a couple of mentions of the exp and old trees

R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/7551043

変更の背景

このコミットの背景には、Go言語の標準ライブラリやツール群の成熟と整理があります。ソフトウェアプロジェクトにおいて、exp (experimental) ディレクトリやパッケージは、将来的に標準ライブラリに組み込まれる可能性のある実験的な機能や、まだ安定していないAPIを一時的に配置するために使用されます。一方、old ディレクトリやパッケージは、非推奨になったり、より新しい実装に置き換えられたりした古いコードを保持するために使われることがあります。

Goプロジェクトでは、時間の経過とともに実験的な機能が安定し、標準ライブラリの一部として正式にリリースされるか、あるいは開発が中止されて削除されるかのいずれかの道を辿ります。同様に、古いコードは段階的に廃止され、最終的にはコードベースから削除されます。

このコミットは、exp および old ツリー(またはそれらに属するパッケージ)がもはや関連性がなくなったか、あるいはその役割を終えたことを示唆しています。これらのツリーへの言及を削除することで、コードベースのクリーンアップと保守性の向上が図られています。これにより、開発者は最新かつ安定したAPIとツールに集中できるようになります。

前提知識の解説

  • exp (experimental) パッケージ/ツリー: 多くのソフトウェアプロジェクトでは、expexperimental といったプレフィックスを持つディレクトリやパッケージが設けられます。これらは、まだ開発段階にあり、APIが変更される可能性が高い、あるいは将来的に削除される可能性もある実験的なコードを格納するために使用されます。Go言語の初期段階では、一部のパッケージがexp配下に置かれていました。
  • old パッケージ/ツリー: oldlegacy といったプレフィックスを持つディレクトリやパッケージは、非推奨になったり、新しいバージョンに置き換えられたりした古いコードを格納するために使用されます。これは、後方互換性を一時的に維持するためや、古い実装を参照する必要がある場合に利用されますが、最終的には削除されることが一般的です。Go言語でも、過去にはold配下に古いパッケージが存在していました。
  • goapi.go: Go言語のAPIを分析し、ドキュメントやツールが利用できる形式で出力するためのツールです。Goの標準ライブラリやその他のパッケージの公開APIを把握するために使用されます。
  • dist/build.c: Go言語のビルドシステムの一部であり、Goのソースコードからコンパイラやツールチェインを構築する際に使用されるC言語のファイルです。Goのブートストラッププロセスにおいて重要な役割を担います。
  • vet/taglit.go: go vetコマンドの一部であり、Goコード内の潜在的なバグや疑わしい構成を検出するための静的解析ツールです。特に、構造体タグのリテラルに関するチェックを行う部分です。

技術的詳細

このコミットは、Goのソースコード内の特定の箇所から、expおよびoldという文字列への参照を削除することで、これらのツリーがもはやアクティブではないことを反映しています。

  1. src/cmd/api/goapi.go の変更: goapi.goは、Goのパッケージを走査し、そのAPIを抽出する際に、特定のパッケージをスキップするロジックを持っていました。変更前は、cmd/exp/old/で始まるパッケージをスキップしていました。

    -			if strings.HasPrefix(pkg, "cmd/") ||
    -				strings.HasPrefix(pkg, "exp/") ||
    -				strings.HasPrefix(pkg, "old/") {
    +			if strings.HasPrefix(pkg, "cmd/") {
    				continue
    			}
    

    この変更により、exp/old/で始まるパッケージがスキップ対象から外されました。これは、これらのプレフィックスを持つパッケージがもはや特別な扱いを必要としない、つまり、実験的または古いパッケージとして認識されなくなったことを意味します。これにより、goapiツールはこれらのパッケージを通常のパッケージとして扱うようになります。

  2. src/cmd/dist/build.c の変更: build.cには、unreleasedという文字列配列がありました。これは、まだ正式にリリースされていない、あるいは特別な状態にあるパッケージのパスをリストアップしていたと考えられます。変更前は、このリストに"src/pkg/exp"が含まれていました。

    -	"src/pkg/exp",
    

    この行が削除されたことで、src/pkg/expがもはや「未リリース」の実験的なパッケージとして扱われなくなったことを示します。これは、expツリー内のパッケージが安定版としてリリースされたか、あるいは完全に削除されたことを示唆しています。

  3. src/cmd/vet/taglit.go の変更: taglit.goには、untaggedLiteralWhitelistというマップがありました。これは、go vetツールが構造体タグのリテラルに関する特定の警告を抑制するためのホワイトリストです。変更前は、このホワイトリストに"exp/norm.Decomposition"が含まれていました。

    -	"exp/norm.Decomposition":                        true,
    

    このエントリが削除されたことで、exp/norm.Decompositionがもはやvetツールによって特別扱いされる必要がなくなったことを意味します。これは、exp/normパッケージ自体が削除されたか、norm.Decomposition型が別の場所に移動したか、あるいはその型がもはやvetの警告対象となるような特殊なケースではなくなったことを示唆しています。

これらの変更は全体として、Goプロジェクトがexpおよびoldという概念から脱却し、コードベースをよりクリーンで整理された状態に保つための継続的な努力の一環です。

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

src/cmd/api/goapi.go

--- a/src/cmd/api/goapi.go
+++ b/src/cmd/api/goapi.go
@@ -138,9 +138,7 @@ func main() {
 		}
 
 		for _, pkg := range pkgs {
-			if strings.HasPrefix(pkg, "cmd/") ||
-				strings.HasPrefix(pkg, "exp/") ||
-				strings.HasPrefix(pkg, "old/") {
+			if strings.HasPrefix(pkg, "cmd/") {
 				continue
 			}
 			if fi, err := os.Stat(filepath.Join(w.root, pkg)); err != nil || !fi.IsDir() {

src/cmd/dist/build.c

--- a/src/cmd/dist/build.c
+++ b/src/cmd/dist/build.c
@@ -313,7 +313,6 @@ static char *unreleased[] = {
 	"src/cmd/cov",
 	"src/cmd/prof",
 	"src/pkg/old",
-\t"src/pkg/exp",
 };
 
 // setup sets up the tree for the initial build.

src/cmd/vet/taglit.go

--- a/src/cmd/vet/taglit.go
+++ b/src/cmd/vet/taglit.go
@@ -108,7 +108,6 @@ var untaggedLiteralWhitelist = map[string]bool{\n 	"encoding/xml.CharData":                         true,\n 	"encoding/xml.Comment":                          true,\n 	"encoding/xml.Directive":                        true,\n-\t"exp/norm.Decomposition":                        true,\n \t"go/scanner.ErrorList":                          true,\n \t"image/color.Palette":                           true,\n \t"net.HardwareAddr":                              true,\n```

## コアとなるコードの解説

*   **`src/cmd/api/goapi.go`**:
    `strings.HasPrefix(pkg, "exp/") || strings.HasPrefix(pkg, "old/")` の条件が削除されました。これにより、`goapi`ツールがパッケージリストを処理する際に、`exp/`や`old/`で始まるパッケージを特別にスキップする動作がなくなりました。これは、これらのプレフィックスがもはや特別な意味を持たないか、あるいはこれらのパッケージが通常のパッケージとして扱われるようになったことを示しています。

*   **`src/cmd/dist/build.c`**:
    `static char *unreleased[]` 配列から `"src/pkg/exp"` のエントリが削除されました。この配列は、Goのビルドシステムが「未リリース」と見なすパッケージのパスを保持していました。この削除は、`exp`ツリーがもはや未リリースの実験的な状態ではないことを示唆しています。

*   **`src/cmd/vet/taglit.go`**:
    `untaggedLiteralWhitelist` マップから `"exp/norm.Decomposition": true,` のエントリが削除されました。このホワイトリストは、`go vet`ツールが特定の型に対して構造体タグのリテラルに関する警告を抑制するために使用されていました。このエントリの削除は、`exp/norm.Decomposition`型がもはや`vet`の警告を抑制する必要がない、つまり、この型が削除されたか、移動したか、あるいはその使用方法が変更されたことを意味します。

これらの変更は、Goプロジェクトが`exp`および`old`という概念を段階的に廃止し、コードベースをより簡潔で保守しやすい状態に移行していることを明確に示しています。

## 関連リンク

*   Go Gerrit Change-ID: [https://golang.org/cl/7551043](https://golang.org/cl/7551043)

## 参考にした情報源リンク

*   コミットメッセージと差分情報
*   Go言語のプロジェクト構造と開発慣行に関する一般的な知識
*   `exp` および `old` ディレクトリの一般的なソフトウェア開発における意味合い