関連サイト
本書の関連ページが用意されています。
内容紹介
本書は、Rubyインタプリタを題材にプログラミング言語処理系の仕組みを解説するNo Starch Press社の“Ruby Under a Microscope” の翻訳発行です。
VMベースのインタプリタ型言語処理系であるRubyがコードをどのように解釈し、どうやって実行するか、そのしくみを解説。Rubyについての基礎知識がなくても、図版と短いコードの実験を多用した構成により、そのしくみについて理解することができます。
実務でRubyは使えるけれど、基礎知識について自信がない人や、学びたくてもまとまった時間がとれずに悩んでいる人などもっとRubyを活用するためにRubyを知りたい人に最適。
日本語版には、Rubyの開発者であるまつもとゆきひろ氏の序文とYARVの開発者である笹田耕一氏の付録が加筆されています。
言語処理系が動作する仕組みを学びたいと考えている方、Rubyに興味があるプログラマの方、アプリケーションの動作基盤であるrubyが動く仕組みを理解したいと思うものの、コンパイラの教科書はハードルが高いと考えているRailsユーザの方などへ、お勧めの内容です。
書誌情報
- 著者: Pat Shaughnessy(著), 島田浩二, 角谷信太郎(訳)
- 発行日: 2015-02-10 (紙書籍版発行日: 2014-11-28)
- 最終更新日: 2015-02-10
- バージョン: 1.0.0
- ページ数: 408ページ(PDF版換算)
- 対応フォーマット: PDF
- 出版社: オーム社
対象読者
言語処理系が動作する仕組みを学びたいと考えている方、Rubyに興味があるプログラマの方
著者について
Pat Shaughnessy
Pat Shaughnessy はコンサルティング会社マッキンゼー・アンド・カンパニーで働くRuby プログラマ。もともとはMIT で物理学を専攻していた。その後は20年以上をソフトウェア開発者として過ごしてきた。使用してきた言語はC、Java、PHP、Ruby をはじめ多数。本書の執筆では、Ruby の調査に彼のわずかな科学的トレーニングが活かされている。彼は流暢なスペイン語を扱え、スペイン北部にある妻の実家を頻繁に訪問している。現在は妻と2 人の子どもと一緒に、ボストン郊外で暮らしている。
島田浩二
札幌在住のRubyist。株式会社えにしテックの創業者、代表取締役社長。Ruby ともっと仲良くなりたくて2007 年にRuby 札幌を始め、気がつくと人生が変わっていた。2011 年からは、一般社団法人日本Ruby の会の理事も務めている。訳書・著書に『なるほどUnix プロセス― Ruby で学ぶUnix の基礎』(共訳、達人出版会)、『Ruby 逆引きレシピ』(共著、翔泳社)、『プロダクティブ・プログラマ― プログラマのための生産性向上術』(監訳、オライリー・ジャパン)などがある。趣味は歩くことと本を読むこと。
角谷信太郎
株式会社永和システムマネジメントフェロー。一般社団法人日本Ruby の会理事。Asakusa.rb 幹部(自称)。著書は『なるほどUnix プロセス― Ruby で学ぶUnixの基礎』(翻訳、達人出版会、2013)、『アジャイルサムライ―――達人開発者への道』(監訳、オーム社、2011)、『アジャイルな見積りと計画づくり~価値あるソフトウェアを育てる概念と技法~』(翻訳、毎日コミュニケーションズ、2009)など。エクストリームプログラミングの理念である「新たな社会構造」の実現のために自分がやれることをやっている。Web 日記:http://kakutani.com/
目次
日本語版序文
序文
謝辞
はじめに
第1章 字句解析と構文解析
- 字句解析:Rubyを構成する言葉
- 実験1-1:Ripperを使ってさまざまなRubyスクリプトを字句解析する
- 構文解析:Rubyはコードをどのように理解するか
- 実験1-2:Ripperを使ってさまざまなRubyスクリプトを構文解析する
- まとめ
第2章 コンパイル
- Ruby 1.8 にコンパイラはない
- Ruby 1.9 以降はコンパイラを導入する
- 単純なスクリプトをRubyはどうコンパイルするか
- ブロック呼び出しのコンパイル
- 実験2-1:YARV 命令を表示する
- ローカルテーブル
- 実験2-2:ローカルテーブルを表示する
- まとめ
第3章 Rubyはどのようにコードを実行するか
- YARVの内部スタックとRubyのコールスタック
- 実験3-1:Ruby 2.0/Ruby 1.9 とRuby 1.8 のベンチマーク比較
- Ruby変数のローカルアクセスと動的アクセス
- 実験3-2:特殊変数を調査する
- まとめ
第4章 制御構造とメソッドディスパッチ
- Rubyがどうやってif 文を実行するか
- あるスコープから別のスコープへジャンプする
- 実験4-1:Rubyがループを内部でどう実装しているかをテストする
- send 命令:Rubyで最も複雑な制御構造
- 通常のメソッド呼び出し
- 組み込みメソッド呼び出し
- 実験4-2:Rubyがキーワード引数をどう実装しているかの調査
- まとめ
第5章 オブジェクトとクラス
- Rubyオブジェクトの内側
- 実験5-1:新しいインスタンス変数を保存するのにどれくらい時間がかかるか?
- RClass 構造体の内側は何
- 実験5-2:Rubyはクラスメソッドをどこに保存する?
- まとめ
第6章 メソッド探索と定数探索
- Rubyがモジュールをどう実装しているか
- Rubyのメソッド探索アルゴリズム
- 実験6-1:インクルードした後でモジュールを変更する
- 定数探索
- Rubyにおけるレキシカルスコープ
- 実験6-2:Rubyはどの定数をはじめに見つけるのか?
- まとめ
第7章 ハッシュテーブル:Ruby内部の働き者
- Rubyにおけるハッシュテーブル
- 実験7-1:さまざまなサイズのハッシュテーブルから値を取り出す
- ハッシュテーブルを拡張して、より多くの値を格納する仕組み
- 実験7-2:さまざまなサイズのハッシュに新しい要素を1つ追加する
- Rubyはハッシュ関数をどう実装しているか
- 実験7-3:ハッシュのキーとしてオブジェクトを使用する
- まとめ
第8章 Lisp から借用したアイデア
- ブロック:Rubyにおけるクロージャ
- 実験8-1:whileループとeachにブロックを渡すのとどちらが速いか
- ラムダとProc:関数を第一級市民として扱う
- 実験8-2:ラムダを呼び出した後でローカル変数を変更する
- まとめ
第9章 メタプログラミング
- メソッドを定義する別のやり方
- 実験9-1:わたしは誰? レキシカルスコープを使うとselfはどう変わるか
- メタプログラミングとクロージャ:eval、instance_eval、binding
- 実験9-2:メソッドを定義するためにクロージャを使う
- まとめ
第10章 JRuby:JVM上のRuby
- MRIとJRubyでプログラムを実行する
- 実験10-1:JRubyのJITコンパイラを観察する
- JRubyとMRI における文字列
- 実験10-2:コピー・オン・ライトの性能を計測する
- まとめ
第11章 Rubinius:Rubyで実装されたRuby
- Rubiniusカーネルと仮想マシン
- 実験11-1:MRIとRubiniusのバックトレースの比較
- RubiniusとMRIの配列
- 実験11-2:RubiniusのArray#shiftの実装を調査する
- まとめ
第12章 MRI・JRuby・RubiniusにおけるGC
- ガベージコレクションは3つの問題を解決する
- MRIにおけるガベージコレクション:マークスイープ
- 実験12-1:MRIのガベージコレクションを実際に見ていく
- JRubyとRubiniusにおけるGC
- コピーGC
- 世代別GC
- 並行GC
- 実験12-2:JRubyのVerbose GCモードを使う
参考文献
まとめ
付録A さらにそのほかのRuby仮想マシン
- YARV:Yet Another RubyVM
- YARVの設計方針
- YARVの開発までの経緯
- さらにそのほかのRuby仮想マシン