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

2005年頃、Ruby言語への関心は、 Rubyで書かれたウェブフレームワークであるRuby on Railsの登場と相まって急上昇しました。RailsはRubyの認知度向上に大きく貢献したとよく言われています。[26]
2011年10月31日にリリースされたRuby 1.9.3から[27] 、 RubyはRubyライセンスとGPLのデュアルライセンスから、Rubyライセンスと二条項BSDライセンスのデュアルライセンスに変更されました。[28] 1.8からの変更により、多くの人気のあるサードパーティ製のgemの書き換えが必要になったため、1.9の採用は遅れました。[要出典]
Ruby 2.0はRuby 1.9.3との完全な後方互換性を持つことが想定されていました。2013年2月24日の公式2.0.0リリース時点では、既知の非互換性は5つしかありませんでした。[29]
2.1.0以降、Rubyのバージョン管理ポリシーはセマンティックバージョニングに似たものに変更されましたが、マイナーバージョンの増分はAPIと互換性がない可能性があるという点で若干異なります。[30]
Ruby 2.2.0には、高速化、バグ修正、ライブラリの更新が含まれており、非推奨のAPIがいくつか削除されています。特に注目すべきは、メモリ処理の変更です。インクリメンタルガベージコレクタ、シンボルのガベージコレクションのサポート、jemallocを直接コンパイルするオプションなどが導入されています。また、 system()とspawn()でvfork (2)を使用するための実験的なサポートと、Unicode 7.0仕様のサポートも含まれています。バージョン2.2.1以降、[31] PowerPC64でのRuby MRIのパフォーマンスが向上しました。[32] [33] [34]廃止または削除された機能には、callcc、DLライブラリ、Digest::HMAC、lib/rational.rb、lib/complex.rb、GServer、Logger::Application、およびさまざまなC API関数が含まれます。[35]
Ruby 2.3.0には、Proc#callの変更、SocketとIOでの例外キーワードの使用、Thread#nameの処理、デフォルトのパッシブNet::FTP接続、Rakeの標準ライブラリからの削除など、多くのパフォーマンスの改善、更新、バグ修正が含まれています。[36]その他の注目すべき変更点は次のとおりです。
&.if obj && 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、インスタンス変数アクセスのパフォーマンス向上が含まれています。[38]その他の注目すべき変更点は次のとおりです。
Ruby 2.5.0 の注目すべき変更点としては、 rescueおよびensureステートメントで自動的に囲むdo-endブロック (余分なbegin-endブロックの必要性が減少)、 yield_selfによるメソッド チェーン、分岐カバレッジおよびメソッド カバレッジ測定のサポート、Hash#sliceおよびHash#transform_keysによるハッシュ変換の簡素化などが挙げられます。さらに、ブロック パスの高速化 (3 倍の高速化)、Mutex の高速化、ERB テンプレートの高速化、一部の連結メソッドの改善など、パフォーマンスが大幅に向上しています。
Ruby 2.6.0 の注目すべき変更点としては、実験的なジャストインタイム コンパイラ(JIT) とRubyVM::AbstractSyntaxTree (実験的) などがあります。
Ruby 2.7.0 の注目すべき変更点としては、パターン マッチング (実験的)、REPL の改善、圧縮 GC、位置引数とキーワード引数の分離などがあります。
Ruby 3.0.0は2020年のクリスマスにリリースされました。[39]これはRuby 3x3として知られており、Ruby 3.0ではRuby 2.0と比較してプログラムが3倍高速に実行されることを意味します。[40]また、2から3への途中の中間リリースですでに実装されているものもありました。3x3を実現するために、Ruby 3にはプログラムを高速化するMJIT、後にYJIT(ジャストインタイムコンパイラ)が搭載されていますが、これらは実験的なものとされており、デフォルトでは無効になっています(実行時にフラグによって有効になります)。
Ruby 3.0のもう一つの目標は並行性を向上させることであり、さらに2つのユーティリティであるFibre Schedulerと実験的なRactorがこの目標を促進します。[39] Ractorは共有オブジェクトではなくメッセージを交換することで実現されるため、軽量でスレッドセーフです。
Ruby 3.0では、静的解析のためにRubyプログラムの種類を記述するためのRBS言語が導入されました。[39]これは一般的なRubyプログラムとは分離されています。
Ruby 3.0ではいくつかの構文の強化とライブラリの変更も行われています。[39]
Ruby 3.1は2021年12月25日にリリースされました。[41] Shopifyが開発した新しい実験的なJust-In-TimeコンパイラであるYJITが含まれており、実際のビジネスアプリケーションのパフォーマンスを向上させます。新しいデバッガーも含まれています。このリリースでは、いくつかの構文強化とその他の改善が行われています。FTP 、SMTP、IMAP、POPのネットワークライブラリは、デフォルトのgemからバンドルされたgemに移動されました。[42]
Ruby 3.2は2022年12月25日にリリースされました。[43] WASIインターフェースを介してWebAssembly環境内で実行できるようになりました。正規表現にもいくつかの改良が加えられ、特定のReDoS攻撃から保護するための高速なメモ化されたマッチングアルゴリズムや、正規表現マッチングのタイムアウトを設定できるようになりました。このリリースでは、構文の提案やエラーの強調表示などの追加のデバッグ機能と構文機能も含まれています。MJITコンパイラは標準ライブラリモジュールとして再実装され、RustベースのJITコンパイラであるYJITはLinux上のより多くのアーキテクチャをサポートするようになりました。
Ruby 3.3は2023年12月25日にリリースされました。[1] Ruby 3.3では、言語に大幅な機能強化とパフォーマンス向上が導入されています。主な機能としては、移植性と保守性に優れたパースを実現するPrismパーサーの導入、Pure Ruby JITコンパイラRJITの追加、そしてYJITコンパイラの大幅なパフォーマンス向上が挙げられます。さらに、メモリ使用量の改善、M:Nスレッドスケジューラの導入、そして標準ライブラリのアップデートにより、より効率的で開発者フレンドリーなRubyエコシステムが実現されています。
Ruby 3.4は2024年12月25日にリリースされました。[44] Ruby 3.4ではit、ブロックパラメータ参照の追加、Prismをデフォルトのパーサーとして変更、ソケットライブラリへのHappy Eyeballsバージョン2のサポートの追加、YJITの改善、モジュラーガベージコレクタの追加などが行われました。[45]
松本氏は、Rubyは優れたユーザーインターフェース設計の原則に従い、プログラマーの生産性と楽しさを重視して設計されていると述べた。 [46] 2008年のGoogle Tech Talkで、彼は「Rubyが世界中のすべてのプログラマーの生産性を高め、プログラミングを楽しみ、そして幸せにすることに貢献することを願っています。それがRuby言語の第一の目的です。」と述べた。[47]彼は、システム設計はコンピュータではなく人間のニーズを重視する必要があると強調している。 [48]
多くの人、特にコンピュータエンジニアは、機械に注目しがちです。「こうすれば機械は速く動くだろう。こうすれば機械はより効率的に動くだろう。こうすれば機械は何とかなるだろう」と考えます。彼らは機械に注目しているのです。しかし実際には、人間に注目する必要があります。人間がプログラミングや機械のアプリケーション操作にどれほど関心を持っているか、ということです。私たちは主人であり、彼らは奴隷なのです。
松本氏は、自身の設計目標はプログラマーの作業と混乱を最小限に抑え、自分自身が楽しく使える言語を作ることだったと述べています。彼はRubyの設計に驚き最小の原則(POLA)を適用していないと述べています。 [48] 2005年5月にニュースグループcomp.lang.rubyで行われた議論において、松本氏はRubyをPOLAから遠ざけようとし、設計上の選択は誰にとっても驚きとなるため、驚きを評価する際には個人的な基準を用いていると説明しました。その個人的な基準が一貫していれば、Rubyの標準に精通している人にとって驚きは少なくなるでしょう。[49]
松本はインタビューで次のように定義した。[48]
誰もがそれぞれ独自のバックグラウンドを持っています。Python出身者もいれば、Perl出身者もいるでしょう。そして、言語の様々な側面に驚くかもしれません。そして、彼らは私のところにやって来て、「この言語のこの機能には驚きました。Rubyは驚き最小の原則に反しています」と言うかもしれません。ちょっと待ってください。驚き最小の原則は、あなただけに当てはまるわけではありません。驚き最小の原則とは、私自身の驚き最小の原則を意味します。そして、それはあなたがRubyを熟知した後の、驚き最小の原則を意味します。例えば、私はRubyの設計を始める前はC++プログラマーでした。2、3年間、C++だけでプログラミングしていました。そして、2年間C++でプログラミングを続けた今でも、C++には驚きを感じます。
Rubyはオブジェクト指向です。すべての値はオブジェクトであり、他の多くの言語でプリミティブ型(整数、ブール値、nullなど)として指定される型のクラスやインスタンスも含まれます。Rubyではすべてがオブジェクトであるため、すべてにメソッドと呼ばれる組み込み機能があります。すべての関数はメソッドであり、メソッドは常にオブジェクト上で呼び出されます。最上位スコープで定義されたメソッドは、Objectクラスのメソッドになります。このクラスは他のすべてのクラスの祖先であるため、このようなメソッドはどのオブジェクトでも呼び出すことができます。また、これらのメソッドはすべてのスコープで参照可能であり、実質的に「グローバル」な手続きとして機能します。Rubyは、動的ディスパッチ、ミックスイン、シングルトンメソッド(クラスではなく単一のインスタンスに属し、そのインスタンス用に定義されるメソッド)による継承をサポートしています。Rubyは多重継承をサポートしていませんが、クラスはミックスインとしてモジュールをインポートできます。
Rubyはマルチパラダイムプログラミング言語として説明されています。手続き型プログラミング(クラス外で関数や変数を定義すると、それらはルートオブジェクト(self)の一部になります)、オブジェクト指向プログラミング(すべてがオブジェクト)または関数型プログラミング(匿名関数、クロージャ、継続を持ち、すべての文は値を持ち、関数は最後の評価結果を返します)が可能です。イントロスペクション、リフレクションプログラミング、メタプログラミング、インタープリタベースのスレッドをサポートしています。Rubyは動的型付けとパラメトリック多態性を備えています。
RubyのFAQによると、構文はPerlに似ており、セマンティクスはSmalltalkに似ているが、設計思想はPythonとは大きく異なる。[50]
falsenilmethod_missingを通じてconst_missing)Rubyの構文は、PerlやPythonとほぼ同様です。クラスとメソッドの定義はキーワードで示されますが、コードブロックはキーワードまたは中括弧で定義できます。Perlとは異なり、変数には必ずしもシギルを接頭辞として付ける必要はありません。シギルを使用すると、変数のスコープの意味が変更されます。実用上、式と文の区別はありません。[58] [59]改行は重要であり、文の終わりとみなされます。セミコロンも同様に使用できます。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言語で書かれていました。[22]
Ruby 1.9 から始まり、Ruby 2.x 以降では、公式の Ruby インタープリターはYARV (「Yet Another Ruby VM」) となり、この実装は MRI の以前のリリースで使用されていた低速の仮想マシンに取って代わりました。
2018年現在、RubyにはJRuby、Rubinius、mruby[アップデート]など、複数の代替実装が存在します。それぞれ異なるアプローチを採用しており、JRubyとRubiniusはJust-In-Timeコンパイルを提供し、mrubyはAhead-of-Timeコンパイルも提供しています。
Ruby には、3 つの主要な代替実装があります。
その他の Ruby 実装には次のものがあります:
現在廃止されている他の Ruby 実装は次のとおりです。
Ruby実装の成熟度は、Ruby on Rails (Rails)フレームワークの実行能力によって測られることが多い。これは、Ruby実装が複雑で、Ruby固有の機能を多く使用しているためである。特定の実装がこの目標を達成した時点は、「Railsシンギュラリティ(特異点)」と呼ばれる。リファレンス実装、JRuby、Rubinius [61]はいずれも、本番環境でRailsを改変することなく実行できる。
松本氏は当初、 4.3BSDベースのSony NEWS-OS 3.x上でRubyを開発していましたが、後にSunOS 4.xに移行し、最終的にはLinuxに移行しました。[62] [63] 1999年までに、Rubyは多くの異なるオペレーティングシステムで動作することが知られるようになりました。Rubyの最新のバージョンと実装は、主要なデスクトップ、モバイル、サーバーベースのオペレーティングシステムで利用可能です。Rubyは、 Jelastic、Heroku、Google Cloud Platformなどの多くのクラウドホスティングプラットフォームでもサポートされています。
RVMや RBEnvなどのツールを使用すると、1 台のマシンに複数の Ruby バージョンや複数の「gemsets」をインストールしてパーティション分割することが容易になります。
RubyGemsはRubyのパッケージマネージャーです。Rubyパッケージは「gem」と呼ばれ、コマンドラインからインストールできます。ほとんどのgemはライブラリですが、IDEなどのアプリケーションもいくつか存在します。[64] RubyGems.orgには10万以上のRuby gemがホストされています。[65]
多くの新規および既存の Ruby ライブラリは、Gitのバージョン管理リポジトリ ホスティングを提供するサービスであるGitHubでホストされています。
Rubyプログラミング用のアプリケーション、ドキュメント、ライブラリをホストしていたRubyアプリケーションアーカイブは、2013年にその機能がRubyGemsに移管されるまで維持されていました。[66]
程度は低いものの、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ステータス不明(リンク)
の構文では、statement文は引数として指定できない式の特殊なケースです(例:多重代入)。
文[...]は括弧で囲まれていない限り、式の一部にすることはできません。