SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

Ruby開発者・まつもとゆきひろ氏の新言語「Streem」のソースコードを読んでみよう! ~ 文法と構造を規定する「lex.l」と「parse.y」


  • X ポスト
  • このエントリーをはてなブックマークに追加

 2014年末、Rubyの開発で知られるまつもとゆきひろさんのGitHubに、新しいリポジトリが作られていることを誰かが見つけました。このリポジトリは、現在まつもとゆきひろさんが『日経Linux』誌上で執筆されている連載「作りながら学ぶプログラミング言語」用の新言語Streemのものだと明らかにされています。

  • X ポスト
  • このエントリーをはてなブックマークに追加

 まつもとさん自身によるStreemについての解説は、今後日経Linuxで順次掲載されるようです。まつもとさんがStreemについて解説する内容は、おそらく、プログラミング言語設計に関する高レベルなものとなるのではないでしょうか。

 本記事はそれとは無関係に、2015年1月に公開されているStreemについての低レベルな解説、つまり現時点のStreemのソースファイル(の一部)の読み解き方を示します。具体的には、GitHubのStreemリポジトリにある「lex.l」と「parse.y」という2つのソースファイルについて解説します。

 Streemのソースファイルは、https://github.com/matz/streemからダウンロードできます。画面右下にある[Download ZIP]ボタンをクリックしてください。図1:[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)
プログラミング言語とその処理系を構成する種々の概念と技術を解説した本。

次のページ
字句解析

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

arton(アートン)

専門は業界特化型のミドルウェアやフレームワークとそれを利用するアプリケーションの開発。需要に応じてメインフレームクラスから携帯端末までダウンサイジングしたりアップサイジングしたりしながらオブジェクトを連携させていくという変化に富んだ開発者人生を歩んでいる。著書に『Ruby③ オブジェクト指向とはじめての設計...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8409 2015/01/27 08:41

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング