0046 号 巻頭言

RubyとDSLのこと

Rubyist Magazine 第 46 号をお届けする。

今号は、 Rubyist Hotlinksとは関係なく、US 在住の Rubyist である小崎さんにインタビューした Rubyist インタビュー特別編 小崎資広さん 前編、 Backbone.js と Rails について、るびま読者の方からのリクエストに応えて joker1007 さんが紹介する Backbone.js on Rails 始めの一歩、 gemの作り方を初心者の体験として紹介した Ruby 初心者の新卒エンジニアが gem パッケージ公開に至るまで、 「class << self」という一風変わったイディオムについて詳しく解説する Ruby 初級者のための class « self の話 (または特異クラスとメタクラス)、 Ruby 製のソースコード検索エンジン Milkode について作者のおんがえしさんが説明する(それと突然自分の書いたものが出てきてびびった) Ruby でソースコード検索エンジンの作り方 〜Milkode の内部実装解説〜、 さらには yhara さんからのプレゼント企画 0046 号 読者プレゼントなどとなっている。


今でこそ Ruby と DSL の関係性は自明なように思われているかもしれないが、それはここ 10 年で広まった比較的新しい話である。 Ruby の最初の 10 年間では、そもそも Ruby と DSL について論じている者は特にいなかったと思う。 当時、Ruby は単にオブジェクト指向スクリプト言語であり、何かの言語を表現するためのツールではなかった。 そのような Ruby が、いつの間にか「DSL 向きの言語」と言われるようになった、その過程を少し振り返ってみたい。

DSL について論じるという目的で、本来であれば古典である Kernighan and Pike『UNIX プログラミング環境』や、 「SICP」こと Abelson and Sussman『計算機プログラムの構造と解釈』まで遡るのはやりすぎだろうか。 しかしながら『UNIX プログラミング環境』で yacc まで紹介されているのは、 UNIX 哲学に含まれる「1 つのことを上手にやる小さなプログラムを作り、それを組み合わせる」 という思想を「小さな言語 Little Languages」を作って対応するというポリシーのためと言ってよいだろう (なお「Little Languages」という名前は、Jon Bentley が Communications of the ACM に寄稿したコラム記事のタイトル1に由来するらしい。 Eric Raymond が 21 世紀に書いた『The Art of Unix Programming』では「ミニ言語 Minilanguages」になっている)。 また、SICP で語られる「殆んどのプログラムは, ある言語の評価器と見ることが出来る」という言葉は、 そこから DSL まであと一歩というところまで来ている。

あるいはもう少し最近の書籍で言うと、20 世紀末に出た GoF 本こと『デザインパターン』でも、Interpreter パターンが含まれていることを覚えている方もいるだろう。 DSL に先立つ「小さな言語」という叡智は、ソフトウェア開発の歴史の中で、地味ながらも脈々と語り伝えられてきたのである。

もちろん、Rubyist であれば「小さな言語」の思想を伝える役割を果たした書籍として、Dave and Andy『達人プログラマー』を外すことはできない。 とはいっても、『達人プログラマー』を刊行まもない時期に読んでいた方でも、このような評価は意外に思われるかもしれない。 本書が話題になっていた当時にも、DSL は特に注目されていたわけではなかったからだ。そんなことは書いてあったっけ? と思われても不思議ではない。そのような方は、ぜひとも『達人プログラマー』を改めてひもとき、第2章の「2.11 専用の言語」(Domain Language) をぜひとも読み返していただきたい。「Specific」の語が抜けていても、まさに DSL について語られていることがわかる。達人の道具箱にも、当然のように DSL が入っていたのだった。

『達人プログラマー』もすでに 10 年がたち、ある意味本書も「古典」の仲間入りをしつつある。 何か新しいことが書いてあるというよりは、新しめの何かについてよくよく読んでみればすでに『達人プログラマー』に書かれていたというような、 再読のたびに新たな発見があることに驚く書籍である。 DSL はこのように、本書に隠された再発見されるべき価値の一つなのかもしれない。

……などと書籍で語られた DSL の歴史を逐一振り返っているといくら紙面があってもきりがない。Ruby と DSL の話に戻ろう。

DSL には「外部DSL」と「内部DSL」の2種類ある。ここまで書いてきた中で振られている DSL は、ほとんどのものが外部 DSL を指している。 つまり、「小さな言語」の言語処理系は何かの言語の一部として作られるよりも、小さな(新しい)アプリケーション として作られているものがほとんどだった。

もちろん、とりわけ Lisp・Scheme 方面では内部 DSL が使われていたそうなのだが、 いかんせん S 式がいろんな意味で強力すぎるせいか、S 式常用者以外には広まりづらかったのではないかと思われる。 ユーザが S 式でもりもり書く機会というのは Emacs 等の例外を除いてはあまり普及していなかった。 そのため、DSL 以前の「小さな言語」は、基本的に外部 DSL であった。

そんな中、2003 年の RubyConf で、一つの発表があった。『Building with Rake』である。

http://onestepback.org/articles/buildingwithrake/index.html

今にして思えば、この発表のテーマである Rake と、Appendix(付録)A、「Ruby as an Application Language」こそが、現代的な内部DSL文化の嚆矢であった。

http://onestepback.org/articles/buildingwithrake/appa.html

Rake そのものの初見の印象は、どちらかというと「関数型言語 Make」的な、 興味深いけれどもネタっぽいアイデアに思えた。少なくともこれがこの後の Ruby の文化や、Ruby 以外の言語の文化を大きく変えるようなものになると とてもではないが思えなかった。 言語というか記法に着目してみても、面白そうだしうまくできてはいるけれど、 日常的に使うものにはあまり見えなかった。

とはいえ、RSpec 等やりすぎ感が漂う DSL にも見慣れた今から思えば、Rake は非常に素朴な DSL になっている。 言い換えると、もっとスマートな記法もありえたかもしれない。が、Ruby の最初の本格的 DSL としては、 このようなシンプルなものから始めることが必要だったのだろう。 何にせよ、何か別の文法を埋め込んだりせず、本当に Ruby の文法そのままであるにも関わらず、それがまるで一つの別言語のように見える、 という魔法のような効果は、少なくない人を引きつけることとなった。

Rake のその後の成長について語るのであれば、当然ながら Ruby on Rails を無視できない。 Rails で Rake が使われたことに加え、Rails の各種クラス自体が、Rake 流の DSL スタイルのフォロワーのような DSL 風の体裁が色濃く出ていたことも大きかった。 ゼロ年代の半ばに Rails が颯爽と(いくばくかの煽りも携えて)現れ、Web アプリケーション開発を 様々な角度から大きく変えてしまったことにより、 Rake が始めた内部 DSL の潮流が、Ruby 外にも大きく広まることとなった。 そしてこのことにより、Ruby と DSL が深く結びつくことになったのであった。 Rake の果たした功績は、計り知れないものがある。

この記事を読まれているような方であればすでにご存知の方が多数かと思われるが、 その Rake の作者としても、また数多くの Ruby 内外でのカンファレンス等で発表を重ねた スピーカーとしても知られている、Jim Weirich は先日 57 歳の若さで亡くなられた。 去年の RubyConf 2013 でも、当然のように参加していた Weirich の姿をもう二度と見ることが できないと思うととてもつらい。 彼を RubyKaigi に招待したいよねという話は度々出ていたのだが、 結局実現することなくもはや手遅れになってしまったことは本当に残念で仕方がない。 あの大きな体を揺さぶりながら、響く声で分かりやすく語りかける Weirich を日本の Rubyist たちに紹介できなかったことも、 そして日本の Rubyist たちを Weirich に紹介できなかったことも、心の底から後悔している。

なお、最後に、この文章は Weirich の Ruby 界隈での評価を適切に踏まえているものではないことを記しておきたい。 Weirich の訃報が与えた衝撃は、github で Weirich が最後に手がけていた Wiki(!)、wyriki へのコミット2に残された 1,000 件を超える膨大なコメントからも推し量れる。 Weirich の追悼記事もたびたび見かけたが、そこで書かれていたのは「教師」としての Weirich の側面や、 その温かい人柄といった側面が中心になっていたように思う。 しかしながら、英語圏からは物理的にも文化的にも距離があるこの国では、彼ら・彼女らと同じ気持ちを共有できない。

とはいえ、そのような評価の違い自体は悪いことではないと思っている。 物事の評価は多面的なもので、異なる文化圏からでしか見えないものがあることは良いことであり、 そのようにしか見えないものを評価する視点があることも本来良いことであるはずだ。

片方の世界にどっぷり浸かりながら、もう片方の世界を少しだけ垣間見たことのある者としては、 少なくとも一つの画期的なプロダクトと偉大な文化を私たちに残してくれた僥倖に恵まれたことと合わせて、 その素晴らしい活動に感謝の言葉を記しておきたい。Thank you, Jim. RIP.

(るびま編集長 高橋征義)


  1. http://dl.acm.org/citation.cfm?id=315691 

  2. https://github.com/jimweirich/wyriki/commit/d28fac7f18aeacb00d8ad3460a0a5a901617c2d4