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

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

このコミットは、Go言語の標準ライブラリにおけるgo/typesパッケージの移動に関するものです。具体的には、実験的なパッケージが置かれるexpディレクトリから、より安定した標準パッケージが置かれるgoディレクトリへと移動されました。この変更は、go/typesパッケージがGo 1.1リリースに向けて成熟し、Go言語の型システムを扱うための公式なAPIとして位置づけられる過程の一部を示しています。

コミット

commit 73aaa44c24308e5a75f95a5462e96b6ff557bc20
Author: Robert Griesemer <gri@golang.org>
Date:   Fri Dec 28 11:41:44 2012 -0800

    go/types: moved from exp/types
    
    This is a just a file move with no other changes
    besides the manual import path adjustments in these
    two files:
    
    src/pkg/exp/gotype/gotype.go
    src/pkg/exp/gotype/gotype_test.go
    
    Note: The go/types API continues to be subject to
    possibly significant changes until Go 1.1. Do not
    rely on it being stable at this point.
    
    R=adonovan
    CC=golang-dev
    https://golang.org/cl/7013049

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

https://github.com/golang/go/commit/73aaa44c24308e5a75f95a5462e96b6ff557bc20

元コミット内容

このコミットの元々の内容は、go/typesパッケージをexp/typesから移動することです。コミットメッセージには「This is a just a file move with no other changes besides the manual import path adjustments in these two files: src/pkg/exp/gotype/gotype.go src/pkg/exp/gotype/gotype_test.go」と明記されており、ファイル移動とそれに伴うインポートパスの修正のみが行われたことが示されています。また、Go 1.1がリリースされるまではAPIが不安定である可能性についても言及されています。

変更の背景

Go言語の標準ライブラリには、新しい機能やAPIを導入する際に、まず実験的なパッケージを置くためのexp(experimental)ディレクトリが存在します。これは、新しい機能がコミュニティからのフィードバックを受け、設計が安定するまで、標準ライブラリの安定性を損なわないようにするための仕組みです。

go/typesパッケージは、Goプログラムの型情報を扱うための重要なパッケージであり、コンパイラ、リンター、IDEなどのツールがGoコードを静的に解析するために利用されます。このパッケージは元々exp/typesとして開発が進められていましたが、Go 1.1のリリースに向けてその機能が成熟し、Go言語の公式な型システムAPIとして位置づけられる段階に入ったため、expディレクトリから標準のgoディレクトリへと移動されることになりました。

この移動は、go/typesパッケージがGoエコシステムにおいて中心的な役割を果たすようになることを意味し、将来的にGoのツールチェインの基盤となることを示唆しています。

前提知識の解説

Go言語のパッケージ管理とディレクトリ構造

Go言語のソースコードは、通常、srcディレクトリ以下に配置されます。標準ライブラリはsrc/pkg以下にあり、その中に各パッケージが格納されています。

  • src/pkg/go: Go言語の標準ライブラリの主要なパッケージが置かれる場所です。ここに移動されるということは、そのパッケージがGoの公式なAPIとして安定し、広く利用されることが期待されることを意味します。
  • src/pkg/exp: 実験的なパッケージや、まだ設計が固まっていない開発中のパッケージが一時的に置かれる場所です。ここに置かれたパッケージは、将来的に変更される可能性が高く、安定性が保証されません。

go/typesパッケージの役割

go/typesパッケージは、Goプログラムの型システムをモデル化し、型チェックを行うためのAPIを提供します。具体的には、以下のような機能を提供します。

  • 型情報の表現: プリミティブ型、構造体、インターフェース、関数型など、Go言語のあらゆる型をプログラム的に表現します。
  • 型チェック: Goのソースコードを解析し、型エラーがないか、型の一貫性が保たれているかを検証します。これは、コンパイラがコードをコンパイルする前に行う静的解析の一部です。
  • スコープと名前解決: 変数、関数、型などの識別子がどの宣言に対応するかを解決し、スコープ規則に従って名前解決を行います。
  • 抽象構文木 (AST) との連携: go/astパッケージで生成されたASTを基に、型情報を構築し、型チェックを行います。

このパッケージは、Goのコンパイラ自体だけでなく、Goのコードを解析する様々なツール(例: go vet、リンター、IDEのコード補完機能など)の基盤として利用されます。

技術的詳細

このコミットの技術的な詳細は、主にファイルシステムの操作と、それに伴うGoのインポートパスの修正に集約されます。

  1. ファイル移動: src/pkg/exp/typesディレクトリとその内容が、src/pkg/go/typesへと移動されました。これは、Gitのrename操作として記録されており、ファイルの内容自体は変更されていません(similarity index 100%)。この操作により、パッケージの論理的な場所が変更され、Goのビルドシステムが新しいパスでパッケージを見つけるようになります。

  2. インポートパスの修正: パッケージの移動に伴い、このパッケージをインポートしていた既存のコードのインポートパスを更新する必要があります。コミットメッセージに明記されているように、src/pkg/exp/gotype/gotype.gosrc/pkg/exp/gotype/gotype_test.goの2つのファイルで、"exp/types"から"go/types"へのインポートパスの変更が行われました。これは、Goのモジュールシステム(当時はまだGo Modulesは存在せず、GOPATHベースのパッケージ解決が行われていた)において、パッケージの識別子がそのファイルシステム上のパスに強く依存しているためです。

    • src/pkg/exp/gotype/gotype.goでは、import "exp/types"import "go/types"に変更されています。
    • src/pkg/exp/gotype/gotype_test.goでも同様に、テストコード内で使用されていた"exp/types"のインポートが削除され、代わりに"go/types"が追加されています。

