Rubyは、プログラミングの生産性とシンプルさを重視して設計された汎用プログラミング言語です。Rubyでは、プリミティブデータ型も含め、すべてがオブジェクトです。この言語の開発は、1990年代半ばに日本の松本幸弘氏(通称マッツ)によって始まりました。
Rubyはインタプリタ型で、高水準かつ動的型付け言語です。インタプリタはガベージコレクションとジャストインタイムコンパイルを使用します。手続き型、オブジェクト指向、関数型プログラミングなど、複数のプログラミングパラダイムをサポートしています。開発者によると、RubyはPerl、Smalltalk、Eiffel、Ada、BASIC、Lispの影響を受けています。[ 8 ] [ 2 ]
松本氏によると、Rubyは1993年に構想された。1999年のRuby-Talkメーリングリストへの投稿で、彼はこの言語に関する初期のアイデアをいくつか共有した。[ 9 ]
同僚とオブジェクト指向スクリプト言語の可能性について話していました。私はPerl(Perl4、Perl5ではない)を知っていましたが、おもちゃのような言語という印象があり、あまり好きではありませんでした(今でもそうです)。オブジェクト指向言語は非常に有望に思えました。当時Pythonを知っていましたが、真のオブジェクト指向言語ではないと感じていたため、好きではありませんでした。オブジェクト指向機能は言語へのアドオンのように見えたからです。15年間言語マニアでありオブジェクト指向ファンである私は、本当に使いやすい、真のオブジェクト指向スクリプト言語を求めていました。探しましたが、見つかりませんでした。そこで、自分で作ることにしたのです。
松本氏は、Rubyの設計は、その核となる部分ではシンプルなLisp言語に似ており、Smalltalkのようなオブジェクトシステム、高階関数に触発されたブロック、Perlのような実用的なユーティリティを備えていると説明した。[ 10 ]
「Ruby」という名前は、1993年2月24日、コードが書かれる前の松本氏と石塚啓樹氏とのオンラインチャットセッション中に生まれた。[ 11 ]当初は「Coral」と「Ruby」の2つの名前が提案された。松本氏はその後石塚氏に送ったメールで後者を選んだ。[ 12 ]また、名前の選択に影響を与えた要因の1つとして、同僚の誕生石がルビーだったことを挙げている。[ 13 ] [ 14 ]
Ruby 0.95 の最初の公開リリースは、1995 年 12 月 21 日に日本の国内ニュースグループで発表されました。 [ 15 ] [ 16 ]その後、2 日間で Ruby の 3 つのバージョンがリリースされました。[ 11 ]このリリースは、新しい言語の最初のメーリング リストである日本語のruby-listメーリング リストの開始と同時期でした。
この開発段階ですでに、オブジェクト指向設計、継承を持つクラス、ミックスイン、イテレータ、クロージャ、例外処理、ガベージコレクションなど、後のRubyリリースでおなじみの多くの機能が実装されていた。[ 17 ]
1995年にRuby 0.95がリリースされて以来、この数年間でRubyの安定版がいくつかリリースされた。[ 11 ]
1997年、Rubyに関する最初の記事がウェブ上に公開された。同年、松本はnetlab.jpに正社員開発者としてRubyの開発に携わるために採用された。[ 11 ]
1998年、松本氏によってRubyアプリケーションアーカイブが立ち上げられ、同時にRubyのシンプルな英語のホームページも開設された。[ 11 ]
1999 年に初の英語メーリング リストRuby-talkが始まり、日本国外でのこの言語への関心の高まりを示しました。[ 18 ]この同じ年に、松本と石塚恵樹は Ruby に関する最初の本『オブジェクト指向スクリプト言語 Ruby』を執筆し、1999 年 10 月に日本で出版されました。その後、2000 年代初頭には約 20 冊の Ruby に関する本が日本語で出版されました。[ 11 ]
2000年までに、日本ではRubyがPythonよりも人気になった。[ 19 ] 2000年9月には、初の英語書籍『Programming Ruby』が出版され、後に無料で公開されたことで、英語圏の人々の間でRubyの普及がさらに進んだ。2002年初頭には、英語のruby-talkメーリングリストが日本語のruby-listよりも多くのメッセージを受信するようになり、非日本語圏でのRubyの人気が高まっていることが示された。
Ruby 1.8 は 2003 年 8 月に最初にリリースされ、長期間安定していましたが、2013 年 6 月にサポートが終了しました。[ 20 ]非推奨ではありますが、まだそれに基づいたコードが存在します。Ruby 1.8 は Ruby 1.9 と部分的にしか互換性がありません。
Ruby 1.8 は、いくつかの業界標準の対象となっています。Ruby の言語仕様は、情報技術振興機構 (日本政府機関) のオープン標準推進センターによって開発され、日本工業規格委員会(JISC)に提出され、その後、国際標準化機構(ISO) に提出されました。2011 年に日本工業規格 (JIS X 3017) [ 21 ]として、また 2012 年に国際規格 (ISO/IEC 30170) [ 22 ] [ 23 ]として承認されました。

