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

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

このコミットは、Go言語の初期開発段階において、もはや不要となった3つのGoソースファイルを削除するものです。具体的には、usr/gri/pretty/globals.gousr/gri/pretty/object.gousr/gri/pretty/type.goが削除されました。これらのファイルは、Go言語の型システムやオブジェクト表現、スコープ管理に関連する初期の設計を反映していると考えられます。

コミット

commit 0a0ee89f8bf0c6a07a7793be23645e353de96144
Author: Robert Griesemer <gri@golang.org>
Date:   Fri Jan 9 16:30:00 2009 -0800

    - remove obsolete files (missed before)
    
    R=r
    OCL=22475
    CL=22475

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

https://github.com/golang/go/commit/0a0ee89f8bf0c6a07a7793be23645e353de96144

元コミット内容

- remove obsolete files (missed before)

変更の背景

このコミットは、Go言語の非常に初期の段階(2009年1月)に行われたものです。Go言語は、その設計と実装の過程で多くの試行錯誤を繰り返していました。特に、型システム、オブジェクトモデル、コンパイラの内部構造などは、開発初期に頻繁に変更されていました。

コミットメッセージにある「obsolete files (missed before)」という記述から、これらのファイルが以前の設計や実験的な実装の一部であり、すでにGoのメインライン開発から外れた、あるいはより新しい、洗練された実装に置き換えられたにもかかわらず、ファイルシステム上に残っていた「見落とされていた」不要なファイルであったことが示唆されます。

usr/gri/prettyというパスは、Go言語の主要な設計者の一人であるRobert Griesemer氏(griは彼のイニシャル)が担当していた、あるいは実験的に開発していたコードベースの一部であった可能性が高いです。prettyというディレクトリ名から、コードの整形(pretty-printing)や、コンパイラが生成する抽象構文木(AST)や型情報を人間が読みやすい形式で表示するためのツールに関連していたことが推測されます。

Go言語の初期のコンパイラは、6g(Goコンパイラ)、6l(Goリンカ)、6a(Goアセンブラ)など、Plan 9のツールチェインに由来する名称を持っていました。これらのツールは、Go言語のセマンティクスを定義し、コードを機械語に変換する役割を担っていました。このコミットで削除されたファイルは、おそらくこれらのツールチェインの一部、特に型チェックやシンボル解決に関連する部分の初期実装、あるいはそのデバッグ・可視化のための補助コードであったと考えられます。

前提知識の解説

  • Go言語の初期開発: Go言語は2007年にGoogleで開発が始まり、2009年11月にオープンソースとして公開されました。このコミットは公開前の非常に初期の段階に属します。当時のGoは、現在のGoとは異なる構文やセマンティクスを持つ部分も多く、活発な変更が行われていました。
  • コンパイラのフロントエンド: コンパイラは通常、ソースコードを解析し、抽象構文木(AST)を構築し、型チェックやセマンティック解析を行います。この段階で、プログラム内の変数、関数、型などの「オブジェクト」を管理し、それぞれの「型」を定義・解決する必要があります。
  • 型システム: プログラミング言語における型システムは、データの種類を定義し、それらのデータがどのように操作できるかを規定するものです。Go言語の型システムは、静的型付けであり、インターフェースや構造体、ポインタなど、独自の概念を持っています。
  • シンボルテーブル/スコープ: コンパイラは、プログラム内で宣言された識別子(変数名、関数名など)とその属性(型、スコープなど)を管理するためにシンボルテーブルを使用します。スコープは、識別子が有効なプログラムの領域を定義します。
  • usr/griディレクトリ: Go言語の初期のソースコードリポジトリでは、開発者個人の作業ディレクトリがusr/<developer_initials>のような形で存在することがありました。usr/griはRobert Griesemer氏の作業領域を示唆しています。
  • prettyディレクトリ: 一般的に、プログラミングツールにおいて「pretty」という言葉は、コードの整形(pretty-printing)や、内部データ構造(ASTなど)を人間が読みやすい形式で表示する機能に関連して使われます。

技術的詳細

