「序文」から引用する。
もし Ruby の内部をハックし始めてみたいのなら、もししっかりと Ruby の振る舞いを理解したいのなら、この本はきみのものだ。
原題は Ruby Under a Microscope
。副題は An illustrated Guide to Ruby Internals
。
私のような Ruby 初心者が読むべきではなかったようだ。
第1章は「字句解析と構文解析」である。字句解析では、parse.y について述べられている。 本書では parse.y は 6500 行くらいあって、そのファイルの 3 分の 2 のあたりに parser_yylex と呼ばれる C 関数があるという。 今調べると、parse.y は 14600 行くらいある。parser_yylex 関数が 3 分の 2 のあたりにあるのはかわらない。 リスト 1-4 やリスト 1-5 も、本書にあるのとは少し変化している。
p.9 以降に、標準ライブラリの Ripper を使う例が出ている。私もやってみたら、少し違う結果が出力された。
> ruby lex1.rb 10.times do |n| puts n end [[[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], (snip)
本書には、上記の結果の各行の末尾の要素 END, や DOT, ARG, BEG などがない。 https://docs.ruby-lang.org/ja/latest/method/Ripper/s/lex.html を見ると、ステート(トークンの状態を表す Ripper::Lexer::State のインスタンス。) であると説明されている。この END や DOT などの意味を知りたいが、どこを見ればいいのだろうか。 たぶん、END は終わり、DOT はドット(そのまま)、ARG は引数、BEG は始まり(BEGin )だと思う。
同じ章には構文解析がある。p.13 に Ruby は Bison という LALR パーサジェネレータを使用する
というキャプションとともに、
本当の水牛(bison)の写真がある。なぜかおかしい。
第2章は「コンパイル」である。リスト 2-8 に puts 2+2 用の YARV 命令列を見る方法がある。これを実行してみた。
> ruby .\puts22.rb == disasm: #<ISeq:@ :1 (1,0)-(1,8)> (catch: FALSE) 0000 putself ( 1)[Li] 0001 putobject 2 0003 putobject 2 0005 opt_plus <calldata!mid:+, argc:1, ARGS_SIMPLE>[CcCr] 0007 opt_send_without_block <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE> 0009 leave
本書とは少し違う。少しずつ進化しているのだろう。
書名 | Ruby のしくみ |
著者 | Pat Shaughnessy |
訳者 | 島田浩二・角谷慎太郎 |
発行日 | 平成 27 年 (2015 年) 2 月 10 日 第1版第2刷 |
発行所 | オーム社 |
定価 | 3200 円(税別) |
サイズ | A5 版 |
ISBN | 978-4-274-05065-7 |
その他 | 越谷市立図書館で借りて読む |
NDC |
まりんきょ学問所 > Rubyの浮き輪 > Ruby のしくみ