2005年頃、Rubyで書かれたWebフレームワークであるRuby on Railsの登場と並行して、Ruby言語への関心が急上昇した。RailsはRubyの認知度向上に大きく貢献したとよく言われている。[ 24 ]
2011年10月31日にリリースされたRuby 1.9.3から[ 25 ] 、 RubyはRubyライセンスとGPLのデュアルライセンスから、Rubyライセンスと2条項BSDライセンスのデュアルライセンスに変更されました。[ 26 ] 1.9の採用は、1.8からの変更により多くの人気のあるサードパーティgemの書き直しが必要になったため、遅れました。
Ruby 2.0 は Ruby 1.9.3 と完全に後方互換性を持つように設計されていました。2013 年 2 月 24 日に公式に 2.0.0 がリリースされた時点では、既知の非互換性は 5 つだけでした。[ 27 ]
2.1.0以降、Rubyのバージョン管理ポリシーはセマンティックバージョニングにより近いものに変更されましたが、マイナーバージョンの増分がAPIと互換性がない可能性があるという点で若干異なります。[ 28 ]
Ruby 2.2.0 には、高速化、バグ修正、ライブラリの更新が含まれており、非推奨の API がいくつか削除されています。特に注目すべきは、Ruby 2.2.0 でメモリ処理に変更が加えられたことです。インクリメンタル ガベージ コレクタ、シンボルのガベージ コレクションのサポート、jemalloc に対して直接コンパイルするオプションなどです。また、system() と spawn() でvfork (2) を使用する実験的なサポートと、 Unicode 7.0 仕様のサポートが追加されました。バージョン 2.2.1 以降、[ 29 ] PowerPC64でのRuby MRI のパフォーマンスが向上しました。[ 30 ] [ 31 ] [ 32 ]廃止または削除された機能には、callcc、DL ライブラリ、Digest::HMAC、lib/rational.rb、lib/complex.rb、GServer、Logger::Application、およびさまざまな C API 関数が含まれます。[ 33 ]
Ruby 2.3.0 には、Proc#call の変更、Socket および IO での例外キーワードの使用、Thread#name の処理、デフォルトのパッシブ Net::FTP 接続、および Rake が stdlib から削除されるなど、多くのパフォーマンス改善、更新、およびバグ修正が含まれています。[ 34 ]その他の注目すべき変更点は次のとおりです。
&.ifobj&&obj.foo&&obj.foo.barif obj&.foo&.barprofile={social:{wikipedia:{name:'Foo Baz'}}}profile.dig(:social, :wikipedia, :name).grep_v(regexp)これは、他の新機能に加えて、指定された正規表現のすべての否定例に一致するようになります。Ruby 2.4.0 には、ハッシュテーブル、Array#max、Array#min、およびインスタンス変数へのアクセスに関するパフォーマンスの改善が含まれています。[ 36 ]その他の注目すべき変更点は次のとおりです。
Ruby 2.5.0 の注目すべき変更点には、rescueおよびensureステートメントが自動的に周囲のdo-endブロックを使用するようになったこと ( begin-endブロックを追加で作成する必要が減った)、yield_selfを使用したメソッドチェーン、ブランチカバレッジとメソッドカバレッジ測定のサポート、Hash#sliceおよびHash#transform_keys を使用したハッシュ変換の簡素化などがあります。さらに、ブロックの受け渡しが高速化 (3 倍高速化)、ミューテックスが高速化、ERB テンプレートが高速化、連結メソッドの改善など、多くのパフォーマンス改善も含まれています。
Ruby 2.6.0 の注目すべき変更点としては、実験的なジャストインタイムコンパイラ(JIT) と、RubyVM::AbstractSyntaxTree (実験的) が挙げられます。
Ruby 2.7.0 の注目すべき変更点としては、パターンマッチング (実験的)、REPL の改善、コンパクション GC、位置引数とキーワード引数の分離などが挙げられます。
Ruby 3.0.0 は2020 年のクリスマスにリリースされました。 [ 37 ]これは Ruby 3x3 として知られており、Ruby 3.0 ではプログラムが Ruby 2.0 に比べて 3 倍速く実行されることを意味します。[ 38 ]また、2 から 3 への道のりの途中のリリースですでに実装されていたものもあります。3x3 を実現するために、Ruby 3 には MJIT、後に YJIT という Just-In-Time コンパイラが付属しており、プログラムを高速化しますが、これらは実験的なものと説明されており、デフォルトでは無効になっています (実行時にフラグで有効になります)。
Ruby 3.0 のもう 1 つの目標は並行処理を改善することであり、Fibre Scheduler と実験的な Ractor という 2 つのユーティリティがその目標を促進します。[ 37 ] Ractor は共有オブジェクトではなくメッセージを交換することで実現されるため、軽量でスレッドセーフです。
Ruby 3.0 では、静的解析用の Ruby プログラムのタイプを記述するための RBS 言語が導入されました。[ 37 ]これは一般的な Ruby プログラムとは区別されています。
Ruby 3.0 では、構文の改善やライブラリの変更もいくつか行われています。[ 37 ]
Ruby 3.1 は 2021 年 12 月 25 日にリリースされました。[ 39 ]このバージョンには、 Shopifyが開発した新しい実験的な Just-In-Time コンパイラである YJIT が含まれており、実際のビジネス アプリケーションのパフォーマンスを向上させます。新しいデバッガも含まれています。このリリースでは、構文の強化やその他の改善が行われています。FTP 、SMTP、IMAP、POPのネットワーク ライブラリは、デフォルトの gem からバンドルされた gem に移動されました。[ 40 ]
Ruby 3.2 は 2022 年 12 月 25 日にリリースされました。[ 41 ] WASI インターフェースを介してWebAssembly環境内で実行するためのサポートが追加されました。正規表現にもいくつかの改善が加えられ、特定のReDoS攻撃から保護するためのより高速なメモ化マッチング アルゴリズムや、正規表現マッチングの構成可能なタイムアウトなどが追加されました。このリリースには、構文候補やエラー ハイライトなどの追加のデバッグおよび構文機能も含まれています。MJIT コンパイラは標準ライブラリ モジュールとして再実装され、RustベースのJITコンパイラである YJIT は Linux 上でより多くのアーキテクチャをサポートするようになりました。
Ruby 3.3 は 2023 年 12 月 25 日にリリースされました。[ 42 ] Ruby 3.3 では、言語に大幅な機能強化とパフォーマンスの改善が導入されています。主な機能には、移植性と保守性を備えた構文解析のための Prism パーサーの導入、純粋な Ruby JIT コンパイラ RJIT の追加、および YJIT コンパイラの大幅なパフォーマンス向上が含まれます。さらに、メモリ使用量の改善、M:N スレッドスケジューラの導入、および標準ライブラリの更新により、より効率的で開発者に優しい Ruby エコシステムが実現されています。
Ruby 3.4 は 2024 年 12 月 25 日にリリースされました。[ 43 ] Ruby 3.4 ではit、ブロック パラメータ参照の追加、デフォルトのパーサーとしての Prism の変更、ソケット ライブラリへのHappy Eyeballsバージョン 2 のサポートの追加、YJIT の改善、モジュール式ガベージ コレクタの追加などが行われています。[ 44 ]
Ruby 4.0 は 2025 年 12 月 25 日にリリースされました。[ 45 ] Rust で書かれた JIT である実験的な ZJIT と、定義の分離を提供する機能である実験的な「Ruby Box」が追加されました。Ruby の 30 周年を祝うために、バージョン番号を 3.5 ではなく 4.0 に上げることに決定しました。[ 46 ]
松本氏は、Rubyは優れたユーザーインターフェース設計の原則に従い、プログラマーの生産性と楽しさのために設計されていると述べた。 [ 47 ] 2008年のGoogle Tech Talkで彼は、「Rubyが世界中のすべてのプログラマーの生産性向上、プログラミングの楽しみ、そして幸福につながることを願っています。それがRuby言語の主な目的です。」と述べた。[ 48 ]彼は、システム設計はコンピュータのニーズではなく、人間のニーズを重視する必要があると強調した。[ 49 ]
人々は、特にコンピュータエンジニアは、機械にばかり注目しがちです。「こうすれば機械は速く動く。こうすれば機械はより効率的に動く。こうすれば機械はこうなる。」と、機械にばかり目を向けています。しかし実際には、人間、つまり人間がプログラミングや機械のアプリケーション操作にどう関心を寄せるかに焦点を当てるべきなのです。私たちが主人であり、機械は奴隷なのです。
松本氏は、プログラマーの作業と混乱を最小限に抑えることで、自身が楽しく使える言語を作ることを主な設計目標としていたと述べている。また、Ruby の設計には最小驚きの原則(POLA) を適用していないとも述べている。 [ 49 ] 2005 年 5 月のニュースグループ comp.lang.ruby での議論で、松本氏は Ruby を POLA から切り離そうと試み、どのような設計上の選択も誰かにとっては驚きとなるため、驚きを評価する際に個人的な基準を使用していると説明した。その個人的な基準が一貫していれば、その基準に慣れている人にとっては驚きはほとんどないだろう。[ 50 ]
松本氏はインタビューで次のように定義した。[ 49 ]
誰もがそれぞれ独自のバックグラウンドを持っています。Python 出身の人もいれば、Perl 出身の人もいるでしょうし、言語のさまざまな側面に驚くかもしれません。そして、私のところにやって来て、「言語のこの機能に驚いたので、Ruby は最小驚きの原則に違反しています」と言うのです。ちょっと待ってください。最小驚きの原則は、あなただけのものではありません。最小驚きの原則とは、私の驚きが最小となる原則のことです。そして、Ruby を十分に学んだ後の最小驚きの原則のことです。例えば、私は Ruby の設計を始める前は C++ プログラマーでした。2、3 年間は C++ だけでプログラミングしていました。そして、2 年間 C++ でプログラミングした後でも、まだ驚くことがあります。
Ruby はオブジェクト指向です。すべての値はオブジェクトであり、クラスや、他の多くの言語でプリミティブ型 (整数、ブール値、nullなど) と呼ばれる型のインスタンスも含まれます。Ruby ではすべてがオブジェクトであるため、Ruby ではすべてがメソッドと呼ばれる特定の組み込み機能を持っています。すべての関数はメソッドであり、メソッドは常にオブジェクトに対して呼び出されます。トップレベルのスコープで定義されたメソッドは Object クラスのメソッドになります。このクラスは他のすべてのクラスの祖先であるため、そのようなメソッドは任意のオブジェクトに対して呼び出すことができます。また、すべてのスコープで可視であり、実質的に「グローバル」な手続きとして機能します。Ruby は動的ディスパッチ、ミックスイン、シングルトン メソッド (クラスで定義されるのではなく、単一のインスタンスに属し、そのインスタンスに対して定義される)による継承をサポートしています。Ruby は多重継承をサポートしていませんが、クラスはモジュールをミックスインとしてインポートできます。
Rubyはマルチパラダイムプログラミング言語として知られています。手続き型プログラミング(クラスの外で関数や変数を定義すると、それらはルートオブジェクトである「self」オブジェクトの一部になります)、オブジェクト指向プログラミング(すべてがオブジェクトです)、関数型プログラミング(匿名関数、クロージャ、継続を持ち、すべてのステートメントは値を持ち、関数は最後の評価結果を返します)が可能です。また、内省、リフレクティブプログラミング、メタプログラミング、インタプリタベースのスレッドをサポートしています。Rubyは動的型付けを備え、パラメトリック多相性をサポートしています。
Ruby FAQによると、構文はPerlに似ており、意味論はSmalltalkに似ているが、設計思想はPythonとは大きく異なる。[ 51 ]
falsenilmethod_missingてconst_missing)Ruby の構文は、PerlやPythonの構文と概ね似ています。クラスとメソッドの定義はキーワードで示され、コード ブロックはキーワードまたは中括弧で定義できます。Perl とは異なり、変数にシジルを必ず付ける必要はありません。シジルを使用すると、変数のスコープの意味が変わります。実際には、式と文の区別はありません。[ 59 ] [ 60 ]改行は意味を持ち、文の終わりとみなされます。セミコロンも同様に使用できます。Python とは異なり、インデントは意味を持ちません。
Python や Perl との違いの 1 つは、Ruby ではすべてのインスタンス変数をクラス内で完全にプライベートに保ち、アクセサ メソッド ( attr_writer、 、 など) を介してのみ公開することです。C ++やJavaattr_readerなどの他の言語の「getter」メソッドや「setter」メソッドとは異なり、Ruby のアクセサ メソッドはメタプログラミングによって 1 行のコードで作成できます。ただし、アクセサ メソッドは C++ や Java の従来の方法で作成することもできます。これらのメソッドの呼び出しには括弧を使用する必要がないため、呼び出し元のコードを 1 行も変更したり、リファクタリングを行ったりすることなく、インスタンス変数を完全な関数に簡単に変更でき、C#やVB.NET のプロパティ メンバーと同様の機能を実現できます。
Python のプロパティ記述子も同様ですが、開発プロセスにおいてトレードオフが生じます。Python で公開インスタンス変数を使用して開発を開始し、後で実装を変更してプロパティ記述子を介して公開されるプライベートインスタンス変数を使用するようにすると、クラス内部のコードを調整して、公開プロパティではなくプライベート変数を使用するようにする必要が生じる場合があります。Ruby の設計では、すべてのインスタンス変数がプライベートになるように強制されますが、宣言setやgetメソッドを簡単に行う方法も提供されています。これは、Ruby ではクラスの外部からクラスの内部メンバーに直接アクセスすることはなく、クラスにメッセージを渡して応答を受け取るという考え方に基づいています。
オリジナルのRubyインタープリタは、しばしばMatzのRubyインタープリタ(MRI)と呼ばれます。この実装はC言語で書かれており、独自のRuby専用仮想マシンを使用しています。
標準化され廃止されたRuby 1.8の実装は、シングルパスのインタプリタ言語としてC言語で書かれていました。[ 20 ]
Ruby 1.9以降、そしてRuby 2.x以降においても、公式のRubyインタープリタはYARV(「Yet Another Ruby VM」)であり、この実装はMRIの以前のリリースで使用されていた低速な仮想マシンに取って代わった。
2026年現在Rubyには、 JRuby、Rubinius、mrubyなど、いくつかの代替実装が存在します。それぞれ異なるアプローチを採用しており、JRubyとRubiniusはジャストインタイムコンパイルを提供し、mrubyは事前コンパイルも提供します。
Rubyには、主に3つの代替実装があります。
その他のRuby実装には以下が含まれます。
現在では廃止されたその他のRuby実装は以下のとおりです。
Rubyの実装の成熟度は、Ruby on Rails (Rails)フレームワークを実行できるかどうかで測られる傾向がある。これは、Ruby on Railsの実装が複雑で、多くのRuby固有の機能を使用するためである。特定の実装がこの目標を達成する時点は、「Rails特異点」と呼ばれる。リファレンス実装であるJRubyとRubinius [ 62 ]はすべて、本番環境でRailsをそのまま実行できる。
松本氏は当初、 4.3BSDベースのSony NEWS-OS 3.x上で Ruby を開発しましたが、後にSunOS 4.x に移行し、最終的にLinuxに移行しました。[ 63 ] [ 64 ] 1999 年までに、Ruby はさまざまなオペレーティングシステムで動作することが知られるようになりました。最新の Ruby バージョンと実装は、主要なデスクトップ、モバイル、サーバーベースのすべてのオペレーティングシステムで利用可能です。Ruby は、 Jelastic、Heroku、Google Cloud Platformなど、多くのクラウド ホスティング プラットフォームでもサポートされています。
RVMやRBEnvといったツールを使うと、1台のマシン上に複数のRubyバージョンや複数の「gemset」をインストールしたり、パーティション分割したりすることが容易になります。
RubyGemsはRubyのパッケージマネージャです。Rubyパッケージは「gem」と呼ばれ、コマンドラインからインストールできます。ほとんどのgemはライブラリですが、IDEなどのアプリケーションであるgemもいくつか存在します。[ 65 ] RubyGems.orgには10万を超えるRuby gemがホストされています。[ 66 ]
多くの新規および既存のRubyライブラリは、Gitのバージョン管理リポジトリホスティングを提供するサービスであるGitHub上でホストされています。
Ruby Application Archiveは、Rubyプログラミング用のアプリケーション、ドキュメント、ライブラリをホストしており、2013年にその機能がRubyGemsに移管されるまで維持されていました。[ 67 ]
程度は低いものの、Python、LISP、Eiffel、Ada、C++もRubyに影響を与えている。
主にPerl、Smalltalk、Python、Lisp、Dylan、CLUの機能を活用している。
言語は、言語のエキスパート、ドキュメントの達人、コンパイラ最適化の達人、そしてアイデアの洗練と実戦テストに役立つフィードバックを提供してくれた非常に重要な社内ドッグフーディング グループのたゆまぬ努力の産物です。もちろん、Objective-C、Rust、Haskell、Ruby、Python、C#、CLU など、挙げきれないほど多くの言語からアイデアを取り入れ、この分野の他の多くの言語が苦労して得た経験からも大いに恩恵を受けています。
{{cite web}}: CS1 maint: 複数の名前: 著者リスト (リンク){{cite web}}: CS1 maint: 複数の名前: 著者リスト (リンク){{cite web}}: CS1 maint: 複数の名前: 著者リスト (リンク){{cite web}}: CS1 maint: 複数の名前: 著者リスト (リンク){{cite web}}: CS1 maint: bot: 元の URL の状態が不明です (リンク)構文では、ステートメントは引数として出現できない式 (多重代入など) の特殊なケースです。
ステートメント [...] は、括弧で囲まれていない限り、式の一部にすることはできません。