golden-luckyの日記

ツイッターより長くなるやつ

『RubyでつくるRuby』の読み方(私論)

本記事は、ラムダノートで発売している『RubyでつくるRuby』を買っていただいた方に「読んで」とお願いするための「私家版、読み方のおすすめ」です。また、この本は当社の本のなかでも過小評価されているところがあると思うので、「気になるけど買ってない」という方に興味を持ってもらうことも目的としています。


本書『RubyでつくるRuby』を買った人にも、まだ買っていない人にも、とにかくまず意識してほしいのですが、この本はRubyの解説書ではありません

じゃあなんの本かっていうと、これは「そもそもプログラミング言語でプログラムを書くって、なに?」という根本的な問いへの取り組み方を教えてくれる本です。

もう一度言いますが、この本はRubyの解説書ではありません。なので、「Rubyを使うつもりはなくて、PythonとかJavaScriptが好き」っていう人や、「それらのプログラミング言語をいままさに勉強している」という駆け出しエンジニア、その段階から抜け出すための次の一歩を探している人、そういう、「Rubyとあんまり関係ない人」にも読んでほしい本です。いやむしろ、そういう人こそが読むべき本だとさえ言いたい。

もう一度繰り返しますが、この本はRubyの解説書ではありません。なので、この本を読んでも、Rubyによるプログラミングには詳しくなれません(Rubyに詳しくなりたい人には『研鑽Rubyプログラミング』がおすすめ)。その代わり、たった100ページちょっとで「(Rubyに限らず)プログラミング言語はどういう仕組みになっているのか」を知る入口に立てます。

というわけで、以降では、Rubyに興味があるかないかに関係なく次のような悩みを抱えている方々が本書をどう読むのがおすすめか個人的な意見を書いてみたいと思います。

「プログラムの書き方がいつまでたっても覚えられない」という人

「プログラミングの勉強をしてる」という人の話を聞いてみると、「やりたいことを解決するための書き方」を覚える努力をしているように見えることがあります。覚える努力をしているわけでなくても、「プログラミングできる」と「プログラムの書き方を知ってること」を半同一視してしまっている人も少なくないのではないでしょうか。

「特定のプログラミング言語でアプリケーションをささっと作れるようになる」ためには、そういう勉強も必要なのは言うまでもありません。でも、そこでちょっと立ち止まってみてほしいのですが、昨今、「特定のプログラミング言語の書き方に詳しい」だけで済むことはそう多くありません。さまざまなプログラミング言語について知る必要があるたびに、「その言語での書き方をたくさん覚える」をがんばるしかないのでしょうか?

これが英語や中国語のような自然言語だと、わりとそういう感じに「特定の言語の使い方を覚える」をがんばるしかないところだと思います。 でもプログラミング言語は、かならずしもそうではありません。多くのプログラミング言語は、それなりに共通する考え方の基盤に沿って作られているので、その考え方を知っているだけで、だいぶ「新しい言語」に対する見え方が変わります。

実を言うと、大学の情報科とかで勉強するのも特定のプログラミング言語の書き方ではなく、そういう「多くのプログラミング言語の作りの背景にある共通する考え方」だったりします。なので、大学で使うような計算機科学の教科書とかを読むと、それを勉強できたりします。でも、教科書を一人で読むのはなかなか大変ですよね。

その点『RubyでつくるRuby』なら、説明を頭から読んで練習問題を一通りやってみることで、そういう計算機科学の教科書に書かれてるような話のさわりを体験できます。この本でつくるのは本物のプログラミング言語Rubyのうちでも「多くのプログラミング言語の作りの背景にある共通する考え方」の部分だけですし、教科書的に退屈な部分は潔くカットしつつ、飲み込みにくい概念にはイラストもたくさん入っているので、なんとか踏ん張って第6章までは読みとおしてみてください。

「どうしてプログラミング言語でプログラムが書けるのかわからなくて夜しか眠れない」という人

プログラミングの入門書にある例題を書き写して「なるほど同じ結果になるな」って確認できたけど、「だから何?」って思ってしまうこと、ありますよね。「"Hello World" を出力しろ」というプログラムを書いて、それをコンピューターで実行したら "Hello World" が出力されるっていうのは、それだけを見ると面白くもなんともありません。

