RailsがRubyで作られた本当の理由
2007.10.06
弾:最初の質問です。なぜRubyを選んだのですか?
DHH:極端なことを言うと,Rubyが一番美しく自分のコードが書けるからです。
【小飼弾のアルファギークに逢いたい♥:#2 Ruby on Rails作者 David Heinemeier Hansson(前編) RubyでRailsを書いたわけ|gihyo.jpより引用】
この記事を既に読んだ方も多いと思うが、この「Rubyが一番美しく自分のコードが書ける」というセリフは非常に重要である。「イテレータに片思い」というエントリーで書いた通り、Rubyには生みの親の「コードは読みやすくあるべき」という魂がしっかりと込められており、それが「コードの美しさ」に繋がっているのである。
私がRubyを触り始めて一番強く感じたことは、Smalltalkとの類似点である。私自身、90年に数ヶ月間Smalltalkにどっぷりと使っていた時期があるが(マイクロソフトで「次世代OS」のプロトタイプを作っていたのである)、その時にもっとも感動したのは、Smalltalkが自己増殖型のプログラムを書くことを許してくれることであった。自己増殖型のプログラムとは私の造語であるが、オブジェクト指向型の言語でプログラムがダイナミックにクラスを生成して自分自身を拡張していくスタイルのプログラムである。
「次世代OSはオブジェクト指向で」というかけ声で作り始めたプロトタイプであったが、最初に悩んだのが、WordだとかExcelなどのアプリケーションが作るアプリケーション独自のファイルタイプをどう扱うか。WindowsのRegistryのように独自のデータベースを作るのも一つの方法であったが、そうするとシステムレベルでのクラスと、アプリケーションレベルでのクラスという二つの異なるクラス空間ができてしまう。そこがいやだった私は、新しいアプリケーションが登録されるごとに、ファイルタイプに相当するシステムレベルのクラス(例えば、WordにはWordFile、ExcelにはExcelFile)をダイナミックに生成し、そこにコンテキスト・メニュー(ファイルを右クリックしたときに表示されるポップアップ・メニュー)に表示すべきコマンドをmethodとして登録する、という技を使うことにより、クラスを一元化したのである(残念なことにそれを商品化したWindow95はC++で作ったために、そんな技は使えなかったが、私としては未だにSmalltalkで作ったプロトタイプの方がアーキテクチャ的には美しかったと思っている)。
で、Rubyに話を戻すと、私がRubyに感じたSmalltalkとの類似点とは、まさにこの「自己拡張型のプログラミング」を可能にする点である。RailsのActiveRecord上でのプログラムがあれほどナチュラルに美しく書けるのは、RailsがこのRubyの柔軟性を最大限に活用し、データベースのテーブルのスキーマを読み込んでそれに対応するクラスをダイナミックに生成しているからに他ならない。
つまり、RubyなりSmalltalk上でのプログラムの「美しさ」が最も強く発揮されるのは、プログラマーにとって「こう書ければ美しくなる」と思えるようなクラスのハイアラキーをフレームワーク自身が自動生成してくれる時である。Railsがこれほど高く評価されるのは、まさにそんなフレームワークだからなのである。逆の言い方をすれば、こんなフレームワークを作るにはC++やJavaやPerlやPHPでは無理で、Railsを作るにはRubyかSmalltalkを使うしかなかったのである。
Lisp はどうでしょうか?
私は、 Ruby や Rails からは Lisp の エッセンスを強く感じてしまうのですが・・・
毎回、楽しく読んでいます。
Posted by: Yuumi3 | 2007.10.06 at 18:29
こんにちは。
あ、僕も1996年頃に、オブジェクト指向の真髄を学ぶという名目で、Smalltalkやったことあります。組み込みの型が存在せず、全てがクラスという世界は斬新でした。数値クラスの operator + の中身を引き算に変えてみたり・・しかし、書籍や情報がすごく乏しくて、苦労した覚えがあります。
Smalltalkという言葉が懐かしかったのでつい・・ではでは。
Posted by: Dora | 2007.10.06 at 18:59
やはりRailsで大事なのは、Rubyがメタ言語的な機能を持っている所だと思います。
PHPやjavaでRailsっぽいフレームワークがあるがどうかと、良く聞かれるのですが、言語で言語を記述できるメタ言語の機能が高くないと、Railsの様な素直な書き方をするフレームワークは実現できないと思います。
Rubyの柔軟性で最近びっくりしたのは、このライブラリ。a +-+ bみたいな新しい演算子を定義できます。
http://www.rubyist.net/~matz/20070831.html#p03
ライブラリ自体はちょっと前に見つけてたのですが、Matzが解説してくれて、ようやくどうやって作られているのか理解できました。
Posted by: masuidrive | 2007.10.06 at 19:41
Railsにかなり影響されたPerlのCatalystはRailsの次にRailsっぽい書き方が
(しようと思えば)できるフレームワークだと思います。
自由度が高すぎる面はありますが、自由度を多少犠牲にすればRailsと同じくらい
素直な書き方ができるフレームワークにすることは容易です。
(最初から相当素直な書き方ができるRailsは凄いと思いますが)
Posted by: Perl使い | 2007.10.07 at 06:40
Smalltalk や Lisp には構文が(ほとんど)無いから自己拡張型と主張しやすいだろう.関数またはメッセージパッシングを定義しさえすればいいし,あとは評価の遅延の仕組みさえあればいい.Ruby がえらいのは,構文があるにもかかわらずそのようなことがしやすい,というのが主張したいのか?巧妙な構文糖衣こそが Ruby?
Posted by: anon | 2007.10.07 at 11:37
楽しく拝見させていただいております。
自己増殖型プログラミングに関しては、Javaのリフレクションを用いた研究が多くあり、OSの開発もいくつかあったと思います。
Smalltalk では、現ソニーに横手氏が発表したOSのカーネルがあり、その後Aperios が有名になりました(結局、メーカでは組み込みOSにしか使うことができず、当時では自己増殖の部分は省かれてしまったようですが、その哲学は面白いと思います)。現在では、さらにCPUパワーがアップしたので、もう一度自己増殖型のOSについて議論(実際のOSを目指して)してみるのもよいと思います。
Posted by: やす | 2007.10.09 at 01:09