Ruby
Rubyは1993年に開発を開始し、1995年にまつもとゆきひろさん(Matz)が公開した日本生まれのプログラミング言語です。設計の軸は「プログラマーの幸福(Programmer Happiness)」。コンピュータの都合より人間の書きやすさを優先した設計は、日本発の言語が国際標準(ISO/IEC 30170)に認定される結果をもたらしました。
名前の由来
言語の名前「Ruby(ルビー)」は、宝石のルビーから取られています。先行する言語 Perl(パール=真珠)にちなんだ命名です。Perl の次の世代を担う言語として、同じ宝石の名前を選びました。名前のルールも、設計者が持つ遊び心の表れです。
まつもとゆきひろさんは 1990 年代前半から複数の言語を日常的に使い、「なぜこれほど書きにくいのか」という不満を抱き続けていました。Perl の表現力は好きだが文法が複雑すぎる、Python は整然としているが楽しくない — そういった観察の先に、「自分が使いたい言語を作ろう」という決断がありました。
1993〜1995年: Rubyの誕生
1993 年 2 月 24 日、まつもとゆきひろさんは仕事の合間に Ruby の開発を始めました。この日付は後に Ruby の誕生日として記念されています。
開発環境は NECの PC-9800 シリーズ上の MS-DOS でした。設計にあたってまつもとゆきひろさんが参照した言語は多岐にわたります。
| 影響を受けた言語 | Rubyが受け継いだもの |
|---|---|
| Perl | テキスト処理の強力さ、正規表現の組み込み、「TMTOWTDI(やり方はひとつじゃない)」の精神 |
| Smalltalk | 全てがオブジェクトという純粋なオブジェクト指向。数値にもメソッドを呼べる設計 |
| Lisp | ブロックとクロージャの考え方 |
| CLU | ブロック付きメソッド呼び出し(イテレータ)の原型 |
| Eiffel | 契約による設計の概念(命名規約に痕跡がある) |
1995 年 12 月、Ruby 0.95 がネットニュースで公開されました。その後まもなく Ruby 1.0 が公開され、日本語のメーリングリスト(ruby-list)を中心にコミュニティが形成されていきました。
まつもとゆきひろさんの設計思想
Ruby の設計哲学で最もよく知られるのは 「最小限の驚き(Principle of Least Surprise)」です。ただし、まつもとゆきひろさん本人が強調するのは「自分(Matz)にとって驚きが少ないこと」です。「全プログラマー共通の驚き」ではなく、設計者自身が自然だと感じる挙動を選ぶという意味です。
もう一つの軸は 「プログラマーの幸福」です。まつもとゆきひろさんは「コンピュータは人間の奴隷であるべきで、その逆ではない」という立場から、型宣言の省略、括弧の省略可能な文法、複数の書き方の許容を設計の中核に据えました。
| 設計原則 | 具体的な現れ |
|---|---|
| 最小限の驚き | 配列の要素数は length でも size でも取得できる(どちらか一方しか使えないと「驚き」が生じる) |
| 人間中心 | 型宣言不要、括弧省略可、複数の書き方を許容 |
| 全てはオブジェクト | 42.times のように数値にもメソッドを呼べる |
| 楽しさは生産性 | 書いていて楽しい言語はミスが減るという考え方 |
言語の系譜と影響
Ruby は単独で生まれたわけではなく、1960〜90 年代に存在した複数の言語の長所を観察し、それを統合する形で設計されました。
| 派生・関連 | 位置づけ |
|---|---|
| Ruby on Rails | 2004年にDavid Heinemeier Hanssonが公開したWebフレームワーク。Rubyの普及に最も貢献 |
| JRuby | Java 仮想マシン(JVM)上で動く Ruby 実装。Java ライブラリと連携可能 |
| mruby | まつもとゆきひろさんが主導した組み込み向けの軽量 Ruby 実装 |
| Crystal | Rubyにインスパイアされた静的型付けコンパイル言語(Ruby との互換性はない) |
マイルストーン
| 年 | 出来事 |
|---|---|
| 1993 | まつもとゆきひろさんが Ruby の開発を開始(2月24日) |
| 1995 | Ruby 0.95 をネットニュースで公開。Ruby 1.0 リリース |
| 1999 | 英語での情報発信が本格化。英語メーリングリスト ruby-talk 開設 |
| 2004 | Ruby on Rails 公開。Web フレームワークとして急速に普及 |
| 2007 | Ruby 1.9 リリース。YARV(Yet Another Ruby VM)導入で実行速度が向上 |
| 2012 | ISO/IEC 30170:2012 として国際標準化。日本人設計の汎用言語として初の認定 |
| 2013 | Ruby 2.0 リリース(20周年記念)。キーワード引数、Refinements の導入 |
| 2020 | Ruby 3.0 リリース。JIT コンパイラ、Ractor、RBS の 3 本柱 |
| 2023 | Ruby 3.3 リリース。YJIT を本格採用、パーサーを Prism に刷新 |
同時代の言語との比較
Ruby が登場した 1990 年代中盤から 2000 年代にかけて、動的型付けのスクリプト言語が複数登場しました。
| 言語 | 公開年 | 設計の主眼 | Rubyとの違い |
|---|---|---|---|
| Perl | 1987 | テキスト処理・Unix ツール | 文法が複雑で「やり方はひとつじゃない」を極めた。Ruby はそこから表現力だけを引き継ぎ、整頓された |
| Python | 1991 | 読みやすさ・教育 | インデントで構造を表し「唯一の正しい書き方」を推奨。Ruby は複数の書き方を許容する方向 |
| Ruby | 1995 | プログラマーの幸福 | 書いていて楽しいことを最優先。「最小限の驚き」と全てがオブジェクトが特徴 |
| PHP | 1995 | Web 向け手続き型スクリプト | HTML への埋め込みが容易。Web バックエンドに特化した実用主義 |
現代での使われ方
Ruby は Web バックエンド開発で広く使われています。特に Ruby on Rails を用いた開発は、スタートアップやプロトタイピングの場面でよく採用されます。GitHub、Shopify、Basecamp、Cookpad といったサービスが Rails で構築されました。
また、まつもとゆきひろさんが主導する mruby は組み込みシステム向けの軽量実装として、IoT 機器や組み込み Linux 環境で使われています。
Ruby 3.x での JIT 導入・YJIT の本格採用・Ractor による並行処理の強化によって、パフォーマンスと並行性への対応が進んでいます。
よくある誤解
「Ruby は Rails のためだけに存在する」
Ruby on Rails の普及により「Ruby = Rails」のイメージが強まりましたが、Ruby は Rails がなくても成立する汎用言語です。CLIツール、自動化スクリプト、組み込みシステム(mruby)、DSL(ドメイン固有言語)設計など、Rails 以外の用途でも使われています。
「最小限の驚き = 全員の直感に合う」
まつもとゆきひろさん自身が説明しているように、「最小限の驚き」は設計者(Matz)本人の直感を基準にした原則です。他の言語に慣れたプログラマーには、Ruby の挙動が直感に反することもあります。万人共通の「驚かない設計」ではありません。
「Ruby は遅い」
Ruby 1.8 世代(YARV 導入前)の評価が「Ruby = 遅い言語」という印象を定着させました。Ruby 1.9 以降の YARV 導入、Ruby 3.x での YJIT 採用(MRI の 1.5〜3 倍以上の速度向上が報告されている)により、性能は大きく改善されています。
関連用語
| 用語 | 説明 |
|---|---|
| Ruby on Rails | Ruby 製の Web アプリケーションフレームワーク。2004年に David Heinemeier Hansson が公開 |
| Matz | まつもとゆきひろさんのハンドルネーム。Ruby の設計者・BDFL(慈悲深き終身独裁者) |
| YARV | Yet Another Ruby VM。Ruby 1.9 で導入されたバイトコード仮想マシン |
| YJIT | Ruby 3.1 以降で本格採用された JIT コンパイラ。Shopify が開発 |
| Ractor | Ruby 3.0 で導入された並行処理の仕組み。GIL(グローバルインタープリタロック)に縛られない並列実行を目指す |
| RBS | Ruby 3.0 で導入された型情報の記述言語。実行時の型チェックは行わないが、静的解析ツールと連携できる |
| mruby | 組み込みシステム向けの軽量 Ruby 実装。まつもとゆきひろさんが主導 |
| Gem | Ruby のパッケージ管理単位。RubyGems.org で公開・配布されている |
| Bundler | プロジェクトごとの Gem バージョンを管理するツール |
| irb | Interactive Ruby。ターミナルで Ruby を対話的に実行できる REPL |