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

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

本コミットは、Go言語の初期開発段階において、ビルドシステムからblyaccというツールを削除した変更を記録しています。これは、Go言語のコンパイラやツールチェインの構築プロセスにおける重要な変更点であり、Goが独自のツール開発へと舵を切ったことを示唆しています。

コミット

このコミットは、Go言語のビルドスクリプトであるsrc/cmd/clean.bashsrc/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.bashmake.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)は、その設計思想として「シンプルさ」と「高速なコンパイル」を重視しています。外部ツールに依存しない手書きパーサーの採用は、以下の点でこの目標に貢献します。

  1. ビルドプロセスの簡素化: blyaccのような外部ツールをビルドシステムから削除することで、Goツールチェインのビルドに必要なステップが減り、依存関係が単純化されます。これにより、GoのソースコードからGoのツールチェインをビルドする「ブートストラップ」プロセスがより堅牢かつ高速になります。
  2. コンパイラの自己完結性: GoコンパイラがGo自身で書かれ、Goのツールチェインのみでビルドできるようになるという目標に近づきます。これは、Go言語のエコシステムが自己完結的であるための重要なステップです。
  3. デバッグと保守性の向上: 手書きのパーサーは、自動生成されたコードよりも人間が理解しやすく、デバッグや機能追加、最適化が容易になります。Goコンパイラの開発者は、パーサーの動作をより直接的に制御できるようになります。
  4. パフォーマンス: yaccのようなツールが生成するパーサーは一般的に高速ですが、手書きの再帰下降パーサーも適切に実装されれば非常に効率的です。Goコンパイラは、高速なコンパイル時間を実現するために、パーサーの効率性も考慮して設計されています。

この変更は、Go言語がその初期段階から、独自のツールチェインとビルド戦略を確立しようとしていたことを明確に示しています。これは、Goが単なるプログラミング言語に留まらず、堅牢で自己完結的な開発エコシステムを目指していたことの証拠です。

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

変更は、src/cmd/clean.bashsrc/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など、パーサーの実装箇所)

参考にした情報源リンク