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

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

このコミットは、Go言語プロジェクトの初期段階におけるビルドシステムの一部変更に関するものです。具体的には、src/cmd/6a/Makefile 内で、構文解析器ジェネレータとして使用されていた yacc への参照を bison に変更しています。これは、Goコンパイラやアセンブラのビルドプロセスにおけるツールチェーンの移行を示唆しています。

コミット

commit 58b280db3b161310cdccfd45c9aef1999245af0f
Author: Russ Cox <rsc@golang.org>
Date:   Tue Jan 13 16:32:46 2009 -0800

    change another yacc reference to bison.
    
    R=r
    DELTA=1  (0 added, 0 deleted, 1 changed)
    OCL=22662
    CL=22691

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

https://github.com/golang/go/commit/58b280db3b161310cdccfd45c9aef1999245af0f

元コミット内容

change another yacc reference to bison.

このコミットメッセージは非常に簡潔ですが、Goプロジェクト内で以前にも同様の yacc から bison への移行が行われていたことを示唆しています。「another」という言葉がその証拠です。

変更の背景

この変更の背景には、Go言語の初期開発におけるビルドツールチェーンの標準化と、よりオープンソースで広く利用されているツールの採用という意図があったと考えられます。

yacc (Yet Another Compiler Compiler) は、Unix系システムで広く使われてきた構文解析器ジェネレータです。しかし、その実装にはプロプライエタリなものや、ライセンス上の制約があるものも存在しました。一方、bison はGNUプロジェクトによって開発された yacc のフリーソフトウェア実装であり、yacc と高い互換性を持ちながらも、より多くの機能や改善が加えられています。

Go言語はオープンソースプロジェクトとして開発されており、そのビルドプロセスも可能な限りオープンソースのツールで構成することが望ましいとされます。このコミットは、Goのビルドシステムが yacc の特定の実装に依存するのではなく、より標準的でオープンな bison を利用するように移行する一環であったと推測されます。これにより、Goのビルド環境のポータビリティと、様々なシステムでの互換性が向上します。

また、src/cmd/6a/Makefile は、Go言語の初期のアセンブラである 6a (amd64アーキテクチャ向けのアセンブラ) のビルド設定ファイルです。アセンブラやコンパイラのようなツールは、通常、入力されたソースコードを解析するために構文解析器を必要とします。この構文解析器を生成するために yaccbison のようなツールが使われます。したがって、この変更はGo言語のコアツールチェーンの基盤に関わるものでした。

前提知識の解説

1. コンパイラコンパイラ (Compiler Compiler) / パーサジェネレータ (Parser Generator)

コンパイラコンパイラ、またはパーサジェネレータとは、プログラミング言語の文法定義(通常はBNF記法など)から、その言語のソースコードを解析するためのプログラム(パーサ、構文解析器)を自動生成するツールです。これにより、開発者は手動で複雑なパーサを記述する手間を省き、文法定義に集中できます。

2. Yacc (Yet Another Compiler Compiler)

yacc は、Unixオペレーティングシステムで広く使われてきたパーサジェネレータです。入力としてLALR(1)文法を受け取り、C言語のソースコードとしてパーサを生成します。生成されたパーサは、字句解析器(通常はlexによって生成される)と連携して動作し、ソースコードの構文が正しいかどうかを検証し、抽象構文木(AST)などの中間表現を構築します。

3. Bison (GNU Parser Generator)

bison は、GNUプロジェクトによって開発された yacc のフリーソフトウェア実装です。yacc との互換性が非常に高く、yacc の文法定義ファイルをそのまま bison で処理できることが多いです。bisonyacc の機能を拡張し、より多くの文法をサポートしたり、エラー回復機能を強化したりしています。また、C、C++、Javaなどの様々な言語でパーサを生成できます。

4. Makefile

Makefile は、ソフトウェアプロジェクトのビルドプロセスを自動化するためのファイルです。make ユーティリティによって解釈され、ソースコードのコンパイル、リンク、テストなどのタスクを定義します。依存関係に基づいて、必要なファイルのみを再ビルドすることで、ビルド時間を短縮します。

