Rubyのしくみという本を読んでいます。せっかくなので章ごとにまとめ的にメモを公開していきます。
なぜ読もうと思ったのか?
普段からRubyを触っていますが、ふとした時に 「RubyはC言語で書かれているのに、コンパイルが不要なのはなぜだろう?」 という疑問を持つようになりました。
この疑問を解決するためにRuby の内部で何が起こっているんだろう、という事を知りたくて読み始めました。
自分読みたいと思っている章
1, 2, 3, 4, 5, 9, 12章を読む。理由は2点。 目次を見て、これらの章を読めば自分の疑問は解決できるだろうと思っています。
- 図書館から借りているため、時間的制約がある (執筆時点で残り1週間で返却しないといけない)
- 全部読んで理解するには知識が足りないと思っている
事前知識
この本だけでも十分に理解できるとは思いますが、自分は以下の資料を読みました。
第1章メモ
字句解析については、理解できましたが構文解析は難しくてまだまだ難しかったです。
- rubyコマンドを実行してコンソールに出力されるまでに、Ruby
ソースコードは3回のプロセスを経ている
- 3回のプロセスとは
- [Rubyコード]→[字句解析]→[構文解析]→[コンパイル]→[YARV命令]
- 3回のプロセスとは
字句解析
- 字句解析とは?
- ソースコードを読み込んで、トークン列へと変換する
- トークン列とは?
- このあとに文として再構成される単語のこと
- Rubyコードは字句解析でトークン列に変換され、次の構文解析のプロセスに回る
- トークン列とは?
- ソースコードを読み込んで、トークン列へと変換する
本書を読むまでは、一つの単語のまとまりごとに解釈・実行しているんだろうなーという理解でした。
しかし、1字ずつ解析をしていて、それがトークン列に変換されていることは知りませんでした。
Ripperを使って字句解析の雰囲気を味わう
Ripperライブラリ を使うことでRubyコードがどうやって字句解析をやっているかコンソールに出力できる。
require 'ripper'
code = <<STR
10.times do |n|
puts n
end
STR
puts code
pp Ripper.lex(code)
実行結果は以下のようになりました。
[[[1, 0], :on_int, "10", END],
[[1, 2], :on_period, ".", DOT],
[[1, 3], :on_ident, "times", ARG],
[[1, 8], :on_sp, " ", ARG],
[[1, 9], :on_kw, "do", BEG],
[[1, 11], :on_sp, " ", BEG],
[[1, 12], :on_op, "|", BEG|LABEL],
[[1, 13], :on_ident, "n", ARG],
[[1, 14], :on_op, "|", BEG|LABEL],
[[1, 15], :on_ignored_nl, "\n", BEG|LABEL],
[[2, 0], :on_sp, " ", BEG|LABEL],
[[2, 2], :on_ident, "puts", CMDARG],
[[2, 6], :on_sp, " ", CMDARG],
[[2, 7], :on_ident, "n", END|LABEL],
[[2, 8], :on_nl, "\n", BEG],
[[3, 0], :on_kw, "end", END],
[[3, 3], :on_nl, "\n", BEG]]
シンボルで渡されているのがトークンの種類、最後に書いてあるのがトークンの状態を表しています。
本のなかでは、どうやって実行結果のようになるのかが詳しく書かれていました。
構文解析
-
構文解析では、字句解析変換されたトークン列をRuby がわかる文やフレーズにグループ化している
-
RubyはBisonというパーサジェネレータを使っている
- Bisonはトークン列を処理するために使われているわけではない
-
Bison はパーサジェネレータではあるが、直接字句解析には構文解析には関わっていない
- Rubyのビルド時(Rubyインストール時)にパーサコード (parse.c)を生成している
- このパーサコードが字句解析によって変換されたトークン列を解析している
最終的に
構文解析では、最終的に抽象構文木(AST)と呼ばれるデータ構造へと変換される。 本にはこの過程が詳しく書かれていたが、10%くらいしか理解できませんでした。
引用元の明記
本記事は、以下に示す書籍を参考に執筆しました。 https://www.ohmsha.co.jp/book/9784274050657/
著者名: Pat Shaughnessy
訳者名: 島田浩二・角谷信太郎共訳
書名: RubyのしくみRuby Under a Microscope
出版社: オーム社開発局
出版年: 2014年