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

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

このコミットは、Go言語のコンパイラの一つであるgccgoにおけるライブラリの取り扱いに関する変更と、それに伴うビルド設定の修正を扱っています。具体的には、flagおよびfmtライブラリがgccgoによってデフォルトで利用可能になったことに対応し、Makefileからこれらのライブラリの明示的なコンパイルとリンクの記述を削除しています。また、PRETTY_OBJS変数において、compilation.goというGoのソースファイルではなく、コンパイル済みのオブジェクトファイルであるcompilation.oを参照するように修正されています。

コミット

commit 748287d49e6896aa4529e906091a4f54c7638399
Author: Ian Lance Taylor <iant@golang.org>
Date:   Tue Dec 2 12:52:47 2008 -0800

    The flag and fmt libraries are now available from gccgo by
    default.  Fix PRETTY_OBJS to include compilation.o rather than
    compilation.go.
    
    R=gri
    DELTA=10  (0 added, 8 deleted, 2 changed)
    OCL=20248
    CL=20257

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

https://github.com/golang/go/commit/748287d49e6896aa4529e906091a4f54c7638399

元コミット内容

diff --git a/usr/gri/pretty/Makefile.iant b/usr/gri/pretty/Makefile.iant
index 3c952f0f7b..b6d794a272 100644
--- a/usr/gri/pretty/Makefile.iant
+++ b/usr/gri/pretty/Makefile.iant
@@ -11,14 +11,12 @@ LDFLAGS = -Wl,-R,/home/iant/go/lib
 PRETTY_OBJS = \
 	ast.o \
 	pretty.o \
-\tcompilation.go \
+\tcompilation.o \
 	parser.o \
 	platform.o \
 	printer.o \
 	scanner.o \
-\tutils.o \
-\tflag.o \
-\tfmt.o \
+\tutils.o
 
 pretty: $(PRETTY_OBJS)
 	$(GO) $(LDFLAGS) -o $@ $(PRETTY_OBJS)
@@ -48,12 +46,6 @@ platform.o:	 utils.o
 printer.o:	 scanner.o ast.o
 
 
-flag.o:	fmt.o
-\t$(GO) -O2 -c -g $(GOROOT)/src/lib/flag.go
-\n-fmt.o:
-\t$(GO) -O2 -c -g $(GOROOT)/src/lib/fmt.go
-\n.SUFFIXES:\n.SUFFIXES: .go .o
-\n

変更の背景

このコミットの主な背景は、Go言語のコンパイラであるgccgoの進化にあります。初期のGo開発段階では、ライブラリのビルドやリンクに関して様々な試行錯誤が行われていました。このコミットが行われた2008年12月時点では、Go言語自体がまだ非常に初期の段階であり、コンパイラやツールチェインも活発に開発されていました。

コミットメッセージにある「The flag and fmt libraries are now available from gccgo by default.」という記述は、gccgoがGoの標準ライブラリであるflagパッケージとfmtパッケージを、特別な設定なしにデフォルトで認識し、利用できるようになったことを示しています。これは、gccgoのビルドシステムや内部構造が改善され、これらの基本的なライブラリがコンパイラに組み込まれるか、あるいは自動的に解決されるようになったことを意味します。

これにより、個々のMakefileでこれらのライブラリを明示的にコンパイルしたり、オブジェクトファイルとしてリンクしたりする必要がなくなりました。これはビルドプロセスの簡素化と効率化に繋がり、開発者がGoの標準ライブラリをよりシームレスに利用できるようになるための重要なステップでした。

また、compilation.goからcompilation.oへの変更は、ビルドシステムがGoのソースファイルを直接参照するのではなく、コンパイル済みのオブジェクトファイルを参照する、より一般的なビルドプラクティスに移行したことを示唆しています。これは、ビルドの依存関係をより正確に管理し、不要な再コンパイルを防ぐための改善と考えられます。

前提知識の解説

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

  • Go言語: Googleによって開発された静的型付けのコンパイル型言語。シンプルさ、効率性、並行処理のサポートが特徴です。
  • gccgo: Go言語のフロントエンドとしてGCC (GNU Compiler Collection) を利用するコンパイラです。GoのコードをGCCのバックエンドを通じて様々なアーキテクチャ向けにコンパイルできます。Go言語の公式コンパイラであるgcとは異なる実装です。
  • Makefile: makeユーティリティが使用するビルド自動化スクリプトです。ソースコードのコンパイル、リンク、テストなどのタスクを定義し、依存関係に基づいて自動的に実行します。
    • .oファイル: オブジェクトファイル。コンパイラによって生成される中間ファイルで、ソースコードが機械語に変換されたものです。まだ実行可能なプログラムではありませんが、他のオブジェクトファイルやライブラリとリンクすることで実行可能ファイルになります。
    • .goファイル: Go言語のソースコードファイル。
    • PRETTY_OBJS: Makefile内で定義された変数で、prettyというターゲットをビルドするために必要なオブジェクトファイル(.oファイル)のリストを保持しています。
  • Goの標準ライブラリ:
    • flagパッケージ: コマンドライン引数を解析するためのパッケージです。プログラムが起動時に受け取るオプション(フラグ)を定義し、その値を処理するために使用されます。
    • fmtパッケージ: フォーマットされたI/O(入出力)を実装するためのパッケージです。文字列のフォーマット、標準出力への出力(fmt.Printlnなど)、標準入力からの読み込みなどに使用されます。Go言語のプログラムで最も頻繁に使用されるパッケージの一つです。
  • コンパイルとリンク:
    • コンパイル: ソースコード(人間が書いたプログラム)を、コンピュータが直接理解できる機械語(オブジェクトコード)に変換するプロセスです。
    • リンク: コンパイルによって生成された複数のオブジェクトファイルやライブラリを結合し、一つの実行可能なプログラムを作成するプロセスです。このプロセスで、関数呼び出しや変数参照が解決され、最終的な実行ファイルが生成されます。

技術的詳細

このコミットの技術的なポイントは、gccgoのビルドシステムにおけるGo標準ライブラリの取り扱い方法の変更に集約されます。

以前のgccgoでは、flagfmtといったGoの標準ライブラリを使用するGoプログラムをビルドする際、これらのライブラリのソースコードを明示的にコンパイルし、そのオブジェクトファイルを最終的な実行ファイルにリンクする必要がありました。これは、Makefile内でflag.ofmt.oのコンパイルルールが定義され、PRETTY_OBJSリストに含まれていたことから明らかです。

しかし、このコミットの時点で、gccgoはこれらの基本的な標準ライブラリを「デフォルトで利用可能」にするように改善されました。これは以下のいずれかの方法で実現されたと考えられます。

  1. 組み込みライブラリ: gccgo自体が、flagfmtのような頻繁に使用される標準ライブラリのオブジェクトコードを内部に持つようになった。これにより、外部から明示的にコンパイル・リンクする必要がなくなった。
  2. 自動解決: gccgoが、Goのソースコード内でimport "flag"import "fmt"といった記述を見つけると、自動的に適切なライブラリのパスを解決し、リンク時にそれらを組み込むようになった。これは、C/C++コンパイラが標準ライブラリ(例: libc)を自動的にリンクするのと似たアプローチです。
  3. 共通ライブラリパス: gccgoのインストールパスや設定において、Goの標準ライブラリのコンパイル済みバイナリが配置される共通の場所が確立され、コンパイラがその場所を自動的に検索するようになった。

この変更により、usr/gri/pretty/Makefile.iantのような個別のプロジェクトのMakefileから、flagfmtに関する冗長なビルドステップを削除できるようになりました。これにより、Makefileはより簡潔になり、ビルドプロセスはより効率的になります。

また、compilation.goからcompilation.oへの変更は、ビルドの依存関係管理の改善を示しています。Makefileにおいて、ターゲットがソースファイルに依存している場合、そのソースファイルが変更されるたびにターゲットが再ビルドされます。しかし、オブジェクトファイルに依存するように変更することで、compilation.goが変更された場合にのみcompilation.oが再コンパイルされ、そのcompilation.oが変更された場合にのみprettyターゲットが再リンクされるという、より粒度の細かい依存関係管理が可能になります。これは、大規模なプロジェクトにおいてビルド時間を短縮するために重要なプラクティスです。

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

変更はusr/gri/pretty/Makefile.iantファイルに集中しています。

  1. PRETTY_OBJS変数の変更:
    • 削除: -compilation.go
    • 追加: +compilation.o
    • 削除: -flag.o
    • 削除: -fmt.o
  2. flag.ofmt.oのコンパイルルールの削除:
    • flag.o: fmt.o
    • \t$(GO) -O2 -c -g $(GOROOT)/src/lib/flag.go
    • fmt.o:
    • \t$(GO) -O2 -c -g $(GOROOT)/src/lib/fmt.go これらのルールが完全に削除されました。

コアとなるコードの解説

  • PRETTY_OBJSの変更 (compilation.go -> compilation.o):

    • 変更前: PRETTY_OBJSリストにcompilation.goというGoのソースファイルが直接含まれていました。これは、makeprettyターゲットをビルドする際に、compilation.goを直接コンパイルしようとするか、あるいは何らかの暗黙的なルールに依存していたことを意味します。
    • 変更後: compilation.oというオブジェクトファイルが含まれるようになりました。これは、compilation.goが事前にコンパイルされてcompilation.oが生成されることを前提とし、prettyターゲットはコンパイル済みのオブジェクトファイルに依存するように変更されたことを示します。これにより、ビルドの依存関係がより明確になり、makeが効率的に動作するようになります。
  • flag.ofmt.oの削除:

    • 変更前: PRETTY_OBJSリストにはflag.ofmt.oが含まれており、さらにMakefileの後半にはこれらのオブジェクトファイルを生成するための明示的なコンパイルルールが定義されていました。これは、prettyというプログラムがflagfmtライブラリに依存しており、それらをビルドプロセスの一部としてコンパイル・リンクする必要があったことを示します。
    • 変更後: flag.ofmt.oPRETTY_OBJSから削除され、それらをコンパイルするためのルールも削除されました。これは、gccgoがこれらのライブラリをデフォルトで提供するようになったため、個々のMakefileでこれらを明示的に扱う必要がなくなったことを意味します。これにより、Makefileは簡素化され、ビルドプロセスがよりクリーンになりました。

これらの変更は、Go言語のツールチェイン、特にgccgoの成熟と、ビルドプロセスの標準化に向けた初期のステップを反映しています。

関連リンク

参考にした情報源リンク

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

このコミットは、Go言語のコンパイラの一つであるgccgoにおけるライブラリの取り扱いに関する変更と、それに伴うビルド設定の修正を扱っています。具体的には、flagおよびfmtライブラリがgccgoによってデフォルトで利用可能になったことに対応し、Makefileからこれらのライブラリの明示的なコンパイルとリンクの記述を削除しています。また、PRETTY_OBJS変数において、compilation.goというGoのソースファイルではなく、コンパイル済みのオブジェクトファイルであるcompilation.oを参照するように修正されています。

コミット

commit 748287d49e6896aa4529e906091a4f54c7638399
Author: Ian Lance Taylor <iant@golang.org>
Date:   Tue Dec 2 12:52:47 2008 -0800

    The flag and fmt libraries are now available from gccgo by
    default.  Fix PRETTY_OBJS to include compilation.o rather than
    compilation.go.
    
    R=gri
    DELTA=10  (0 added, 8 deleted, 2 changed)
    OCL=20248
    CL=20257

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

https://github.com/golang/go/commit/748287d49e6896aa4529e906091a4f54c7638399

元コミット内容

diff --git a/usr/gri/pretty/Makefile.iant b/usr/gri/pretty/Makefile.iant
index 3c952f0f7b..b6d794a272 100644
--- a/usr/gri/pretty/Makefile.iant
+++ b/usr/gri/pretty/Makefile.iant
@@ -11,14 +11,12 @@ LDFLAGS = -Wl,-R,/home/iant/go/lib
 PRETTY_OBJS = \
 	ast.o \
 	pretty.o \
-\tcompilation.go \
+\tcompilation.o \
 	parser.o \
 	platform.o \
 	printer.o \
 	scanner.o \
-\tutils.o \
-\tflag.o \
-\tfmt.o \
+\tutils.o
 
 pretty: $(PRETTY_OBJS)
 	$(GO) $(LDFLAGS) -o $@ $(PRETTY_OBJS)
@@ -48,12 +46,6 @@ platform.o:	 utils.o
 printer.o:	 scanner.o ast.o
 
 