5. Go言語の初期のアセンブラ (6a)

Go言語の初期のツールチェーンでは、各アーキテクチャ向けに独自のアセンブラが提供されていました。例えば、6aamd64 (x86-64) アーキテクチャ向けのアセンブラを指します。これらのアセンブラは、Goのコンパイラが生成する中間コードを、最終的な機械語に変換する役割を担っていました。

技術的詳細

このコミットは、src/cmd/6a/Makefile ファイル内の特定の行を変更しています。

変更前:

y.tab.h: $(YFILES)
	yacc $(YFLAGS) $(YFILES)

変更後:

y.tab.h: $(YFILES)
	bison -y $(YFLAGS) $(YFILES)

この変更は、y.tab.h というヘッダーファイルを生成する際のコマンドを yacc から bison -y に切り替えています。

  • y.tab.h: yaccbison が生成するヘッダーファイルで、パーサが使用するトークン定義などが含まれます。
  • $(YFILES): yacc または bison に渡される文法定義ファイル(通常は .y 拡張子を持つファイル)を指すMakefile変数です。
  • $(YFLAGS): yacc または bison に渡されるオプションを指すMakefile変数です。
  • bison -y: bison コマンドに -y オプションを付けて実行しています。この -y オプションは、bisonyacc 互換モードで動作させることを意味します。つまり、yacc と同じファイル名(y.tab.cy.tab.h)で出力し、yacc と同様の動作を保証します。これにより、既存のビルドスクリプトやコードへの影響を最小限に抑えつつ、ツールを bison に切り替えることが可能になります。

この変更は、6a アセンブラの構文解析部分が yacc ではなく bison を使用して生成されるようになったことを意味します。これは、Goプロジェクト全体で bison を標準のパーサジェネレータとして採用する方針の一環であったと考えられます。

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

変更されたファイル: src/cmd/6a/Makefile

--- a/src/cmd/6a/Makefile
+++ b/src/cmd/6a/Makefile
@@ -30,7 +30,7 @@ $(OFILES): $(HFILES)\n lex.$O:../cc/macbody ../cc/lexbody\n \n y.tab.h: $(YFILES)\n-	yacc $(YFLAGS) $(YFILES)\n+	bison -y $(YFLAGS) $(YFILES)\n \n y.tab.c: y.tab.h\n \ttest -f y.tab.c && touch y.tab.c

コアとなるコードの解説

この変更は、Makefile のターゲット y.tab.h のレシピ(コマンド)を修正しています。

  • y.tab.h: $(YFILES): これは y.tab.h というファイルが $(YFILES) に依存していることを示しています。つまり、$(YFILES) のいずれかが変更された場合、y.tab.h を再生成する必要があることを make に伝えています。
  • - yacc $(YFLAGS) $(YFILES): 変更前の行です。yacc コマンドを使用して、$(YFILES) で指定された文法定義ファイルからパーサのヘッダーファイルを生成していました。
  • + bison -y $(YFLAGS) $(YFILES): 変更後の行です。bison コマンドに -y オプションを付けて使用しています。これにより、bisonyacc と互換性のある出力(ファイル名や動作)を生成し、既存のビルドシステムとの整合性を保ちつつ、基盤となるパーサジェネレータを bison に切り替えることができています。

この一見小さな変更は、Go言語のビルドシステムが特定のプロプライエタリなツールへの依存を減らし、よりオープンで標準的なツールチェーンへと移行する戦略的な動きの一部を示しています。

関連リンク