削除された3つのファイルは、Go言語のコンパイラまたは関連ツールにおける、オブジェクト、型、およびグローバルな定義の管理に関する初期の試みを示しています。

  1. usr/gri/pretty/globals.go:

    • このファイルはpackage Globalsとして定義されており、ObjectTypePackageScopeEnvironmentOldCompilationといった主要なデータ構造の定義を含んでいました。
    • Object構造体は、定数、変数、型などの言語オブジェクトを表現し、ID、ソース位置、種類(kind)、識別子(ident)、型(typ)、パッケージ番号/ネストレベル(pnolev)などのフィールドを持っていました。
    • Type構造体は、Goの型を表現し、ID、参照、形式(form)、サイズ、長さ、補助情報(aux)、関連するオブジェクト、キー型、要素型、スコープなどのフィールドを持っていました。
    • Package構造体は、パッケージのファイル名、キー、オブジェクト、スコープを管理していました。
    • Scope構造体は、親スコープと、識別子からオブジェクトへのマップ(entries map[string] *Object)を持っており、シンボルテーブルの役割を担っていました。
    • OldCompilation構造体は、コンパイル環境、ソースファイル情報、エラー処理、パッケージリストなどを保持していました。
    • NewObjectNewTypeNewPackageNewScopeといったファクトリ関数も定義されており、これらのデータ構造のインスタンス生成を担っていました。
    • ObjectScopeのメソッド(CopyLookupAddInsertなど)も含まれており、オブジェクトの操作やスコープ内でのシンボル検索・追加のロジックが実装されていました。
    • 特に注目すべきは、Type構造体内でObjectScopeを参照し、Object構造体内でTypeを参照するなど、相互参照が多用されていた点です。コメントには「they refer to each other and we don't know how to handle forward declared pointers across packages yet.」とあり、当時のGoコンパイラ(6g)がパッケージ間の循環参照をうまく扱えなかったため、これらの定義をglobals.goという単一のファイルにまとめる必要があったことが示されています。これは、Go言語のパッケージシステムとコンパイラの成熟度を示す興味深いスナップショットです。
  2. usr/gri/pretty/object.go:

    • このファイルはpackage Objectとして定義されており、BADNONECONSTTYPEVARFIELDFUNCBUILTINPACKAGELABELENDといったオブジェクトの種類(kind)を表す定数を定義していました。
    • KindStr関数は、これらの整数値を対応する文字列に変換するユーティリティでした。
    • ここでもObject構造体自体の定義はglobals.goにあることがコメントで言及されており、「The 'Object' declaration should be here as well, but 6g cannot handle this due to cross-package circular references. For now it's all in globals.go.」と、globals.goと同様の理由が述べられています。
  3. usr/gri/pretty/type.go:

    • このファイルはpackage Typeとして定義されており、UNDEFVOIDBADFORWARDTUPLENILBOOLUINTINTFLOATSTRINGINTEGERANYALIASARRAYSTRUCTINTERFACEMAPCHANNELFUNCTIONMETHODPOINTERといった型の形式(form)を表す定数を定義していました。
    • Type.auxフィールドに関連するSENDRECVというチャネルの方向を示す定数も定義されていました。
    • FormStr関数は、型の形式を文字列に変換するユーティリティでした。
    • Equal関数は、2つの型が等しいかどうかを比較するロジックを含んでいました。この関数は、型の形式に基づいて再帰的に比較を行っていました。特に、FUNCTIONSTRUCTの比較ロジックはコメントアウトされており、当時の実装がまだ不完全であったことを示唆しています。
    • Assigneable関数も定義されていましたが、こちらはUNIMPLEMENTEDとされており、型のアサイン可能性のチェックがまだ実装されていなかったことがわかります。
    • ここでもType構造体自体の定義はglobals.goにあることがコメントで言及されており、object.goと同様の理由が述べられています。

これらのファイルは、Go言語の初期の型システムとシンボル解決の設計が、現在のGo言語のそれとは異なるアプローチを取っていたことを示しています。特に、globals.goに多くの主要なデータ構造を集中させていた点は、当時のコンパイラの制約や設計思想を反映しています。これらのファイルが削除されたということは、より洗練された、あるいは異なる設計が採用され、これらの初期実装が不要になったことを意味します。

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

このコミットは、既存のコードの変更ではなく、ファイルの削除のみを行っています。

削除されたファイルは以下の通りです。

  • usr/gri/pretty/globals.go
  • usr/gri/pretty/object.go
  • usr/gri/pretty/type.go

これらのファイルは、Go言語の初期の型システム、オブジェクト表現、スコープ管理に関する定義とロジックを含んでいました。

コアとなるコードの解説

このコミットはコードの削除のみであるため、特定の「変更箇所」の解説は適用されません。しかし、削除されたファイルの内容を分析することで、Go言語の初期の設計思想と、それがどのように進化していったかを理解することができます。

削除されたファイル群は、Go言語のコンパイラがプログラムのセマンティック解析を行う上で必要となる、型、オブジェクト、スコープといった概念をどのように表現し、操作していたかを示しています。

  • globals.goは、Go言語のコンパイラが内部的に使用する主要なデータ構造(Object, Type, Scope, Package, OldCompilation)を一元的に定義していました。これは、当時のGoコンパイラがパッケージ間の循環参照を適切に扱えなかったための一時的な措置であったことがコメントから読み取れます。
  • object.goは、Go言語の識別子(変数、関数、型など)の種類を定義する定数と、それらを文字列に変換するユーティリティを提供していました。
  • type.goは、Go言語の型の種類を定義する定数と、型の等価性をチェックするロジックを含んでいました。特に、Equal関数は、Goの型システムにおける型の比較セマンティクスを実装しようとしていたことがわかります。

これらのファイルが削除されたことは、Go言語のコンパイラと型システムが、よりモジュール化され、洗練された設計へと移行したことを強く示唆しています。おそらく、パッケージ間の循環参照の問題が解決され、各概念(オブジェクト、型など)がそれぞれの責務に応じたパッケージに分割されたか、あるいは全く異なるアプローチが採用されたと考えられます。

関連リンク

参考にした情報源リンク

  • Go言語のソースコードリポジトリ: https://github.com/golang/go
  • Go言語の歴史に関するドキュメントや記事(一般的な情報源)
  • Go言語のコンパイラ設計に関する一般的な知識