Rubyの実装とサンプル・コード

 Rubyプログラムを解釈する言語処理系としては,私の作ったインタプリタが最も一般的です(別掲記事「Ruby誕生の秘密」を参照)*19。このインタプリタの特徴は3つあります。

○C言語による拡張が容易
○ダイナミック・ローディング
○ポータブル

 インタプリタ形式なので,記述したプログラムを即座に実行できます。処理性能上の問題に突き当たった場合や,既存のライブラリへのインタフェースが必要な場合は,C言語で記述したライブラリを使って問題を解決できます。

 ライブラリをDLLにしておき,実行時に動的にロードすること(ダイナミック・ローディング)もできます。

 このインタプリタは,Linuxをはじめとする各種UNIX系OSや米Digital Equipment社のVMS,BeOS,Mac OS X,Windows上で動作します(ポータブル)。NECのSX-3や米Cray社のスーパーコンピュータ上で動作したという報告もあります。

 私のインタプリタは,Rubyの唯一の実装ではありません。別の実装として,Javaで記述されたJRuby(http:// jruby.sourceforge.net/)があります。Javaのライブラリとの相互運用性などを重視した実装になっています。

Rubyで記述したプログラム

 Rubyの雰囲気をつかんでもらうため,いくつかのサンプル・プログラムを紹介します。文法などについてはほとんど紹介していませんが,だいたいの働きはつかめるのではないでしょうか。

 図5は,Rubyに標準で付属するネットワーク・サーバー・ツールキットWebrickを利用して実装したHTTPサーバーです。短いコードでフル機能のHTTPサーバーが実装できています。

require "webrick"


httpd = WEBrick::HTTPServer.new(
:DocumentRoot => File::dirname(__FILE__),
:Port => 8080
)
trap(:INT){ httpd.shutdown }
httpd.start
図5●Rubyで記述したHTTPサーバー
標準のネットワーク・サーバー・ツールキットであるWebrickを用いた。

 図6は,RubyのTk*20インタフェースを使った簡単なGUIアプリケーションです。アプリケーションを実行すると写真1のようなウインドウを表示します。上の「hello」ボタンを押すと標準出力に"hello"という文字列を出力し,下の「quit」というボタンを押すと終了するというものです。

require "tk"

TkButton.new(nil,:text => 'hello',
:command => proc{print "hello\n"}).pack(:fill=>'x')
TkButton.new(nil,:text => 'quit',:command =>
proc{exit}).pack(:fill=>'x')
Tk.mainloop
図6●Rubyで記述したGUIアプリケーション
Tkインタフェースを利用した。

写真1●図6の出力結果
写真1●図6の出力結果
ダイアログ用ウインドウが表示されている。

 図7は,竹内関数*21と呼ばれる関数呼出しのベンチマークに用いられる関数のコードです。Rubyではdefという予約語を使って関数(メソッド)を定義すること,特にオブジェクト指向っぽい外見ではないコーディングが可能であることがはっきり分かるでしょう。

def tak(x, y, z)

if y >= x
z
else
tak(tak(x - 1, y, z),tak(y - 1, z, x),
tak(z - 1, x, y))
end
end
print tak(18, 12, 6)
図7●竹内関数のコード
関数定義の例を示した。

 いまやRubyで記述されたプログラムはそれこそ星の数ほどあるのですが,その中でも印象的なものをいくつか紹介しておきましょう。

○tDiary
 tDiary(http://www.tdiary.org/)は,ただ ただしさんが開発したWeb日記システムです。tDiaryはテーマ機能とブラグイン機能に優れているため,広く使われています。

○QuickML
 QuickML(http://www.quickml.com/)は誰でも好きなアドレスのメーリング・リストを作って使うためのシステムです。非常にお手軽で,無料のメーリング・リスト・サービスです。

○Alexandria
 Alexandria(http://alexandria.rubyforge.org/)はGNOMEを使ったGUIベースの蔵書管理システムです。
蔵書管理といえば,「本棚.org」(http://pitecan.com/Bookshelf/)もRubyで書かれています。

○RPGツクールXP
 RPGツクールXPは,エンターブレイン(http://www.enterbrain.co.jp/)が発売するロール・プレイング・ゲーム・ツールキットです。RPGツクールXPは,内部にRubyを組み込んでいるため,RubyによってRPGをプログラムできます。

 自分でコードを書かれる方は,RubyのWebサイトが役立ちます。Rubyについて書かれた書籍も数多くあります*22

Ruby誕生の秘密

 今ではオブジェクト指向言語として世界中に知られるようになったRubyですが,開発を始めた1993年にはとてもそのようなものになるとは想像もできませんでした。

 1993年2月のある日,私は勤務先の同僚と雑談していました。ちょうどそのころオブジェクト指向を解説する書籍を書こうとしていた同僚は,「言語を作りながら学ぶオブジェクト指向」というテーマは書籍として今までにない切り口ではないだろうかと話していました。

 オブジェクト指向言語の実装を見ることで,オブジェクト指向の本質をより良く理解できるのではないだろうかというアイディアだったのです。

 私は昔から自分で言語を設計したいと考えていましたから,彼の話に乗りました。ちょうどそのころ,Perlのような便利なオブジェクト指向言語があれば,とても使いやすいものになるのではないだろうか,とも考えていたからです。

 2人の思惑は一致し,新しいオブジェクト指向言語の設計が始まりました。しばらくして,その書籍の企画はあえなくボツになりましたが,一度動きはじめた「言語実装計画」はくじけることなくひっそりと続けられて,数年後に今皆さんが知るRubyとして,インターネットに公開されたのでした。オープンソース・ソフトウエアとして一般に公開したのはちょうど10年前にあたる1995年のことです。

 それから10年,ネットを通じてRubyに興味を持ってくださった多くの人々の協力も得て,Rubyは少しずつ成長し,海外のユーザーも得て,ここまで来ることができました。ネットワークを通じた協同作業がなければ今のRubyはなかったと思います。これまでの10年,Rubyはさまざまな人々のさまざまなニーズに応えてきました。これからも読者の皆さんを含む多くの人のツールとしてお役に立てればと考えています。

 これからもRubyをよろしく。