参考にした情報源リンク

  • コミット情報: /home/orange/Project/comemo/commit_data/1468.txt
  • GitHub上のコミットページ: https://github.com/golang/go/commit/58b280db3b161310cdccfd45c9aef1999245af0f
  • YaccとBisonに関する一般的な知識 (プログラミング言語処理、コンパイラ理論の教科書、オンラインドキュメントなど)
  • Makefileの一般的な構文と使用法に関する知識
  • Go言語の初期の歴史やツールチェーンに関する公開情報 (Goブログ、メーリングリストアーカイブなど)```markdown

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

このコミットは、Go言語プロジェクトの初期段階におけるビルドシステムの一部変更に関するものです。具体的には、src/cmd/6a/Makefile 内で、構文解析器ジェネレータとして使用されていた yacc への参照を bison に変更しています。これは、Goコンパイラやアセンブラのビルドプロセスにおけるツールチェーンの移行を示唆しています。

コミット

commit 58b280db3b161310cdccfd45c9aef1999245af0f
Author: Russ Cox <rsc@golang.org>
Date:   Tue Jan 13 16:32:46 2009 -0800

    change another yacc reference to bison.
    
    R=r
    DELTA=1  (0 added, 0 deleted, 1 changed)
    OCL=22662
    CL=22691

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

https://github.com/golang/go/commit/58b280db3b161310cdccfd45c9aef1999245af0f

元コミット内容

change another yacc reference to bison.

このコミットメッセージは非常に簡潔ですが、Goプロジェクト内で以前にも同様の yacc から bison への移行が行われていたことを示唆しています。「another」という言葉がその証拠です。

変更の背景

この変更の背景には、Go言語の初期開発におけるビルドツールチェーンの標準化と、よりオープンソースで広く利用されているツールの採用という意図があったと考えられます。

yacc (Yet Another Compiler Compiler) は、Unix系システムで広く使われてきた構文解析器ジェネレータです。しかし、その実装にはプロプライエタリなものや、ライセンス上の制約があるものも存在しました。一方、bison はGNUプロジェクトによって開発された yacc のフリーソフトウェア実装であり、yacc と高い互換性を持ちながらも、より多くの機能や改善が加えられています。

Go言語はオープンソースプロジェクトとして開発されており、そのビルドプロセスも可能な限りオープンソースのツールで構成することが望ましいとされます。このコミットは、Goのビルドシステムが yacc の特定の実装に依存するのではなく、より標準的でオープンな bison を利用するように移行する一環であったと推測されます。これにより、Goのビルド環境のポータビリティと、様々なシステムでの互換性が向上します。

また、src/cmd/6a/Makefile は、Go言語の初期のアセンブラである 6a (amd64アーキテクチャ向けのアセンブラ) のビルド設定ファイルです。アセンブラやコンパイラのようなツールは、通常、入力されたソースコードを解析するために構文解析器を必要とします。この構文解析器を生成するために yaccbison のようなツールが使われます。したがって、この変更はGo言語のコアツールチェーンの基盤に関わるものでした。

前提知識の解説

1. コンパイラコンパイラ (Compiler Compiler) / パーサジェネレータ (Parser Generator)

コンパイラコンパイラ、またはパーサジェネレータとは、プログラミング言語の文法定義(通常はBNF記法など)から、その言語のソースコードを解析するためのプログラム(パーサ、構文解析器)を自動生成するツールです。これにより、開発者は手動で複雑なパーサを記述する手間を省き、文法定義に集中できます。

2. Yacc (Yet Another Compiler Compiler)

yacc は、Unixオペレーティングシステムで広く使われてきたパーサジェネレータです。入力としてLALR(1)文法を受け取り、C言語のソースコードとしてパーサを生成します。生成されたパーサは、字句解析器(通常はlexによって生成される)と連携して動作し、ソースコードの構文が正しいかどうかを検証し、抽象構文木(AST)などの中間表現を構築します。

3. Bison (GNU Parser Generator)

bison は、GNUプロジェクトによって開発された yacc のフリーソフトウェア実装です。yacc との互換性が非常に高く、yacc の文法定義ファイルをそのまま bison で処理できることが多いです。bisonyacc の機能を拡張し、より多くの文法をサポートしたり、エラー回復機能を強化したりしています。また、C、C++、Javaなどの様々な言語でパーサを生成できます。

4. Makefile

Makefile は、ソフトウェアプロジェクトのビルドプロセスを自動化するためのファイルです。make ユーティリティによって解釈され、ソースコードのコンパイル、リンク、テストなどのタスクを定義します。依存関係に基づいて、必要なファイルのみを再ビルドすることで、ビルド時間を短縮します。

5. Go言語の初期のアセンブラ (6a)

Go言語の初期のツールチェーンでは、各アーキテクチャ向けに独自のアセンブラが提供されていました。例えば、6aamd64 (x86-64) アーキテクチャ向けのアセンブラを指します。これらのアセンブラは、Goのコンパイラが生成する中間コードを、最終的な機械語に変換する役割を担っていました。

技術的詳細

このコミットは、src/cmd/6a/Makefile ファイル内の特定の行を変更しています。

変更前:

y.tab.h: $(YFILES)
	yacc $(YFLAGS) $(YFILES)

変更後:

y.tab.h: $(YFILES)
	bison -y $(YFLAGS) $(YFILES)

この変更は、y.tab.h というヘッダーファイルを生成する際のコマンドを yacc から bison -y に切り替えています。

  • y.tab.h: yaccbison が生成するヘッダーファイルで、パーサが使用するトークン定義などが含まれます。
  • $(YFILES): yacc または bison に渡される文法定義ファイル(通常は .y 拡張子を持つファイル)を指すMakefile変数です。
  • $(YFLAGS): yacc または bison に渡されるオプションを指すMakefile変数です。
  • bison -y: bison コマンドに -y オプションを付けて実行しています。この -y オプションは、bisonyacc 互換モードで動作させることを意味します。つまり、yacc と同じファイル名(y.tab.cy.tab.h)で出力し、yacc と同様の動作を保証します。これにより、既存のビルドスクリプトやコードへの影響を最小限に抑えつつ、ツールを bison に切り替えることが可能になります。

この変更は、6a アセンブラの構文解析部分が yacc ではなく bison を使用して生成されるようになったことを意味します。これは、Goプロジェクト全体で bison を標準のパーサジェネレータとして採用する方針の一環であったと考えられます。

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

変更されたファイル: src/cmd/6a/Makefile

--- a/src/cmd/6a/Makefile
+++ b/src/cmd/6a/Makefile
@@ -30,7 +30,7 @@ $(OFILES): $(HFILES)\n lex.$O:../cc/macbody ../cc/lexbody\n \n y.tab.h: $(YFILES)\n-	yacc $(YFLAGS) $(YFILES)\n+	bison -y $(YFLAGS) $(YFILES)\n \n y.tab.c: y.tab.h\n \ttest -f y.tab.c && touch y.tab.c

コアとなるコードの解説

この変更は、Makefile のターゲット y.tab.h のレシピ(コマンド)を修正しています。

  • y.tab.h: $(YFILES): これは y.tab.h というファイルが $(YFILES) に依存していることを示しています。つまり、$(YFILES) のいずれかが変更された場合、y.tab.h を再生成する必要があることを make に伝えています。
  • - yacc $(YFLAGS) $(YFILES): 変更前の行です。yacc コマンドを使用して、$(YFILES) で指定された文法定義ファイルからパーサのヘッダーファイルを生成していました。
  • + bison -y $(YFLAGS) $(YFILES): 変更後の行です。bison コマンドに -y オプションを付けて使用しています。これにより、bisonyacc と互換性のある出力(ファイル名や動作)を生成し、既存のビルドシステムとの整合性を保ちつつ、基盤となるパーサジェネレータを bison に切り替えることができています。

この一見小さな変更は、Go言語のビルドシステムが特定のプロプライエタリなツールへの依存を減らし、よりオープンで標準的なツールチェーンへと移行する戦略的な動きの一部を示しています。

関連リンク

参考にした情報源リンク

  • コミット情報: /home/orange/Project/comemo/commit_data/1468.txt
  • GitHub上のコミットページ: https://github.com/golang/go/commit/58b280db3b161310cdccfd45c9aef1999245af0f
  • YaccとBisonに関する一般的な知識 (プログラミング言語処理、コンパイラ理論の教科書、オンラインドキュメントなど)
  • Makefileの一般的な構文と使用法に関する知識
  • Go言語の初期の歴史やツールチェーンに関する公開情報 (Goブログ、メーリングリストアーカイブなど)