まつもとゆきひろ氏自身による「Ruby入門」をお届けします。日経Linuxの連載開始前の特別企画(2005年4月号)として,Rubyが他のスクリプト言語やオブジェクト指向言語とどこが違うのか,なぜ便利なのかを中心に解説してもらったものです。

 こんにちは,はじめまして。まつもと ゆきひろと申します。ひょんなご縁から本誌で講座を書かせていただくことになりました。「日経LinuxではまだRuby*1を取り扱ったことはありませんから,紹介から始めてください」と依頼されました。

 そういえば,Rubyの紹介記事を見る機会は少ないかも知れません。1993年にRubyの開発を始めてからもう12年になり,Rubyについて知っている人はずいぶん増えました。しかし,あらためて紹介記事を書くという機会はほとんどないものです。少し調べてみたら,雑誌に「Rubyの紹介記事」が載るのは2002年以来のようです。

 せっかくの機会ですので,「2005年のRuby 紹介」記事を書かせていただこうと思います(別掲記事「言語設計者の憂鬱」を参照)。

Rubyはオブジェクト指向に基づく

 Rubyは「オブジェクト指向*2スクリプト言語」です。主な適用分野はテキスト処理,システム管理,ネットワーク・プログラミングなど,極端に実行効率を追求する数値計算のような分野を除けばあらゆる領域のプログラミングに利用できます。最近では,Webアプリケーションの開発に広く利用されており,商用サイトを含めて数多くの利用例があります。具体的な例については,この記事の後ろの方で紹介します。

 Rubyと同じ分野を対象にする,いわゆるスクリプト言語*3はたくさんあります。代表的なものとしてはPerl,Python,PHP*4などがあります。これらの言語と比べると,Rubyの特徴は「本格的なオブジェクト指向言語である」という点だと思います。「本格的」とはまたずいぶん主観的な表現ですが,以下の4つの意味を持っています。

○オブジェクト指向プログラミングに必要な機能をすべて備える
○多重継承*5に代わるMix-in機能*6を持つ
○数値など基本的なものも含めて,すべてのデータがオブジェクト(いずれかのクラスのインスタンス)である*7
○言語の実行モデルそのものがオブジェクト指向をベースにしており,プログラムの「意味」がオブジェクト指向の文脈で定義されている

 ただし,Rubyが本格的なオブジェクト指向言語であるからといって,オブジェクト指向を理解しないと使えないというわけではありません。Rubyでも,表面的には通常の手続き型言語*8と同様のプログラミングが可能です。オブジェクト指向プログラミングの原則を理解すると,より使いやすいということです。

 オブジェクト指向以外の特徴としては以下のようなものがあります。

○型宣言が不要
○簡潔な文法
○ブロックが使える
○強力なクラスライブラリ
○組み込みセキュリティ・チェック

 これらの特徴を一つひとつ紹介します。

型宣言が不要

 JavaやC++などのプログラミング言語とは異なり,Rubyには変数や式に型がありません。変数を使う前に型を宣言する必要もありません。しかし,Rubyは型という概念は持っています。それぞれのデータ(オブジェクト)が型を知っているので,わざわざ宣言する必要がないのです。

 変数や式の型がプログラム中に明示されているものを「静的型言語」と呼びます(図1)。「静的」というのは「プログラムの字面だけを見て型が分かる」という意味です。

class TypeTest {
public static void main(String args[]) {
int i;
i = 6; // iは整数
i = i / 2; // 計算結果も整数
i = "abc"; // 文字列を代入するとコンパイル・エラー
}
}
図1●静的型言語のコード例
Java言語のコードを示した。

 型が合わない場合にはコンパイル・エラーになりますから,単純な間違いはコンパイル・エラーとして発見できます。

 一方,Rubyのようなプログラム中では変数や式に型が指定されておらず,実行してみて初めて分かるのです。このような言語を「動的型言語」と呼びます(図2)。

i = 6 // iに整数を入れる
i = i / 6 // 計算結果を代入する
i = "abc" // 文字列の代入も可能
puts i.size // 文字列の長さを求める
i = [1,2,3] // 配列の代入も可能
puts i.size // 配列の長さを求める
図2●動的型言語のコード例
Rubyのコードを示した。

 動的型言語では,同じ変数でも状況によって違う型のデータが格納される可能性があります*9。ですから,プログラム中に型の不整合があっても,実行するまでは見付けることはできません。しかし,変数の「中身」そのものが型を知っていますから,実行時には型の不整合を発見できます。

 図2を見ると,iという変数が文字列を指しているときに長さを求める方法(4行目のputs i.size)と,配列を指しているときに長さを求める方法(6行目)が全く同じことが分かります。これは文字列と配列の「長さを求める方法」がsizeという名前でそろえてあるためです。

 このsizeのような「何らかの処理を進める方法」のことを「メソッド」*10と呼び,同じような処理を進めるためには同じような名前のメソッドを呼べば良いようにそれぞれのデータが設計されています。

 このようなデータ型が違っても同様に処理できる性質を「ポリモーフィズム」や「多態性」と呼び,オブジェクト指向プログラミングの本質となっています。

 元々オブジェクト指向プログラミングの世界ではRubyのような動的型が基本でした。いわばオブジェクト指向言語の源流であるSmalltalk*11も動的型言語でしたし,オブジェクト指向プログラミングの発展に重要な役割を果たしたLispも動的型言語です。広く使われるオブジェクト指向言語であるJavaやC++が静的型言語なので,動的型言語によるオブジェクト指向プログラミングはしばらくの間あまり注目されてこなかったのですが,最近になってまた再び脚光を浴びるようになってきました。Rubyをはじめとするスクリプト言語の発展も関係しているかもしれません。