CINXE.COM
Rubyとは
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Rubyとは</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta itemprop="image" content="https://www.ruby-lang.org/images/header-ruby-logo@2x.png"> <meta name="description" content=""> <link rel="stylesheet" type="text/css" href="/stylesheets/normalize.css"> <link rel="stylesheet" type="text/css" href="/stylesheets/main.css"> <link rel="stylesheet" type="text/css" href="/stylesheets/pygments.css"> <link rel="stylesheet" type="text/css" href="/stylesheets/mobile.css"> <link rel="stylesheet" type="text/css" href="/stylesheets/print.css"> <link href='https://fonts.googleapis.com/css?family=Noto+Sans:400,700,400italic,700italic&subset=latin,cyrillic,greek,vietnamese' rel='stylesheet' type='text/css'> <link rel="canonical" href="https://www.ruby-lang.org/ja/about/"> <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"> <link href="/ja/feeds/news.rss" rel="alternate" title="最近のニュース (RSS)" type="application/rss+xml"> <script type="text/javascript" src="/javascripts/jquery.min.js"></script> <script type="text/javascript" src="/javascripts/page.js"></script> </head> <body> <div id="header"> <div id="header_content" class="container"> <a href="/ja/"> <h1>Ruby</h1> <h2>A Programmer's Best Friend</h2> </a> <div class="site-links"> <a href="/ja/" class="home">ホーム</a> <a href="/ja/downloads/">ダウンロード</a> <a href="/ja/documentation/">ドキュメント</a> <a href="/ja/libraries/">ライブラリ</a> <a href="/ja/community/">コミュニティ</a> <a href="/ja/dev/">コア開発</a> <a href="/ja/news/">ニュース</a> <a href="/ja/security/">セキュリティ</a> <a href="/ja/about/">Rubyとは</a> <a href="#" class="menu selected">Menu</a> </div> <div id="search-box"> <form id="search-form" action="https://www.google.com/cse"> <table class="fieldset"> <tr> <td> <input class="field" type="text" name="q" size="31" style="background: white url(//www.google.com/coop/intl/ja/images/google_custom_search_watermark.gif) left no-repeat" onfocus="this.style.background='white'" onblur="if (/^\s*$/.test(this.value)) this.style.background='white url(//www.google.com/coop/intl/ja/images/google_custom_search_watermark.gif) left no-repeat'"/> </td> <td> <input type="hidden" name="cx" value="008288045305770251182:fvruzsaknew" /> <input type="hidden" name="ie" value="UTF-8" /> <input class="button" type="submit" name="sa" value="検索" /> </td> </tr> </table> </form> </div> </div> </div> <div id="page"> <div id="main-wrapper" class="container"> <div id="main"> <div id="content-wrapper"> <h1>Rubyとは</h1> <div id="content"> <p class="summary">なぜRubyはこんなに人気なのでしょうか?Rubyのファンは、Rubyを美しく芸術的な言語だと言います。 なおかつ、便利で実用的だとも言います。 一体どういうことでしょうか?</p> <h3>Rubyの作者の理念</h3> <p>Rubyは絶妙にバランスのとれた言語です。 Rubyの作者である、Matzこと<a href="http://www.rubyist.net/~matz/">まつもと ゆきひろ</a>氏は、好みの言語(Perl、Smalltalk、Eiffel、Ada、Lisp)の一部をブレンドし、 関数型プログラミングと命令型プログラミングが絶妙に調和された新しい言語を作りました。</p> <p>Matzはよく、「Rubyをシンプルなものではなく、自然なものにしようとしている」と言います。</p> <p>付け加えて、こんな風にも言っています。</p> <blockquote> <p>Rubyの外観はシンプルです。けれど、内側はとても複雑なのです。 それはちょうど私たちの身体と同じようなものです<sup><a href="#fn1">1</a></sup>。</p> </blockquote> <h3>Rubyの成長について</h3> <p>1995年の一般公開以来、Rubyは世界中から熱心なプログラマーを集めています。 2006年になると、Rubyは大量の支持を集めました。 現在では、世界中の主要都市に活発なユーザーグループが形成され、 そしてRubyに関する大規模なカンファレンスが開かれています。</p> <p>英語でRubyについて会話するための<a href="/ja/community/mailing-lists/">メーリングリスト</a>であるruby-talkでは、 2006年には平均して日に200通ものメッセージがやりとりされていました。 最近ではそういった大きな場所での流量は低下しているものの、 たくさんの小さなグループに分かれて、さまざまな会話がされています。</p> <p><a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">TIOBE指標</a>のような、人気や成長の度合いからプログラミング言語を測る指標のほとんどで、 Rubyはトップ10内にランクインしています。 こうした成長は、Rubyで書かれたソフトウェア、 とりわけWebアプリケーションフレームワーク<a href="http://rubyonrails.org/">Ruby on Rails</a>の人気に起因しています。</p> <p>また、Rubyは<a href="/en/about/license.txt">フリーソフトウェア</a>です。 無料とか自由に使えるといったことだけでなく、コピー、変更、および再配布の自由を約束しています。</p> <h3>すべてがオブジェクト</h3> <p>理想的な構文を見つけようと、Matzは当初、他の言語を調査したそうです。 その時のことを思い出して、Matzは「Perlよりも強力で、Python2よりもオブジェクト指向な言語が欲しかったんだ<sup><a href="#fn2">2</a></sup>」と語っています。</p> <p>Rubyでは、すべてのものはオブジェクトです。 すべての情報の塊・コードには、固有のプロパティとアクションを与えることができます。 オブジェクト指向プログラミングでは、プロパティはインスタンス変数、アクションはメソッドと呼ばれます。 Rubyによる純粋なオブジェクト指向のアプローチは、 最もよくみられる、数にアクションを与える以下のようなコード片で確認できます。</p> <figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="mi">5</span><span class="p">.</span><span class="nf">times</span> <span class="p">{</span> <span class="nb">print</span> <span class="s2">"We *love* Ruby -- it's outrageous!"</span> <span class="p">}</span></code></pre></figure> <p>多くの言語では、数やそれ以外のプリミティブな型はオブジェクトではありません。 ですが、RubyはSmalltalkの影響を受け、すべての型がメソッドやインスタンス変数を与えられるようになっています。 これがRubyが使いやすい理由の一つです。 Rubyの世界では、オブジェクトに適用できることは、すべてのものに対して適用できるのです。</p> <h3>Rubyの柔軟性</h3> <p>Rubyは柔軟な言語として知られています。 Rubyでは、ユーザーが自由にその一部を変更することができます。 やろうと思えば、Rubyのコアな部分でさえ、削除したり再定義したりできます。 既存の部品をその上に追加することすらできます。 Rubyはプログラマを制限しない言語なのです。</p> <p>たとえば、加算は加算演算子(<code class="language-plaintext highlighter-rouge">+</code>)を用いて行われますが、 <code class="language-plaintext highlighter-rouge">plus</code>という単語の方が読み取りやすいというのであれば、 Rubyの組み込みクラスである<code class="language-plaintext highlighter-rouge">Numeric</code>クラスに次のようなメソッドを追加できます。</p> <figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Numeric</span> <span class="k">def</span> <span class="nf">plus</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="nb">self</span><span class="p">.</span><span class="nf">+</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">end</span> <span class="k">end</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">5</span><span class="p">.</span><span class="nf">plus</span> <span class="mi">6</span> <span class="c1"># y は 11 になります</span></code></pre></figure> <p>Rubyの演算子はメソッドの糖衣構文(シンタックスシュガー)ですので、 演算子もまた同様に再定義できます。</p> <h3>ブロック: 表現力豊かな機能</h3> <p>Rubyのブロックもまた、偉大な柔軟性の源泉として知られています。 プログラマーは、どんなメソッドへも、メソッドがどのように振る舞うべきかを記述したクロージャを付け加えることができます。 このクロージャは <em>ブロック</em> と呼ばれます。 ブロックは、PHPやVisual Basicなどの命令型言語からRubyの世界に新しく入ってきた人たちにもっとも人気のある機能の一つになっています。</p> <p>ブロックは関数型言語に影響された機能です。Matzは「Rubyのクロージャでは、Lispの文化に敬意を表したかった」と語っています<sup><a href="#fn3">3</a></sup>。</p> <figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">search_engines</span> <span class="o">=</span> <span class="sx">%w[Google Yahoo MSN]</span><span class="p">.</span><span class="nf">map</span> <span class="k">do</span> <span class="o">|</span><span class="n">engine</span><span class="o">|</span> <span class="s2">"http://www."</span> <span class="o">+</span> <span class="n">engine</span><span class="p">.</span><span class="nf">downcase</span> <span class="o">+</span> <span class="s2">".com"</span> <span class="k">end</span></code></pre></figure> <p>上のコードで、ブロックは<code class="language-plaintext highlighter-rouge">do...end</code>の内側に書かれています。 <code class="language-plaintext highlighter-rouge">map</code>メソッドは定義された単語のリストに与えられたブロックを適用します。 Rubyのメソッドの多くは、メソッドを使用するプログラマーが処理の詳細を埋めれるような独自のブロックをかけるように定義されています。</p> <h3>RubyとMixin</h3> <p>多くのオブジェクト指向言語と異なり、Rubyは <strong>わざと</strong> 単一継承しか備えていません。 けれど、Rubyはモジュール(Objective-Cではカテゴリと呼ばれているもの)の概念を持ちます。モジュールとはメソッドの集合です。</p> <p>クラスはモジュールをミックスイン(Mixin)し、モジュールのすべてのメソッドを自由に受け取ることができます。 たとえば、<code class="language-plaintext highlighter-rouge">each</code>メソッドが実装されたクラスは、<code class="language-plaintext highlighter-rouge">Enumerable</code>モジュールをミックスインして、 繰り返し処理に<code class="language-plaintext highlighter-rouge">each</code>を使うメソッド群を追加することができます。</p> <figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">MyArray</span> <span class="kp">include</span> <span class="no">Enumerable</span> <span class="k">end</span></code></pre></figure> <p>一般的にこちらの方が、複雑で制限の強い多重継承よりもRubyistにとって明瞭な表現です。</p> <h3>Rubyの外観</h3> <p>Rubyはとても限られた句読法を使い、英語のキーワードを好みます。 いくつかの句読法はRubyを修飾するためだけに使われます。 Rubyは変数宣言を必要としません。 変数のスコープを示すためには単純な命名規則が使われます。</p> <ul> <li><code class="language-plaintext highlighter-rouge">var</code> はローカル変数になります。</li> <li><code class="language-plaintext highlighter-rouge">@var</code> はインスタンス変数です。</li> <li><code class="language-plaintext highlighter-rouge">$var</code> はグローバル変数です。</li> </ul> <p>上記の印は、プログラマがそれぞれの変数の役割を識別することを容易にし、読みやすさを向上させます。 また、すべてのインスタンスのメンバの前に付く億劫な<code class="language-plaintext highlighter-rouge">self.</code>をつける必要も無くなります。</p> <h3>基礎を超えて</h3> <p>Rubyは次に示すような豊富な機能を持っています。</p> <ul> <li> <p>Rubyは、JavaやPythonのような、エラーを処理するための例外処理機構を備えています。</p> </li> <li> <p>Rubyには、すべてのRubyオブジェクトを扱うマークスイープ方式のガベージコレクション機能(GC)があります。 拡張ライブラリ内の参照カウンタを管理する必要はありません。Matzは「これは健康に良い」と言っています。</p> </li> <li> <p>RubyでC拡張を書くことは、PerlやPythonで同じことをやるよりも簡単です。CからRubyを呼び出すためのよくできたAPIがあるからです。 このAPIはソフトウェア内に組み込まれたRubyを呼び出し、スクリプト言語のように使います。SWIGインターフェイスも存在しています。</p> </li> <li> <p>OSが許すなら、Rubyは動的なライブラリ拡張をロードすることもできます。</p> </li> <li> <p>RubyはOSに依存しないスレッド機構を備えています。これによって、Rubyが動作するすべてのプラットフォーム上で、 OSのサポートなしに(MS-DOSだとしても!)マルチスレッド処理を扱えます。</p> </li> <li> <p>Rubyにはとても高い可搬性があります。Rubyは主にGNU/Linux上で開発されていますが、 UNIX、macOS、Windows、DOS、BeOS、OS/2など、多くのOSで動作します。</p> </li> </ul> <h3>さまざまなRuby処理系</h3> <p>言語としてのRubyには、いくつか別の処理系が存在しています。 このページでは、<strong>MRI</strong> (Matz Ruby Interpreter)あるいは <strong>CRuby</strong> (Cで書かれていることに由来する)と呼ばれる Rubyのリファレンス実装について記載していますが、別のRuby処理系も存在します。 他の言語や環境と統合したりMRIにはないような特別な機能を使いたい場合など、 ある特定の状況でそうしたRuby処理系は役に立ちます。</p> <p>MRI以外のRuby処理系には以下のようなものがあります。</p> <ul> <li><a href="http://jruby.org">JRuby</a>は、JVM(Java仮想マシン)上に構築されたRubyです。 JVMの最適化されたJITコンパイラやGC、並行スレッド、ツール群、そして膨大なコレクションのライブラリを使うことができます。</li> <li><a href="http://www.mruby.org/">mruby</a>はRubyの軽量実装です。アプリケーションにリンクし、組み込むことができます。Rubyの作者であるまつもと ゆきひろ氏によって開発が進められています。</li> <li><a href="https://github.com/oracle/truffleruby">truffleruby</a>はGraalVM上に構築された高速なRuby実装です。</li> </ul> <h4>以下のバージョンはここ数年ほとんどまたは全く更新されていませんが、引き続き利用可能です。</h4> <ul> <li><a href="http://rubini.us">Rubinius</a>は「Rubyで書かれたRuby」です。LLVM上に構築されています。LLVMは他の言語も構築されるよくできた仮想マシンです。</li> <li><a href="http://www.ironruby.net">IronRuby</a>は、.Netフレームワークにしっかりと統合されたRuby処理系です。</li> <li><a href="http://maglev.github.io">MagLev</a>は、オブジェクトの永続化と分散共有キャッシュを持った、高速で安定したRuby処理系です。</li> <li><a href="https://github.com/parrot/cardinal">Cardinal</a>はPerl6用の仮想マシンである<a href="http://parrot.org">Parrot</a>上のRubyコンパイラです。</li> </ul> <h3>参照リンク</h3> <p id="fn1"><sup>1</sup> Matz, ruby-talk メーリングリスト上での会話, <a href="https://blade.ruby-lang.org/ruby-talk/2773">2000年5月12日</a>。</p> <p id="fn2"><sup>2</sup> Matz, <a href="http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html">An Interview with the Creator of Ruby</a>から, 2001年11月29日。</p> <p id="fn3"><sup>3</sup> Matz, <a href="http://www.artima.com/intv/closures2.html">Blocks and Closures in Ruby</a>から, 2003年12月22日。</p> </div> </div> <hr class="hidden-modern" /> <div id="sidebar-wrapper"> <div id="sidebar"> <div class="navigation"> <h3><strong>はじめよう!</strong></h3> <ul class="menu"> <li><a href="https://try.ruby-lang.org/">試してみる! (ブラウザから)</a></li> <li><a href="/ja/documentation/quickstart/">20分ではじめるRuby</a></li> <li><a href="/ja/documentation/ruby-from-other-languages/">他言語からのRuby入門</a></li> </ul> </div> <div class="navigation"> <h3><strong>探求しよう</strong></h3> <ul class="menu"> <li><a href="/ja/documentation/">ドキュメント</a></li> <li><a href="https://rubybib.org/">学術研究(英語)</a></li> <li><a href="/ja/libraries/">ライブラリ</a></li> </ul> </div> <div class="navigation"> <h3><strong>コミュニティに参加しよう</strong></h3> <ul> <li><a href="/ja/community/mailing-lists/">メーリングリスト</a>: 世界中のプログラマとRubyについて話しましょう。</li> <li><a href="http://ruby-no-kai.org/">日本Rubyの会</a>: Rubyの利用者/開発者の支援を目的としたグループです。</li> </ul> </div> <h3>Syndicate</h3> <p><a href="/ja/feeds/news.rss">最近のニュース (RSS)</a></p> </div> </div> <hr class="hidden-modern" /> </div> </div> </div> <div class="container"> <div id="footer"> <div class="site-links"> <a href="/ja/" class="home">ホーム</a> <a href="/ja/downloads/">ダウンロード</a> <a href="/ja/documentation/">ドキュメント</a> <a href="/ja/libraries/">ライブラリ</a> <a href="/ja/community/">コミュニティ</a> <a href="/ja/dev/">コア開発</a> <a href="/ja/news/">ニュース</a> <a href="/ja/security/">セキュリティ</a> <a href="/ja/about/">Rubyとは</a> </div> <p> This site in other languages: <a href="/bg/">Български</a>, <a href="/de/">Deutsch</a>, <a href="/en/">English</a>, <a href="/es/">Español</a>, <a href="/fr/">Français</a>, <a href="/id/">Bahasa Indonesia</a>, <a href="/it/">Italiano</a>, <a href="/ja/">日本語</a>, <a href="/ko/">한국어</a>, <a href="/pl/">polski</a>, <a href="/pt/">Português</a>, <a href="/ru/">Русский</a>, <a href="/tr/">Türkçe</a>, <a href="/vi/">Tiếng Việt</a>, <a href="/zh_cn/">简体中文</a>, <a href="/zh_tw/">繁體中文</a>. </p> <p><a href="/ja/about/website/">このウェブサイト</a>は Ruby コミュニティのメンバーによって運営されています。</p> </div> </div> </body> </html>