-flag.o:	fmt.o
-\t$(GO) -O2 -c -g $(GOROOT)/src/lib/flag.go
-\n-fmt.o:
-\t$(GO) -O2 -c -g $(GOROOT)/src/lib/fmt.go
-\n.SUFFIXES:\n.SUFFIXES: .go .o
-\n

変更の背景

このコミットの主な背景は、Go言語のコンパイラであるgccgoの進化にあります。初期のGo開発段階では、ライブラリのビルドやリンクに関して様々な試行錯誤が行われていました。このコミットが行われた2008年12月時点では、Go言語自体がまだ非常に初期の段階であり、コンパイラやツールチェインも活発に開発されていました。

コミットメッセージにある「The flag and fmt libraries are now available from gccgo by default.」という記述は、gccgoがGoの標準ライブラリであるflagパッケージとfmtパッケージを、特別な設定なしにデフォルトで認識し、利用できるようになったことを示しています。これは、gccgoのビルドシステムや内部構造が改善され、これらの基本的なライブラリがコンパイラに組み込まれるか、あるいは自動的に解決されるようになったことを意味します。

これにより、個々のMakefileでこれらのライブラリを明示的にコンパイルしたり、オブジェクトファイルとしてリンクしたりする必要がなくなりました。これはビルドプロセスの簡素化と効率化に繋がり、開発者がGoの標準ライブラリをよりシームレスに利用できるようになるための重要なステップでした。

また、compilation.goからcompilation.oへの変更は、ビルドシステムがGoのソースファイルを直接参照するのではなく、コンパイル済みのオブジェクトファイルを参照する、より一般的なビルドプラクティスに移行したことを示唆しています。これは、ビルドの依存関係をより正確に管理し、不要な再コンパイルを防ぐための改善と考えられます。

前提知識の解説

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

  • Go言語: Googleによって開発された静的型付けのコンパイル型言語。シンプルさ、効率性、並行処理のサポートが特徴です。
  • gccgo: Go言語のフロントエンドとしてGCC (GNU Compiler Collection) を利用するコンパイラです。GoのコードをGCCのバックエンドを通じて様々なアーキテクチャ向けにコンパイルできます。Go言語の公式コンパイラであるgcとは異なる実装です。
  • Makefile: makeユーティリティが使用するビルド自動化スクリプトです。ソースコードのコンパイル、リンク、テストなどのタスクを定義し、依存関係に基づいて自動的に実行します。
    • .oファイル: オブジェクトファイル。コンパイラによって生成される中間ファイルで、ソースコードが機械語に変換されたものです。まだ実行可能なプログラムではありませんが、他のオブジェクトファイルやライブラリとリンクすることで実行可能ファイルになります。
    • .goファイル: Go言語のソースコードファイル。
    • PRETTY_OBJS: Makefile内で定義された変数で、prettyというターゲットをビルドするために必要なオブジェクトファイル(.oファイル)のリストを保持しています。
  • Goの標準ライブラリ:
    • flagパッケージ: コマンドライン引数を解析するためのパッケージです。プログラムが起動時に受け取るオプション(フラグ)を定義し、その値を処理するために使用されます。
    • fmtパッケージ: フォーマットされたI/O(入出力)を実装するためのパッケージです。文字列のフォーマット、標準出力への出力(fmt.Printlnなど)、標準入力からの読み込みなどに使用されます。Go言語のプログラムで最も頻繁に使用されるパッケージの一つです。
  • コンパイルとリンク:
    • コンパイル: ソースコード(人間が書いたプログラム)を、コンピュータが直接理解できる機械語(オブジェクトコード)に変換するプロセスです。
    • リンク: コンパイルによって生成された複数のオブジェクトファイルやライブラリを結合し、一つの実行可能なプログラムを作成するプロセスです。このプロセスで、関数呼び出しや変数参照が解決され、最終的な実行ファイルが生成されます。

技術的詳細

このコミットの技術的なポイントは、gccgoのビルドシステムにおけるGo標準ライブラリの取り扱い方法の変更に集約されます。

以前のgccgoでは、flagfmtといったGoの標準ライブラリを使用するGoプログラムをビルドする際、これらのライブラリのソースコードを明示的にコンパイルし、そのオブジェクトファイルを最終的な実行ファイルにリンクする必要がありました。これは、Makefile内でflag.ofmt.oのコンパイルルールが定義され、PRETTY_OBJSリストに含まれていたことから明らかです。