でもよくよく考えてみると、「あるプログラミング言語ソースコードを書くと、それがコンピューターで実行されて結果が出てくる」って、ちょっと不安になるくらい何が起きているのか意味不明じゃないですか? そもそも、「プログラミング言語で書いたソースコード」と、「コンピューターで動くプログラム」は、同じものなんでしょうか? PythonRubyで書くソースコードは違うけど、どちらも「コンピューターで動くプログラム」なんでしょうか?

そういえば、PythonRubyで書いたプログラムを実行するには、pythonとかrubyみたいなコマンドを使います。そういうコマンドで「プログラミング言語で書いたソースコード」を「コンピューターで動くプログラム」にしてる気がしますが、pythonとかrubyみたいなコマンドはどうやって動いてるんでしょうか? っていうか、pythonとかrubyみたいなコマンドはどうやって作られてるんでしょうか?

こういう不思議の連鎖って、いったん躓くとなかなか抜けられず、先に進めなくなりがちですよね。

RubyでつくるRuby』は、そういう「プログラミング言語というものの不思議さ」を直接味わえるようになっています。この本でつくるRuby(の機能縮小版)は、pythonとかrubyみたいなコマンドのように、「プログラミング言語で書いたソースコード」を「コンピューターで動くプログラム」として実行するための機能を持ったプログラムです。しかも「この本でつくるRuby」というプログラミング言語で書いたソースコードも、「この本でつくるRuby」というプログラムで動かせます。

この不思議な関係は、実のところ、現代のコンピューターにおいてプログラムを開発したり実行したりする世界観そのものでもあります。『RubyでつくるRuby』は、わずか100ページちょっとでそこまで辿りつけてしまう本なのです。ぜひ、自分でコードを書きつつ、最後の第9章まで通読してみてください。

プログラミング言語を作ってみたい」という人

しつこく繰り返しますが、この本はRubyの本ではありません。そうはいっても、みなさんが使えるようになりたいプログラミング言語PythonとかJavaScriptかもしれず、残念ながらこの本にはPythonJavaScriptのことは書かれていません。最近ではRubyというプログラミング言語のことを「Webのエンジニア募集でたまに名前を見かけるやつ」くらいにみなしている人もいるような気がします。そういう人にとって『RubyでつくるRuby』は役に立たない本なのでしょうか?

そういう方におすすめなのは、『RubyでつくるRuby』を読みながら『PythonでつくるPython』とか『JavaScriptでつくるJavaScript』を自分でやってみることです。これには次の2つの意味でものすごい教育効果があると思います。

  • それぞれの言語のソースコードの文字列を読み込んで抽象構文木に変換するパーザを自分で書くことになる
  • それぞれの言語の挙動を、とくにRubyとの対比で、いま以上によく知れる

1つめの話は、本書を読むだけでは手が出ない話題なので、これは上級コースになります。でも、裏を返すと、本書はそういう上級コースの人でも楽しめる内容だとも言えます。

さらに、「この本でつくるRuby」を拡張していろいろな実験をしてみるのもおすすめの上級コースです。たとえば著者本人の手で漸進型が導入された拡張が作られたりしています。Rubyといえば動的型付き言語なので、これはもはやRubyではありません。でも、そんな感じで「Rubyよりむしろプログラミング言語そのものに興味があるすべての人」にとっておすすめの本が『RubyでつくるRuby』なのです。


最後に、『RubyでつくるRuby』がRubyに興味のない人にとっても価値がある本であるにもかかわらずRubyを題材として採用している理由についても触れておきましょう。これは、本書の著者である @mametter 氏の強みがRubyだからです。

しかし、著者はRubyしか知らない人ではありません。C言語のある種のプログラムに関しては世界の第一人者で、なんなら「"Hello World" のように自明なアプリケーションではないコードを書くのに使ったプログラミング言語の数」でも世界でトップクラスに入るような人です。このことからも、本書がRubyの入門というわけではなく、プログラミング言語そのものという泥沼トピックへの入口として書かれた本であることがうかがい知れるでしょう。