この変更は、Goのツールチェインの内部構造を整理し、go/typesパッケージをGo 1.1の公式APIとして位置づけるための重要なステップでした。

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

このコミットにおけるコアとなるコードの変更箇所は、以下の2つのファイルにおけるインポートパスの修正です。

  1. src/pkg/exp/gotype/gotype.go

    --- a/src/pkg/exp/gotype/gotype.go
    +++ b/src/pkg/exp/gotype/gotype.go
    @@ -6,13 +6,13 @@ package main
     
     import (
      "errors"
    - "exp/types"
      "flag"
      "fmt"
      "go/ast"
      "go/parser"
      "go/scanner"
      "go/token"
    + "go/types"
      "io/ioutil"
      "os"
      "path/filepath"
    
    • exp/typesのインポートが削除され、go/typesのインポートが追加されています。
  2. src/pkg/exp/gotype/gotype_test.go

    --- a/src/pkg/exp/gotype/gotype_test.go
    +++ b/src/pkg/exp/gotype/gotype_test.go
    @@ -117,7 +117,6 @@ var tests = []string{\n      "flag",\n      "fmt",\n     \n    - "exp/types",\n      "exp/gotype",\n     \n      "go/ast",\n    @@ -128,6 +127,7 @@ var tests = []string{\n      "go/printer",\n      "go/scanner",\n      // "go/token",\n    + "go/types",\n     \n      "hash/adler32",\n      "hash/crc32",
    
    • テストコード内のexp/typesの参照が削除され、go/typesが追加されています。

これら以外のファイルは、src/pkg/exp/typesからsrc/pkg/go/typesへのディレクトリ移動(ファイル名変更)のみであり、ファイルの内容自体には変更がありません。

コアとなるコードの解説

上記のコード変更は、Go言語のパッケージインポートメカニズムの直接的な結果です。Goでは、パッケージのインポートパスがそのパッケージのファイルシステム上の位置と密接に関連しています。

  • gotype.gogotype_test.goは、go/typesパッケージ(移動前はexp/types)の機能を利用するクライアントコードです。
  • exp/typesからgo/typesへのパッケージの移動は、そのパッケージの「名前」が変更されたことを意味します。したがって、そのパッケージを使用するすべてのコードは、新しい名前(パス)を反映するようにインポートステートメントを更新する必要があります。
  • この変更は、Goのビルドツールが正しいパッケージを見つけられるようにするために不可欠です。もしインポートパスが更新されなければ、コンパイル時に「package exp/types is not in GOROOT」のようなエラーが発生するか、あるいは古いパスにパッケージが存在しないためにビルドが失敗するでしょう。

このコミットは、go/typesパッケージがGoの標準ライブラリの一部として正式に採用される過程における、技術的な「引っ越し」作業を反映しています。

関連リンク

  • Go言語の公式ドキュメント: https://go.dev/
  • Go言語のパッケージとモジュールに関するドキュメント: https://go.dev/doc/modules/ (Go Modulesは後から導入された概念ですが、パッケージの概念理解に役立ちます)
  • Go 1.1 Release Notes: go/typesパッケージがGo 1.1で標準ライブラリに組み込まれたことに関する情報が含まれている可能性があります。

参考にした情報源リンク

  • Goのソースコードリポジトリ: https://github.com/golang/go
  • Gerrit Code Review (golang.org/cl/7013049): コミットメッセージに記載されているGerritの変更リストへのリンク。これは、このコミットがGoプロジェクト内でどのようにレビューされ、承認されたかを示す公式な記録です。
  • Go言語のexpディレクトリに関する情報: Goの公式ドキュメントやブログ記事で、expディレクトリの目的と、パッケージがexpから標準ライブラリに移動するプロセスについて説明されている場合があります。
    • (一般的な情報源であり、特定のURLはコミットメッセージには含まれていませんが、Goの歴史を理解する上で重要です。)
  • go/typesパッケージのドキュメント: Goの公式ドキュメントサイトで、go/typesパッケージの現在のAPIと使用方法に関する詳細情報が提供されています。
  • Go 1.1のリリースノート: go/typesパッケージがGo 1.1で標準ライブラリに組み込まれたことに関する公式な発表や詳細が記載されている可能性があります。
  • Go言語の歴史に関する記事: go/typesパッケージの進化や、Goのツールチェインの発展に関する歴史的な記事やブログ投稿。
    • (特定のURLは提供されていませんが、Goの歴史を深く理解する上で役立ちます。)
  • Robert GriesemerのGoに関する貢献: コミットの作者であるRobert GriesemerはGo言語の共同設計者の一人であり、彼の他の貢献や関連する議論も参考になります。
    • (特定のURLは提供されていませんが、Goの設計思想を理解する上で役立ちます。)
  • Alan DonovanのGoに関する貢献: レビュー担当者であるAlan DonovanもGo言語の重要な貢献者であり、彼の他の貢献や関連する議論も参考になります。
    • (特定のURLは提供されていませんが、Goの設計思想を理解する上で役立ちます。)
  • golang-devメーリングリスト: コミットメッセージにCCされているgolang-devは、Go言語の開発者向けメーリングリストであり、このコミットに関する議論が交わされた可能性があります。