[インデックス 1408] ファイルの概要
本コミットは、Go言語の初期開発段階において、ビルドシステムからblyacc
というツールを削除した変更を記録しています。これは、Go言語のコンパイラやツールチェインの構築プロセスにおける重要な変更点であり、Goが独自のツール開発へと舵を切ったことを示唆しています。
コミット
このコミットは、Go言語のビルドスクリプトであるsrc/cmd/clean.bash
とsrc/cmd/make.bash
から、blyacc
という項目を削除するものです。これにより、Goのビルドおよびクリーンアッププロセスにおいて、blyacc
が管理対象から外されました。変更は非常に小規模ですが、その背景にはGo言語の設計思想とツールチェイン戦略の進化があります。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/8318187f7703426788d9a75e5d8bf88a4a7e8375
元コミット内容
delete blyacc
R=r
DELTA=3562 (0 added, 3560 deleted, 2 changed)
OCL=22112
CL=22114
変更の背景
このコミットの背景には、Go言語のコンパイラ開発におけるパーサー生成戦略の変更があります。blyacc
は、おそらくyacc
(Yet Another Compiler Compiler)の派生または関連ツールであり、構文解析器(パーサー)を自動生成するために使用されるツールです。
Go言語の初期段階では、コンパイラのフロントエンド(字句解析器と構文解析器)の構築に、既存のパーサー生成ツールを使用していた可能性があります。しかし、Go言語の設計哲学の一つに「シンプルさ」と「依存関係の最小化」があります。外部ツールへの依存を減らし、Go自身でツールチェインを完結させるという方針が採用されたと考えられます。
具体的には、Go言語のコンパイラは最終的に、yacc
のような外部ツールに依存せず、手書きの再帰下降パーサー(recursive descent parser)を採用するようになりました。これにより、ビルドプロセスの複雑性が軽減され、Goコンパイラ自体の可読性と保守性が向上しました。blyacc
の削除は、この戦略転換の一環として行われたものです。
前提知識の解説
Yacc (Yet Another Compiler Compiler)
yacc
は、プログラミング言語の構文解析器(パーサー)を自動生成するためのツールです。BNF(Backus-Naur Form)やEBNF(Extended Backus-Naur Form)などの形式で記述された文法規則を入力として受け取り、その文法に従って入力ストリームを解析するC言語のコードを生成します。コンパイラやインタプリタのフロントエンド開発において広く利用されてきました。
yacc
によって生成されるパーサーは、通常LALR(1)パーサーと呼ばれるタイプで、効率的な構文解析が可能です。しかし、生成されるコードは人間が直接読むには複雑になりがちで、デバッグが難しいという側面もあります。
再帰下降パーサー (Recursive Descent Parser)
再帰下降パーサーは、文法規則を直接関数として実装する手書きの構文解析器です。各非終端記号(文法規則の左辺)に対応する関数を作成し、その関数内で終端記号(トークン)を読み進めたり、他の非終端記号に対応する関数を再帰的に呼び出したりすることで構文解析を行います。
この方式の利点は、生成されるコードが人間にとって読みやすく、デバッグが容易であることです。また、エラー回復処理を柔軟に実装できるというメリットもあります。欠点としては、左再帰の文法を直接扱えない(変換が必要)ことや、大規模な文法では手書きの負担が大きいことが挙げられます。Go言語のコンパイラは、この再帰下降パーサーを採用しています。
clean.bash
とmake.bash
これらはGo言語の初期のビルドシステムで使用されていたシェルスクリプトです。
clean.bash
: ビルドによって生成された中間ファイルや実行ファイルを削除し、クリーンな状態に戻すためのスクリプトです。通常、開発環境の整理や再ビルドの前に実行されます。make.bash
: Go言語のツールチェイン(コンパイラ、アセンブラ、リンカなど)をビルドするためのスクリプトです。Goのソースコードから実行可能なバイナリを生成するプロセスを自動化します。
これらのスクリプトは、Goの各ツール(cc
, 6l
, 6a
, 6c
, gc
, 6g
, ar
, db
, nm
, acid
, cov
, gobuild
, prof
, gotest
など)に対して、それぞれmake clean
やビルドコマンドを実行するループを含んでいます。blyacc
がこのリストに含まれていたということは、かつてblyacc
もGoのツールチェインの一部としてビルド・管理されていたことを意味します。
技術的詳細
このコミットの技術的詳細は、Go言語のコンパイラが外部のパーサー生成ツール(この場合はblyacc
)への依存を排除し、手書きの再帰下降パーサーに移行した点に集約されます。
Go言語のコンパイラ(gc
)は、その設計思想として「シンプルさ」と「高速なコンパイル」を重視しています。外部ツールに依存しない手書きパーサーの採用は、以下の点でこの目標に貢献します。
- ビルドプロセスの簡素化:
blyacc
のような外部ツールをビルドシステムから削除することで、Goツールチェインのビルドに必要なステップが減り、依存関係が単純化されます。これにより、GoのソースコードからGoのツールチェインをビルドする「ブートストラップ」プロセスがより堅牢かつ高速になります。 - コンパイラの自己完結性: GoコンパイラがGo自身で書かれ、Goのツールチェインのみでビルドできるようになるという目標に近づきます。これは、Go言語のエコシステムが自己完結的であるための重要なステップです。
- デバッグと保守性の向上: 手書きのパーサーは、自動生成されたコードよりも人間が理解しやすく、デバッグや機能追加、最適化が容易になります。Goコンパイラの開発者は、パーサーの動作をより直接的に制御できるようになります。
- パフォーマンス:
yacc
のようなツールが生成するパーサーは一般的に高速ですが、手書きの再帰下降パーサーも適切に実装されれば非常に効率的です。Goコンパイラは、高速なコンパイル時間を実現するために、パーサーの効率性も考慮して設計されています。
この変更は、Go言語がその初期段階から、独自のツールチェインとビルド戦略を確立しようとしていたことを明確に示しています。これは、Goが単なるプログラミング言語に留まらず、堅牢で自己完結的な開発エコシステムを目指していたことの証拠です。
コアとなるコードの変更箇所
変更は、src/cmd/clean.bash
とsrc/cmd/make.bash
の2つのファイルにわたります。
src/cmd/clean.bash
--- a/src/cmd/clean.bash
+++ b/src/cmd/clean.bash
@@ -3,7 +3,7 @@
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
-for i in cc 6l 6a 6c gc 6g ar db nm blyacc acid cov gobuild prof gotest
+for i in cc 6l 6a 6c gc 6g ar db nm acid cov gobuild prof gotest
do
cd $i
make clean
src/cmd/make.bash
--- a/src/cmd/make.bash
+++ b/src/cmd/make.bash
@@ -12,7 +12,7 @@ bash mkenam
make enam.o
cd ..
-for i in cc 6l 6a 6c gc 6g ar db nm blyacc acid cov gobuild prof gotest
+for i in cc 6l 6a 6c gc 6g ar db nm acid cov gobuild prof gotest
do
echo; echo; echo %%%% making $i %%%%; echo
cd $i
コアとなるコードの解説
両方のファイルにおいて、変更は非常にシンプルです。for i in ...
というループのリストから、blyacc
という文字列が削除されています。
-
src/cmd/clean.bash
の変更: このスクリプトは、Goの各ツールディレクトリに移動し、それぞれのmake clean
コマンドを実行することで、ビルド成果物を削除します。blyacc
がこのリストから削除されたということは、もはやblyacc
に関連するクリーンアップ作業が不要になったことを意味します。これは、blyacc
がGoのビルドプロセスから完全に切り離されたことを示唆しています。 -
src/cmd/make.bash
の変更: このスクリプトは、Goの各ツールディレクトリに移動し、それぞれのビルドコマンドを実行することで、Goツールチェイン全体を構築します。blyacc
がこのリストから削除されたということは、もはやblyacc
がGoツールチェインの一部としてビルドされる必要がなくなったことを意味します。これは、Goコンパイラがblyacc
に依存しなくなった、あるいはblyacc
の機能がGoの他のツールに統合されたか、手書きのコードに置き換えられたことを強く示しています。
これらの変更は、Go言語のビルドシステムがよりスリムになり、外部のパーサー生成ツールへの依存が解消されたことを直接的に反映しています。
関連リンク
- Go言語のコンパイラ設計に関する議論やドキュメント(特に初期のもの)
- Go言語のブートストラッププロセスに関する情報
- Go言語のコンパイラソースコード(
src/cmd/compile/internal/syntax
など、パーサーの実装箇所)
参考にした情報源リンク
- Go言語の公式リポジトリのコミット履歴
- Go言語の設計に関するブログ記事やドキュメント(特に初期の設計決定に関するもの)
- コンパイラ理論に関する一般的な情報源(Yacc, 再帰下降パーサーなど)
- Go言語のコンパイラがどのように動作するか (これは一般的な情報源であり、この特定のコミットに直接言及しているわけではありませんが、Goコンパイラの設計思想を理解するのに役立ちます。)
- Go言語の初期のビルドプロセスに関する議論 (具体的なURLは特定できませんが、Goのメーリングリストアーカイブなどで関連する議論が見つかる可能性があります。)
- YaccのWikipediaページ
- 再帰下降パーサーのWikipediaページ