まつもとさん自身によるStreemについての解説は、今後日経Linuxで順次掲載されるようです。まつもとさんがStreemについて解説する内容は、おそらく、プログラミング言語設計に関する高レベルなものとなるのではないでしょうか。
本記事はそれとは無関係に、2015年1月に公開されているStreemについての低レベルな解説、つまり現時点のStreemのソースファイル(の一部)の読み解き方を示します。具体的には、GitHubのStreemリポジトリにある「lex.l」と「parse.y」という2つのソースファイルについて解説します。
Streemのソースファイルは、https://github.com/matz/streemからダウンロードできます。画面右下にある[Download ZIP]ボタンをクリックしてください。
lex.lとparse.y
ダウンロードしたStreemソースファイルのsrcディレクトリに置かれているlex.l、parse.yの2つのファイルは、普通、特に業務系のプログラミングでは目にすることがない拡張子.lと.yを持っています。しかし、これらは言語処理系のソースには必ず含まれるといってもよいくらいに一般的なソースファイルです。というのは、これら2つのソースが、ある意味ではプログラミング言語の肝――つまり文法と構造を規定するものだからです。
今、あまり目にすることはないだろうと書きましたが、もしかしたら、それは使いみちがないからではなく、単に知らないために使っていないだけなのかもしれません。その点では、拡張子.lと.yのファイルを知ることに大きな意味があります。
幸いStreemはまだ作られ始めたばかりなので、この2つのファイルもごく単純で、初めて読むのにちょうどよいサイズです。また、ソースファイルを1つ読めば、簡単なソースファイルは見よう見まねで書けるようになるものです。
lex.lは字句解析の定義、parse.yは構文解析の定義
Streemで記述されたプログラムを実行するためには、プログラムのソースコードをコンパイルする処理系[1]が必要です。Streemの処理系はstreemといいます。
[1] 処理系とは、プログラムのソースコードを読み込んで実行可能な形式に変換し、実行するあるいは実行ファイルを生成するプログラムを意味します。また、本記事では、実行可能な形式に変換する処理を「コンパイル」と呼ぶことにします。
streemに限らず、プログラミング言語の処理系がソースコードをコンパイルする場合には、通常、次の手順を取ります。
1. 字句解析
プログラミング言語の文法に則って、ソースコード内の記述を、語(トークン)単位のリストにします。
2. 構文解析
プログラミング言語の文法に則って、1.で作られた語のリストを、後の工程で処理しやすい形式に変換します。
1.の字句解析を行うためのルールを記述したものが、拡張子.lのファイル(Streemではlex.l)です。また、2.の構文解析を行うためのルールを記述したものが、拡張子.yのファイル(Streemではparse.y)です。
構文解析まで終了すると、処理系の内部にはプログラムがデータ(通常は木構造)として保持されます。その後は処理系のタイプによって、データを逐次実行するか(インタープリタ)、データ構造を(仮想マシンを含む)機械語へ変換しファイルへ出力したり、内部の仮想マシンで実行したりすることになります。
ここで説明したことに関連する書籍にはコンパイラの教科書から特定処理系の説明書までいろいろな種類がありますが、ここでは次の2冊を紹介します。
『Rubyのしくみ -Ruby Under a Microscope-』
(Pat Shaughnessy 著、島田浩二、角谷信太郎 訳、オーム社刊、ISBN:9978-4-274-05065-7)
Ruby言語処理系が内部でどのようにRubyのソースファイルを処理しているかを説明した本。
『コーディングを支える技術 ~ 成り立ちから学ぶプログラミング作法』
(西尾泰和 著、技術評論社刊、ISBN:978-4-7741-5654-5)
プログラミング言語とその処理系を構成する種々の概念と技術を解説した本。