1.1 誕生と初期の開発
Rubyは、日本のプログラマまつもとゆきひろ(通称Matz)によって1993年から開発が始められた。PerlやSmalltalk、Eiffelなどの言語の影響を受け、オブジェクト指向とスクリプト言語の利便性を融合することを目指した。1995年に最初の公開バージョン(0.95)がリリースされ、日本国内のメーリングリストを中心に徐々にユーザーを獲得した。
1.2 バージョン履歴
1.2.1 Ruby 1.8系
2003年に安定版1.8.0がリリースされ、長期間にわたり広く使われた。このバージョンはRubyコミュニティの基盤を固め、多くのライブラリやフレームワークが登場した。2007年にはRuby on Railsの急速な普及とともに国際的な注目を集めた。
1.2.2 Ruby 1.9系
2007年に1.9.0がリリースされ、YARV(Yet Another Ruby VM)を搭載して実行速度が大幅に向上した。また、エンコーディング対応やブロックにおけるローカル変数スコープの変更など、多くの言語仕様の改善が行われた。
1.2.3 Ruby 2.x系
2013年にRuby 2.0.0がリリースされ、キーワード引数の導入やRefinementsの実験的追加など、現代的な機能が取り入れられた。2.1以降はセマンティックバージョニングに近い形で進化し、パフォーマンスの最適化や並列処理への準備が進められた。
1.2.4 Ruby 3.x系
2020年にRuby 3.0.0がリリースされ、「Ruby 3x3」と称してRuby 2.0比で3倍の高速化を目標に掲げた。主な新機能としてRactor(アクターモデルによる並行処理)、型プロファイル(TypeProf)、Fiberスケジューラの導入などが挙げられる。
2.1 まつもとゆきひろの哲学
Matzは「プログラマの生産性と楽しさ」を言語設計の中心に据えている。人間中心の設計を重視し、コードの記述量を減らしつつ、直感的に理解できる構文を追求した。また、言語の拡張性と柔軟性を保ちながら、予期しない動作を避けるバランスを取っている。
2.2 最小驚きの原則(POLS)
Rubyは「最小驚きの原則(Principle of Least Surprise)」に従って設計されている。これは、言語の動作がプログラマの期待から極力外れないようにするという指針である。たとえば、メソッドの戻り値は最後に評価された式の値になるなど、一貫性がある。
2.3 自然言語への接近
Rubyの文法は英語の自然言語に近づけるよう意識されている。例えば、ifやunlessを後置できる構文、eachやcollectといったメソッド名、nil?のような述語メソッドの命名規則などが、読みやすさを高めている。
3.1 文法の基本
3.1.1 制御構造
Rubyの制御構造はif、unless、while、until、for、caseなどがある。特にifとunlessは修飾子として文の後ろに置くことができ、puts "x is 1" if x == 1のように簡潔に記述できる。
3.1.2 ブロックとイテレータ
ブロックはdo...endまたは{ }で囲まれたコードの塊であり、メソッドに渡すことで反復処理や遅延評価を実現する。イテレータ(each、map、selectなど)は配列やハッシュなどのコレクションを操作する基本的な方法である。
3.1.3 メソッド定義と呼び出し
メソッドはdefキーワードで定義する。引数にはデフォルト値、可変長引数(*args)、キーワード引数(key:)を指定できる。呼び出し時に括弧を省略できるため、自然言語的な表現が可能。
3.2 オブジェクト指向
3.2.1 クラスとインスタンス
すべての値がオブジェクトであり、クラスはclassキーワードで定義する。インスタンス変数は@で始まり、クラス変数は@@で始まる。継承は単一継承だが、Mix-inにより多重継承の代替を提供する。
3.2.2 モジュールとMix-in
モジュールはmoduleキーワードで定義され、インスタンス化できない。includeによりクラスにMix-inでき、多重継承の問題を解決しつつ、メソッドや定数の共有が可能。
3.2.3 特異メソッド
特定のオブジェクトだけにメソッドを定義できる。def object.methodの形で記述する。これはクラスを開かずに個別のオブジェクトの振る舞いを変更したい場合に便利。
3.3 データ型とリテラル
3.3.1 数値(整数・浮動小数点数)
整数はFixnumとBignum(内部で自動変換)、浮動小数点数はFloatで表現される。RationalやComplexも組み込みで利用可能。
3.3.2 文字列とシンボル
文字列はStringクラスで、ダブルクォート内では式展開(#{})が可能。シンボルはSymbolクラスで、:nameのように記述し、文字列より高速な比較や識別子として多用される。
3.3.3 配列・ハッシュ・範囲
配列はArrayクラスで、動的にサイズ変更可能。ハッシュはHashクラスで、キーと値のペアを保持。範囲はRangeクラスで、1..10のように記述し、イテレーションや条件判定に使われる。
3.4 動的機能
3.4.1 ダックタイピング
「もしそれがアヒルのように歩き、アヒルのように鳴くなら、それはアヒルである」という考えに基づき、オブジェクトの型よりもメソッドの応答性を重視する。これにより柔軟なコードが書ける。
3.4.2 オープンクラスとモンキーパッチ
既存のクラスを再オープンしてメソッドを追加・変更できる。これによりライブラリの振る舞いを変更できる反面、予期しない副作用を引き起こす可能性がある。
3.4.3 リフレクション
実行時にオブジェクトの情報を取得・操作できる。respond_to?、method、send、class、instance_variable_getなどを使い、動的なメタプログラミングが容易。
3.5 例外処理
例外はbegin/rescue/ensure/endで捕捉する。raiseで例外を発生させ、独自の例外クラスを定義できる。ensure節は例外の有無にかかわらず実行される。
3.6 標準ライブラリの概要
標準ライブラリには、ファイル操作(File、IO)、ネットワーク(socket、net/http)、日付時刻(Date、Time)、データベース(dbm)、JSON/XML処理、スレッド、テスト(minitest)など、幅広い機能が含まれている。
4.1 MRI(CRuby)
Rubyのリファレンス実装。C言語で書かれており、YARV(Yet Another Ruby VM)を仮想マシンとして採用。多くのプラットフォームで動作し、最も広く使われている。最新の言語仕様にいち早く対応する。
4.2 JRuby
JVM上で動作するRuby実装。Javaのライブラリを直接利用でき、スレッドやパフォーマンス面で優位性を持つ。多くのJava環境との統合が容易。
4.3 Rubinius
Ruby自身で書かれた処理系(セルフホスティング)。JITコンパイルとVMの最適化により高速な実行を目指す。かつて活発に開発されていたが、現在はメンテナンスモードにある。
4.4 TruffleRuby
GraalVM上で動作するRuby実装。TruffleフレームワークとGraalのJITコンパイラにより、高いパフォーマンスを実現する。特に並列処理や数値計算で強みを発揮する。
4.5 mruby(組み込み向け)
軽量Ruby実装で、組み込みシステムやアプリケーションへの組み込みを目的とする。最小限の機能に絞られており、ライセンスも緩やかで、ゲームやIoT機器などで利用される。
5.1 パッケージ管理:RubyGems
Rubyのパッケージ形式「gem」を管理するツール。コマンドラインからgem installでライブラリをインストールし、バージョン管理や依存関係解決を行う。公式リポジトリはRubyGems.org。
5.2 ビルドツール:Bundler
プロジェクトごとのgem依存関係を管理するツール。Gemfileに必要なgemを記述し、bundle installで一括インストール。バージョンのロックや環境ごとのグループ管理が可能。
5.3 テスティングフレームワーク
5.3.1 Minitest
Ruby標準ライブラリに含まれる軽量なテストフレームワーク。シンプルな構文でユニットテストやスペックスタイルのテストを書ける。Railsのデフォルトテスティングツールとしても使われる。
5.3.2 RSpec
振る舞い駆動開発(BDD)に基づくテスティングフレームワーク。describe、it、expectなどのDSLにより、仕様を自然言語に近い形で記述できる。コミュニティで広く支持されている。
5.4 主要なWebフレームワーク
5.4.1 Ruby on Rails
2005年に公開されたフルスタックWebフレームワーク。「設定より規約(CoC)」と「繰り返しを避ける(DRY)」を基本理念とする。MVCアーキテクチャ、Active RecordによるORM、Active Supportなどのユーティリティを提供し、迅速な開発を可能にする。
5.4.2 Sinatra
軽量なDSLベースのWebフレームワーク。Railsに比べて柔軟性が高く、最小限のコードでWebアプリケーションを作成できる。APIや小規模なサービスに適している。
6.1 国際的なカンファレンス(RubyConf, RailsConf)
RubyConfはRubyコミュニティ最大の国際カンファレンスで、毎年開催される。RailsConfはRuby on Railsに特化したカンファレンス。両方とも世界中から開発者が集まり、技術発表や交流が行われる。
6.2 地域コミュニティと勉強会
各地域にRubyユーザーグループ(RUG)が存在し、定期的な勉強会やハッカソンが開催される。日本では日本Rubyの会や地域Rubyコミュニティが活発。オンラインのチャットやフォーラムでも情報交換が盛ん。
6.3 コア開発プロセス
Rubyのコア開発はまつもとゆきひろをリーダーとするコアチームによって、公開メーリングリストやバグトラッカーを通じて行われる。新機能の提案はFeature Requestとして議論され、Matzが最終決定を下す。リリースマネージャーが安定版リリースの管理を担当する。
7.1 バージョン番号体系
Rubyはメジャー・マイナー・ティックの3桁でバージョン番号を表現する(例:3.1.2)。メジャー番号は大規模な変更、マイナー番号は年単位の定期リリース(毎年12月)、ティック番号はバグ修正リリースを示す。
7.2 セキュリティメンテナンス期間
現在のRubyは通常、各マイナーリリースから約2年間セキュリティ修正を提供する。ただし、最新のメジャーシリーズの最終マイナーリリースはさらに長期間(通常3年程度)サポートされる場合がある。古いバージョンはEnd of Life(EOL)となる。
7.3 今後のロードマップ
Ruby 3.x系では並列処理の強化(Ractor、Fiberスケジューラ)、型システムの導入(TypeProf、RBS、Steep)、パフォーマンスの継続的改善が計画されている。将来のメジャーバージョン(Ruby 4.0)では、さらに型安全性や言語の簡素化が検討されている。