しかし、このコミットの時点で、gccgoはこれらの基本的な標準ライブラリを「デフォルトで利用可能」にするように改善されました。これは以下のいずれかの方法で実現されたと考えられます。

  1. 組み込みライブラリ: gccgo自体が、flagfmtのような頻繁に使用される標準ライブラリのオブジェクトコードを内部に持つようになった。これにより、外部から明示的にコンパイル・リンクする必要がなくなった。
  2. 自動解決: gccgoが、Goのソースコード内でimport "flag"import "fmt"といった記述を見つけると、自動的に適切なライブラリのパスを解決し、リンク時にそれらを組み込むようになった。これは、C/C++コンパイラが標準ライブラリ(例: libc)を自動的にリンクするのと似たアプローチです。
  3. 共通ライブラリパス: gccgoのインストールパスや設定において、Goの標準ライブラリのコンパイル済みバイナリが配置される共通の場所が確立され、コンパイラがその場所を自動的に検索するようになった。

この変更により、usr/gri/pretty/Makefile.iantのような個別のプロジェクトのMakefileから、flagfmtに関する冗長なビルドステップを削除できるようになりました。これにより、Makefileはより簡潔になり、ビルドプロセスの効率が向上します。

また、compilation.goからcompilation.oへの変更は、ビルドの依存関係管理の改善を示しています。Makefileにおいて、ターゲットがソースファイルに依存している場合、そのソースファイルが変更されるたびにターゲットが再ビルドされます。しかし、オブジェクトファイルに依存するように変更することで、compilation.goが変更された場合にのみcompilation.oが再コンパイルされ、そのcompilation.oが変更された場合にのみprettyターゲットが再リンクされるという、より粒度の細かい依存関係管理が可能になります。これは、大規模なプロジェクトにおいてビルド時間を短縮するために重要なプラクティスです。

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

変更はusr/gri/pretty/Makefile.iantファイルに集中しています。

  1. PRETTY_OBJS変数の変更:
    • 削除: -compilation.go
    • 追加: +compilation.o
    • 削除: -flag.o
    • 削除: -fmt.o
  2. flag.ofmt.oのコンパイルルールの削除:
    • flag.o: fmt.o
    • \t$(GO) -O2 -c -g $(GOROOT)/src/lib/flag.go
    • fmt.o:
    • \t$(GO) -O2 -c -g $(GOROOT)/src/lib/fmt.go これらのルールが完全に削除されました。

コアとなるコードの解説

  • PRETTY_OBJSの変更 (compilation.go -> compilation.o):

    • 変更前: PRETTY_OBJSリストにcompilation.goというGoのソースファイルが直接含まれていました。これは、makeprettyターゲットをビルドする際に、compilation.goを直接コンパイルしようとするか、あるいは何らかの暗黙的なルールに依存していたことを意味します。
    • 変更後: compilation.oというオブジェクトファイルが含まれるようになりました。これは、compilation.goが事前にコンパイルされてcompilation.oが生成されることを前提とし、prettyターゲットはコンパイル済みのオブジェクトファイルに依存するように変更されたことを示します。これにより、ビルドの依存関係がより明確になり、makeが効率的に動作するようになります。
  • flag.ofmt.oの削除:

    • 変更前: PRETTY_OBJSリストにはflag.ofmt.oが含まれており、さらにMakefileの後半にはこれらのオブジェクトファイルを生成するための明示的なコンパイルルールが定義されていました。これは、prettyというプログラムがflagfmtライブラリに依存しており、それらをビルドプロセスの一部としてコンパイル・リンクする必要があったことを示します。
    • 変更後: flag.ofmt.oPRETTY_OBJSから削除され、それらをコンパイルするためのルールも削除されました。これは、gccgoがこれらのライブラリをデフォルトで提供するようになったため、個々のMakefileでこれらを明示的に扱う必要がなくなったことを意味します。これにより、Makefileは簡素化され、ビルドプロセスがよりクリーンになりました。

これらの変更は、Go言語のツールチェイン、特にgccgoの成熟と、ビルドプロセスの標準化に向けた初期のステップを反映しています。

関連リンク

参考にした情報源リンク