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

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

このコミットは、Go言語の初期開発段階におけるビルドシステムの一部修正に関するものです。具体的には、usr/gri/pretty/Makefileというビルド設定ファイルにおいて、特定のモジュール(compilation.6parser.6)の依存関係からbuilder.6が削除されています。これにより、ビルドプロセスが修正され、正常に動作するようになったことを示しています。

コミット

commit 0793c88371e323d6e2b4b906b19c6b61f91413f7
Author: Russ Cox <rsc@golang.org>
Date:   Wed Mar 4 17:37:47 2009 -0800

    fix build
    
    TBR=gri
    OCL=25719
    CL=25719

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

https://github.com/golang/go/commit/0793c88371e323d6e2b4b906b19c6b61f91413f7

元コミット内容

diff --git a/usr/gri/pretty/Makefile b/usr/gri/pretty/Makefile
index 7a0f5b37b8..f53226617f 100644
--- a/usr/gri/pretty/Makefile
+++ b/usr/gri/pretty/Makefile
@@ -32,7 +32,7 @@ gds.6:	 utils.6 platform.6 compilation.6 printer.6
 
 pretty.6:	 platform.6 printer.6 compilation.6
 
-compilation.6:	 builder.6 platform.6 parser.6 ast.6 typechecker.6
+compilation.6:	 platform.6 parser.6 ast.6 typechecker.6
 
 typechecker.6:	 ast.6
 
@@ -40,7 +40,7 @@ ast.6:	 symboltable.6
 
 symboltable.6:	
 
-parser.6:	ast.6 builder.6 symboltable.6
+parser.6:	ast.6 symboltable.6
 
 platform.6:	 utils.6
 

変更の背景

このコミットは、Go言語の非常に初期の段階、具体的には2009年3月に行われたものです。当時のGo言語のビルドシステムは現在とは大きく異なり、Makefileが主要なビルドツールとして使用されていました。コミットメッセージの「fix build」が示す通り、当時のビルドプロセスにおいて何らかの問題が発生しており、それがbuilder.6というモジュールの依存関係が不適切であったことに起因していたと考えられます。

Go言語の初期のコンパイラは、C言語で書かれたgc(Go Compiler)というツールチェーンを使用していました。このgcは、Goのソースコードを中間表現に変換し、最終的に実行可能なバイナリを生成する役割を担っていました。Makefileは、これらのコンパイルステップや依存関係を管理するために用いられていました。

builder.6compilation.6parser.6のビルドを妨げていた、あるいは不要な依存関係として存在していたため、ビルドが失敗するか、非効率になっていた可能性があります。この修正は、ビルドの健全性を回復し、開発プロセスを円滑に進めるための重要なステップでした。

前提知識の解説

このコミットを理解するためには、以下の前提知識が必要です。

  • Makefileとmake: Makefileは、makeユーティリティがプロジェクトのビルドプロセスを自動化するために使用するファイルです。Makefileには、ターゲット(生成されるファイルや実行されるアクション)と、そのターゲットを生成するために必要な依存関係、そして実行されるコマンドが記述されます。
    • ターゲット: 依存関係
    • \tコマンド このコミットでは、compilation.6parser.6がターゲットであり、その後に続くファイルが依存関係です。
  • Go言語の初期のビルドシステム: Go言語の初期は、現在のGoモジュールシステムやgo buildコマンドのような洗練されたツールは存在しませんでした。代わりに、C言語で書かれたコンパイラ(gc)やアセンブラ(as)、リンカ(ld)などのツールチェーンをMakefileで連携させてビルドを行っていました。
  • .6ファイル拡張子: Go言語の初期のビルドシステムでは、.6という拡張子が頻繁に登場しました。これは、当時のGoコンパイラが生成する中間ファイルや、特定のアーキテクチャ(例えば、Plan 9の68000系プロセッサを意識した命名)向けのオブジェクトファイル、あるいはGoのソースコードをコンパイルした結果生成されるバイナリファイルを示すために使われていました。これは、Go言語がPlan 9オペレーティングシステムの設計思想から大きな影響を受けていたことの名残でもあります。
    • compilation.6: コンパイル処理に関連するモジュール、またはそのコンパイル済みバイナリ。
    • parser.6: ソースコードの構文解析(パース)に関連するモジュール、またはそのコンパイル済みバイナリ。
    • builder.6: ビルドプロセス全体、またはコード生成に関連するモジュール、またはそのコンパイル済みバイナリ。
  • usr/gri/pretty: これは、Go言語の初期のコードベースにおけるディレクトリパスの一部です。usr/griは、Go言語の主要な貢献者の一人であるRobert Griesemer(gri)の作業ディレクトリを示唆しています。prettyは、コードの整形(pretty-printing)や表示に関連するツールやライブラリが含まれていた可能性を示しています。

技術的詳細

このコミットの技術的な核心は、Makefileにおける依存関係の正確な定義にあります。makeは、ターゲットをビルドする際に、その依存関係が最新であるかどうかを確認し、必要であれば依存関係を先にビルドします。

変更前は、compilation.6parser.6の両方がbuilder.6に依存していると定義されていました。

  • compilation.6: builder.6 platform.6 parser.6 ast.6 typechecker.6
  • parser.6: ast.6 builder.6 symboltable.6

この依存関係が「ビルドを修正する」ために削除されたということは、以下のいずれかの状況が考えられます。

  1. 循環依存: builder.6compilation.6parser.6に間接的に依存しており、循環依存が発生していた。これはビルドシステムにおいて非常に一般的な問題で、ビルドが停止したり、無限ループに陥ったりする原因となります。
  2. 不要な依存: compilation.6parser.6のビルドには、実際にはbuilder.6は必要なかった。builder.6が不要な依存関係として含まれていたため、builder.6のビルドが失敗したり、変更されたりするたびに、本来関係のないcompilation.6parser.6の再ビルドがトリガーされ、ビルド時間が長くなったり、不必要なビルドエラーが発生したりしていた可能性があります。
  3. 機能の再編成: builder.6が提供していた機能が、他のモジュール(例えばplatform.6ast.6など)に統合されたか、あるいはその機能自体が不要になったため、依存関係から削除された。

このコミットは、Go言語のコンパイラやツールチェーンの内部構造がまだ流動的であった時期の典型的な修正であり、ビルドシステムの安定化と効率化に向けた継続的な取り組みの一部でした。

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

変更はusr/gri/pretty/Makefileファイルにのみ存在します。

--- a/usr/gri/pretty/Makefile
+++ b/usr/gri/pretty/Makefile
@@ -32,7 +32,7 @@ gds.6:	 utils.6 platform.6 compilation.6 printer.6
 
 pretty.6:	 platform.6 printer.6 compilation.6
 
-compilation.6:	 builder.6 platform.6 parser.6 ast.6 typechecker.6
+compilation.6:	 platform.6 parser.6 ast.6 typechecker.6
 
 typechecker.6:	 ast.6
 
@@ -40,7 +40,7 @@ ast.6:	 symboltable.6
 
 symboltable.6:	
 
-parser.6:	ast.6 builder.6 symboltable.6
+parser.6:	ast.6 symboltable.6
 
 platform.6:	 utils.6
 

具体的には、以下の2行が変更されました。

  1. compilation.6の依存関係からbuilder.6が削除されました。
    • 変更前: compilation.6: builder.6 platform.6 parser.6 ast.6 typechecker.6
    • 変更後: compilation.6: platform.6 parser.6 ast.6 typechecker.6
  2. parser.6の依存関係からbuilder.6が削除されました。
    • 変更前: parser.6: ast.6 builder.6 symboltable.6
    • 変更後: parser.6: ast.6 symboltable.6

コアとなるコードの解説

このMakefileの変更は、makeが依存関係を解決し、ビルド順序を決定する方法に直接影響を与えます。

  • compilation.6の変更: compilation.6は、Go言語のコンパイルプロセスにおける重要な部分を担っていたと考えられます。このモジュールがbuilder.6に依存しなくなったことで、compilation.6をビルドする際にbuilder.6が先にビルドされる必要がなくなりました。これにより、ビルドの依存グラフが簡素化され、潜在的な循環依存が解消されたか、あるいは不要なビルドステップが排除された可能性があります。
  • parser.6の変更: 同様に、parser.6はGoソースコードの構文解析を担当するモジュールです。このモジュールもbuilder.6への依存を解消したことで、パース処理のビルドがより独立し、効率的になったと考えられます。

これらの変更は、Go言語の初期のビルドシステムがまだ成熟しておらず、依存関係の管理が手動で行われていた時期の典型的なデバッグと最適化のプロセスを示しています。このような小さな修正の積み重ねが、現在の堅牢なGoビルドシステムへと繋がっています。

関連リンク

参考にした情報源リンク

  • makeユーティリティとMakefileの基本概念に関する一般的なドキュメント
  • Go言語の初期のビルドシステムやツールチェーンに関する歴史的な情報(公式ドキュメントやGoコミュニティの議論など)
  • Plan 9オペレーティングシステムとGo言語の関係に関する情報
  • Go言語のソースコードリポジトリ(GitHub)のコミット履歴
  • Go言語の公式ブログや設計ドキュメント(特に初期のもの)
  • Go言語のコンパイラ(gc)の内部構造に関する一般的な知識
  • Go言語の初期のコミパイラに関する情報: https://go.dev/doc/install/source (Goのソースからのビルドに関する古い情報が含まれている可能性)
  • Go言語の歴史に関するブログ記事やカンファレンストークなど