Pat Shaughnessy:Ruby のしくみ

作成日 : 2023-03-09
最終更新日 :

概要

「序文」から引用する。

もし 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 版
ISBN978-4-274-05065-7
その他越谷市立図書館で借りて読む
NDC

まりんきょ学問所Rubyの浮き輪 > Ruby のしくみ


MARUYAMA Satosi