Ruby

Ruby（ルビー）は、まつもとゆきひろ（通称: Matz）により開発された、簡潔な文法が特徴的なオブジェクト指向スクリプト言語スクリプト言語とはプログラミング言語の一種で、ソースコードを逐次（実行形式に）翻訳しながら実行する。。
日本で開発されたプログラミング言語としては初めて国際電気標準会議（IEC）で国際規格に認証された事例となったp=ⅱ。

**概要**
Ruby は1993年2月24日に生まれ、1995年12月にfj上で発表された。名称の Ruby は、プログラミング言語 Perl が6月の誕生石である Pearl（真珠）と同じ発音をし、「Perlに続く」という意味で、6月の次の誕生石（7月）のルビーから名付けられた。
機能として、クラス定義、ガベージコレクション、強力な正規表現処理、マルチスレッド、例外処理、イテレータ、クロージャ、Mixin、利用者定義演算子などがある。Perl を代替可能であることが初期の段階から重視されている。Perlと同様にグルー言語としての使い方が可能で、C言語プログラムやライブラリを呼び出す拡張モジュールを組み込むことができる。
Ruby 処理系は、インタプリタとコンパイラが存在する（詳しくは#実装を参照）。
可読性を重視した構文となっている。Ruby においては整数や文字列なども含めデータ型はすべてがオブジェクトであり、純粋なオブジェクト指向言語といえる。
長らく言語仕様が明文化されず、まつもとによる実装が言語仕様に準ずるものとして扱われて来たが、2010年6月現在、JRuby や Rubinius といった互換実装の作者を中心に機械実行可能な形で明文化する RubySpec という試みが行われている。公的規格としては2011年3月22日にJIS規格（JIS X 3017）が制定され、その後2012年4月1日に日本発のプログラム言語では初めてISO/IEC規格（ISO/IEC 30170）として承認された
。
自由ソフトウェアとしてバージョン1.9.2までは Rubyライセンス（Ruby License や Ruby'sと表記されることもある。GPLかArtisticに似た独自ライセンスを選択するデュアルライセンス）で配布されていたが、バージョン1.9.3以降は2-clause BSDLとのデュアルライセンスで配布されている。

**設計思想**
開発者のまつもとゆきひろは、「Rubyの言語仕様策定において最も重視しているのはストレスなくプログラミングを楽しむことである (enjoy programming)」と述べている。
ただし、まつもとによる明文化された言語仕様は存在しない。Perlのモットー「やり方はいろいろある (There's More Than One Way To Do It; TMTOWTDI)」は「多様性は善 (Diversity is Good)」というスローガンで Ruby に引き継がれてはいるものの最重要なものではないとも述べており、非推奨な手法も可能にするとともに、そのような手法を言語仕様により使いにくくすることによって自粛を促している。
また、まつもとは『まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法』でもRubyの開発理由を次のように述べている。
また、英語圏の開発者の間ではMINASWAN (Matz is nice and so we are nice. 和訳: まつもとがナイスだから我々もナイスであろう) の標語が用いられている。
「Python、PHP、Perlでは静的型を導入しているため、Rubyも型を導入するべきでは」と長年言われているが、まつもとは「Rubyに型を取り入れたくない。DRY (Don't repeat yourself)ではないから⁠」⁠「⁠型宣言することはコンピュータに使われているような気になる」と否定的であり、2019年5月現在Rubyに静的型が導入される予定はない。
クラス名はアルファベットの大文字から始めるという制約があり、日本語などの非ASCII文字のみでクラス名を定義する方法がない。この件についてまつもとは以下のように語っており、英語を共通言語として使うべきであるという立場を表明している。

**実装**

**公式な実装**
Rubyの公式な実装には、以下の二種類が存在する。
MRI（Matz' Ruby Implementation）
まつもとゆきひろによって開発されはじめたC言語による実装であり、最も広く使われている。狭義として、evalを中心とした部分が次で述べるYARVに更新される以前（1.8.x以前）のバージョンを指して言うこともある。JRuby などに対して CRuby と呼ばれることもある。また、JRuby などに対して、広義として YARV 以降も含んで言うこともある。
YARV
1.9で採用された、MRIのevalをバイトコードを実行するタイプに置き換えたもの。（狭義の）MRIはソースコードを構文木にコンパイルした後、構文木を解釈する仮想機械であるevalで実行するインタプリタであるが、YARVはソースコードをバイトコードにコンパイルした後、バイトコードを解釈する仮想機械であるevalで実行するインタプリタである。Javaなどのバイトコードとは違い、このバイトコードはファイルとしては生成されない（ファイルとして静的に外部化することを考慮した設計では基本的になく、シンボルを多用するなどしている）。なお「YARV」は、もともとは開発中におけるその仮想機械の名前だった。

**その他の実装**
JRuby
Java 言語による実装。純粋な Java で行われているため、プラットフォーム非依存の利用が可能。ほとんどの Ruby クラスが組み込みで提供されている。インタープリタ・実行時コンパイラ・事前コンパイラの3種類が用意されている。事前コンパイラでは、Java バイトコードへ変換し、JRuby が無くても他の Java プラットフォーム上で動作させることが可能となる。
IronRuby
.NET Framework 上で Ruby を動作させる実装であり、.NET Framework のライブラリと連携させることができる。JIT方式のバイトコードインタプリタ。共通言語基盤に準拠した実装（Monoなど）で動作するため、プラットフォーム非依存の利用も可能（ただし、ソースコードが .NET Framework のライブラリに依存している場合は Mono での動作は不可能）。
MacRuby
macOS 上で動作する Ruby 実装。Cocoa を含む様々なフレームワークとの連携が可能。RubyCocoa の問題点を解決するために開発されている。
Rubinius
仮想機械上で Ruby を実行するJIT方式のバイトコードインタプリタ。大部分が Ruby で実装されている。
MagLev (software)
smalltalk仮想マシン上で動作する実装  MagLev。
mruby
組み込みシステム向けの軽量版。家電製品の他、スマートフォン、ゲームなどでの使用を想定している。
その他
Parrot 上で Ruby を動作させるための実装なども開発されている。

**コード例**
基本的なコード
# 文字列、数値を含め、全てがオブジェクトである
-199.abs                                       # 199
"ruby is cool".length                          # 12
"Rick".index("c")                              # 2
"Nice Day Isn't It?".split(//).uniq.sort.join  # " '?DINaceinsty"

**コレクション**
配列の作成と使用法
a = 1, 'hi', 3.14, 1, 2, 4, 5
a2                      # 3.14
a.reverse                 # 4, 5, 2, 1, 3.14, 'hi', 1
a.flatten.uniq            # 1, 'hi', 3.14, 2, 4, 5
ハッシュの作成と使用法
hash = {'water' => 'wet', 'fire' => 'hot'}
hash = {water: 'wet', fire: 'hot'} # シンボルリテラルをキーとする場合、Ruby 1.9 からはこのような Javascript 風の表記ができる。
puts hash:fire       # 表示:  hot
hash.each do |key, value|
puts "#{key} is #{value}"
end
# 表示:               water is wet
#                     fire is hot
hash.delete_if 

**制御構造**
ほかの言語でもよくみられるような制御構造を用いることができる。
if "fablic".length > 3
puts 'ya'
else
puts 'nop'
end
# 表示:         ya
list = 1, 2, 5, 13, 21
for item in list
puts item
end
# 表示:         1
#               2
#               5
#               13
#               21
n = 0
while n 
一部の制御構造は後述するイテレータで代替することができる。
なお、上記、
if "fablic".length > 3
puts 'ya'
else
puts 'nop'
end
は、
puts "fablic".length > 3 ? "ya" : "nop"
puts(
if "fablic".length > 3
"ya"
else
"nop"
end
)
puts(
case "fablic".length
when .. 3
"nop"
else
"ya"
end
)
のような記述もできる。

**ブロック付きメソッド呼び出し**
Ruby ではブロック付きメソッド呼び出しを用いるコードが好まれることが多い。これを用いると、ユーザー定義の制御構造やコールバックなど様々な処理を簡潔に記述できるからである。
ブロックとは波括弧 {、} または do、end によって囲まれたコード列のことである。メソッド呼び出しの末尾に記述することが出来る。この2つは基本的に同一だが、結合の優先度が異なる。慣習的に一行で書くときは波括弧が、複数行に渡る場合はdo、endが使用される場合が多い。
# { ... }
method1 { puts "Hello, World!" }
# do ... end
method2 do
puts "Hello, world!"
end
ブロック付きメソッド呼び出しが繰り返し処理を主な役割としていたことから、イテレータと呼ばれていた時期がある。しかし、実際には繰り返し処理にとどまらず、様々な使われ方をしているので、最近はブロック付きメソッド呼び出し全体の総称としてイテレータという名称を用いるのは適切でないと考えられている。

**繰り返し処理**
配列の各要素への繰り返し処理
list = 1, 2, 5, 13, 21
list.map! 
以下はブロックを使わずに同じことを行う場合
list = 1, 2, 5, 13, 21
n = 0
while n 
指定した回数の繰り返し処理
3.times { puts 'foobar' }       # 制御構造の項のwhileの例と同じ
連続する数字の繰り返し処理
# 連続する数字を出力
(1..3).each do |i1|
print i1.to_s #=> "123"
end
puts
# 配列から連続する一部を出力
ai1 = 1, 2, 3, 4, 5
p ai11..3 #=> 2, 3, 4
p ai11, 3 #=> 2, 3, 4
# 断続する数字をキーにした空のハッシュを作成
hi1 = {}
0..5, 10, 20..21, 30.each do |e1|
if e1.class == Range
e1.each do |i1|
hi1i1 = ""
end
else
hi1e1 = ""
end
end
p hi1     #=> {0=>"", 1=>"", 2=>"", 3=>"", 4=>"", 5=>"", 10=>"", 20=>"", 21=>"", 30=>""}
p hi10  #=> ""
p hi199 #=> nil
# 上記コードをワンオフ向けに特化した例
hi1 = {}
(0..5).to_a, 10, (20..21).to_a, 30.flatten.each do |i1|
hi1i1 = ""
end
gsub()による文字列置換の繰り返し処理
puts "ABC-ABC".gsub("B", "1B2")        # OK "A1B2C-A1B2C"
puts "ABC-ABC".gsub(/(B)/, "1#{$1}2")  # NG "A12C-A12C"
puts "ABC-ABC".gsub(/(B)/){"1#{$1}2"}  # OK "A1B2C-A1B2C"

**後処理の省力化**
ブロックの内容を実行してから、決められた後処理を行うメソッドもある。
File.open('file.txt', 'w+b') do |file|
file.puts 'Wrote some text.'
end                             # file.txtはここで自動的に閉じられる
これは次の例と同様の処理を行う（ensure については例外処理の項を参照）
begin
file = File.open('file.txt', 'w+b')
file.puts 'Wrote some text.'
ensure
file.close
end

**本処理を後から指定**
実際に行いたい処理をブロックで記述する。前項の後処理の省力化もこれの一例といえる。
def bfs(list)       #配列をツリーに見立てた処理
until list.empty?
unit = list.shift
yield unit      #ブロックの内容を実行
unit.each
end
end
bfs(0,1,2,3,4,5,6,7,8,9) 
この例は、ツリーから要素と分枝をつぎつぎと取り出して取り出したものになんらかの処理を行うものである。メソッドの利用者は、なんらかの処理のみを記述すればよく、取り出しのアルゴリズムなど、本質的でない内容に意識を向ける必要がなくなる。

**クロージャ**
クロージャとなるようなブロックの引数渡し
# オブジェクトのインスタンス変数（変数名の頭に@が付く）でブロックを記憶。
def remember(&p)
@block = p
end
# nameを受け取るブロックを引数に、上記のメソッドを呼び出す。
remember 
# 後に必要になった時点でクロージャを呼び出す。
@block.call("John")
# 表示:"Hello, John!"
メソッドからクロージャを返す例
def create_set_and_get(value = 0)
return proc 
end
setter, getter = create_set_and_get
setter.call(21)
getter.call # => 21

**クラス**
次のコードはPersonという名前のクラスである。その中、まずinitializeはオブジェクトを初期化するコンストラクタである。ほかに2つのメソッドがあり、1つは比較演算子であるをオーバーライドしておりArray#sortによりプロパティageでソートすることができる。もう1つのオーバーライド箇所のto_sメソッドは Kernel#puts での表示の形式を整える。attr_readerは Ruby におけるメタプログラミングの例であり、attr はインスタンス変数の入出力を司る、いわゆる値を取得する getter メソッドや値を設定する setter メソッド（アクセサ）を定義する。attr_readerは getter メソッドのみの定義である。なおメソッド中では最後に評価された式が返り値となり、明示的なreturnは省略できる。
class Person
def initialize(name, age)
@name, @age = name, age
end
def (person)
@age  person.age
end
def to_s
"#{@name} (#{@age})"
end
attr_reader :name, :age
end
group =  Person.new("John", 20),
Person.new("Markus", 63),
Person.new("Ash", 16)

puts group.sort.reverse
結果は3つの名前が年の大きい順に表示される
Markus (63)
John (20)
Ash (16)

**例外処理**
例外は不具合が起こったときraiseの呼び出しで発生させることができる。Ruby での例外は Exception クラスか、そのサブクラスのインスタンスである。
例外にはメッセージを追加することもできる
raise "This is a message"
さらに例外のタイプも指定できる
raise ArgumentError, "Illegal arguments!"
例外はrescue節で処理することができ、次のようにコードにrescueを付加するだけである
begin
# 通常処理
rescue
# 例外処理。引数を省略すると、StandardErrorのサブクラスの例外のみ処理する
rescue SomeError
# 例外処理。SomeErrorの例外のみ処理する。
ensure
# 例外の発生に関わらず必ず実行される処理
else
# 例外が発生しなかったときに実行される処理
end

**不向きな処理**
ベンチマークテストで使用される以下のようなコードを実行したとき、処理速度が著しく低下することがある。
i1 = 1000000
while i1 

**Rubyの周辺技術**
分散オブジェクトを実現する dRuby
*Ruby スクリプトに埋め込むことができる文書形式RD
*Ruby によるRDを採用したウィキ、RWiki
*Ruby からSDLライブラリを扱えるようにするRuby/SDL
*Ruby から Delphi を扱えるようにする Apollo
*Ruby によるウェブアプリケーションフレームワーク Ruby on Rails
*Ruby の処理系の一つでRuby1.9以後の処理系として採用されている YARV
*Ruby の統合開発環境  RDE
*Ruby のコードを Windows の実行形式ファイルに変換する Exerb
*Ruby 用のライブラリ管理システムである RubyGems
*Apache HTTP Server に組み込むための mod ruby
*サーバサイドでHTMLへの埋め込み Ruby 文を実現する eRuby
*Ruby のコードをJavaScriptへ変換するコンパイラ　 Opal
*Microsoft Windows の ActiveX 環境で Ruby インタープリターを呼び出す ActiveScriptRuby（Internet Explorer 限定だがHTMLに埋めこんでクライアント上で動かすスクリプト言語として Rubyを指定できるようになる）
*Ruby から Win32API やCOMコンポーネントを呼び出すためのライブラリー WIN32OLE
*JavaScript や Flash 上で動く Ruby の処理系 HotRuby
*Ruby によるビヘイビア駆動開発のためのフレームワーク RSpec
*Ruby で書かれたビルドツール Rake
*Ruby で書かれたmacOS パッケージ管理システム homebrew
*Ruby からDirectXを使用するための拡張ライブラリ DXRuby
*Ruby プログラミングを視覚的直感的に開発可能とする、Scratch (プログラミング言語)のRuby対応版（Rubyソースを生成するScratchとも言えるもの）とでも言うべきGUI型IDE Smalruby

**Rubyで開発されたアプリケーション**
tDiary
*影舞
*Hiki
*Chef
*Vagrant
*Ruby on Rails
**GitHub
**Metasploit
**Redmine
**Basecamp
**RadiantCMS
*qwikWeb
*WEBrick
*Mongrel (web server)
*Phusion Passenger
*Puppet
*mikutter
*Serverspec

**Rubyを組み込んだアプリケーション**
RPGツクールXP・RPGツクールVX
株式会社エンターブレインから発売されているRPG制作ソフトシリーズのうち、RPGツクールXPとRPGツクールVXでは、Ruby をツクール専用にカスタマイズした RGSSを搭載している。同シリーズの従来ソフトではあらかじめ用意された機能しか使えなかったが、RGSSにより戦闘などのシステムを一から構築する事が出来るようになった。
RPGツクールMVからは開発言語がJavaScriptに変更になった。

**エピソード**

**ブロック構造構文の選択理由**
Ruby ではブロック構造を end で終える構文が採用されているが、開発者のまつもとゆきひろは他の構文が採用される可能性があったことを述べている。当時、Emacs 上で end で終える構文をオートインデントさせた例はあまりなく、Ruby 言語用の編集モードにオートインデント機能を持たせられるかどうかが問題になっていたためである。実際には数日の試行でオートインデント可能であることがわかり、現在の構文になった。C言語のような{〜}を使った構文も検討されていたが、結局これは採用されなかった。

**ゆかりのある地域**
Rubyは日本の国産言語として知られており、特にRubyとゆかりのある次の地域は "Rubyの聖地" と呼ばれている。- 静岡県浜松市 - 開発者のまつもとゆきひろが日本タイムシェア株式会社（現：TIS株式会社）の浜松市にあった研究所に勤務していた1993年にRubyの開発を開始。- 愛知県名古屋市 - 株式会社トヨタケーラム（現：株式会社トヨタシステムズ）在籍時、1995年にRubyをオープンソースソフトウェアとして公開。- 島根県松江市 - 1997年から島根県松江市に移り、同市の株式会社ネットワーク応用通信研究所 （NaCl）フェローとしてRubyの普及に尽力。

**まつもとゆきひろが書いたコードの割合**
当初は当然、まつもとゆきひろが書いたコードばかりだったが、2010年前後に主要開発者の立場からは外れ、10年ほど経過した2020年9月8日現在では、RubyのCコード509,802行のうち、まつもとがコミットしたのは36,437行で1割以下という状況になっていた。本人は「意外と多いなという印象です」と語った。一方、まつもとがプログラマーとして関わっているmrubyについて同様の方法で測定したところ、67,068行中、25,049行で、しかもmrubyでは他に代理コミットしてもらったものもあるので、「それを加えると32,653行で、約半分ってところですかね」とのことであった。

**言語間競争とRuby**
Pythonは満足できるようなものではなかったからRubyが開発された。公式のリファレンスの用語集に「Matz（まつもと） がPythonに満足していれば Ruby は生まれなかったであろう」と言及されている。
Ruby on RailsがPythonではなくRubyで作られた理由 - 開発者のハンソンがRubyに恋をしたから
デイヴィッド・ハイネマイヤー・ハンソンがRuby on Railsを構築するのにPythonを選ばなかった理由として「私の場合は、恋に落ちたのがRubyなのです。私はRubyに恋をしていますし、もう14年間もそうなのです。（中略）『最適なツール』などというものは存在しないのです。あなたの脳をちょうどいい具合に刺激するパズルがあるだけなのです。今日では、ほぼなんでも作ることができます。そして、それを使って、さらに何でも作れてしまうのです。これは素晴らしいことです。表現や言語、そして思考の多様性に乾杯しましょう！」と質問サイトのQuoraで本人が回答している。
検索ワード頻度では分からない、Rubyの生産性やビジネス上の価値
Ruby on Railsが非常に話題になっていた頃には、オランダのTIOBEという会社が発表しているプログラミング言語の"人気"ランキングで8位や7位くらいまでRubyは上がっていたが、2018年12月のランキングでは17位になっていた。まつもとは、TwitterがRuby on RailsからJava仮想マシン用言語のScalaに移行した話などを例に出して「Rubyは死んだ」みたいに言う人がいる、と、そういう見解に、またか、と呆れつつ指摘し、ネットメディアにばかり接している人は、いわゆるフィルターバブルに入ってしまっており、自分の知ってる世界とは違う世界のことがだんだん見えなくなってきており、Twitterみたいなネットメディアでお話しばかりしているとそこに参加している特定の人から届けられる話ばかりが聞こえ、SNSの外にある本当の現実が見えなくなる、といったことをまつもとは2019年2月に指摘している。
実際のプログラミング言語の寿命というものは、一般的なソフトウェアに比べると比較的長く、例えばFORTRANという世界で最初のプログラミング言語と言われているものが1954年に生まれており64年も経っているが現在も使われ続け、COBOLは1959年頃に誕生し60年ほど経つが、COBOLは今でも大企業の基幹系システムで現役で使われ続けており、たとえばまつもとの所属するネットワーク応用通信研究所という会社のエンジニアも何分の1かがCOBOL技術者という状況である。TIOBEの"人気"ランキングではCOBOLは20位前後なのに、現実世界ではCOBOLはそれくらい大量に使われている。TIOBEの"人気"ランキングと現実世界でのプログラミング言語の使用量がまったくずれてしまっている。実は、TIOBEの"人気"ランキングなるものは、本当は人気ランキングですらなく、単にサーチエンジンのキーワードにされた頻度のランキングにすぎないEfn|つまり、TIOBEのランキングは、はっきり言うと、人気ランキングでも無いものを"人気ランキング"とタイトルをつけて公表しており、一種のフェイク情報、一種の詐欺情報である。。 単なるフェイク的な検索ワード頻度ランキング情報や、SNSのフィルターバブルで偏った情報に囲まれた若い人がSNS情報をもとに空想することと、現実のシステム開発やシステム保守のビジネスの世界で使われている言語の使用頻度は全然異なる。そして何より現実としては、プログラミング言語の寿命はかなり長い。
「RubyとかRuby on Railsだと、さまざまなジャンルで実際の適用例があるので、なにか困ったとき同じ問題に直面した人を探せたり、あるいはその問題を解決するRubyGemsを見つけられる。そういう点でいうと、トータルの生産性はかなり高いことがある」「実際に仕事として、あるいは自分のプロダクトを作るときに、どんな言語を選択してどういうふうに開発したらいいのかを考えると、Rubyの持っているビジネス上の価値はそんなに下がっていないと思います。たとえ順位が下がって、表面上Rubyの人気が凋落したように見えても、ある意味『まだまだ大丈夫』が1つの見識だと思います」と、まつもとは2019年2月に解説した。

**脚注**

**注釈**

**出典**

**参考文献**
Cite book|和書|author=高橋征義|coauthors=後藤裕蔵|others=まつもとゆきひろ監修|year=2002|month=4|title=たのしい Ruby Rubyではじめる気軽なプログラミング|publisher=ソフトバンクパブリッシング|isbn=4-7973-1408-7|ref=harv - プログラム未経験者向けの入門書。
**ref=harv
**ref=harv
**ref=harv
**ref=harv
**ref=harv
*Cite book|和書|author=デビット・トーマス|coauthors=アンドリュー・ハント|others=田和勝訳、まつもとゆきひろ監修|year=2001|month=9|title=プログラミングRuby 達人プログラマーガイド|publisher=ピアソン・エデュケーション|isbn=4-89471-453-1|ref=harv
**Cite book|和書|author=Dave Thomas|coauthors=Chad Fowler・Andy Hunt|others=田和勝訳、まつもとゆきひろ監修|year=2006|month=8|title=プログラミング Ruby 言語編|edition=第2版|publisher=オーム社|isbn=4-274-06642-8|ref=harv
**ref=harv
**ref=harv
**ref=harv
*Cite book|和書|author=David Flanagan|coauthors=まつもとゆきひろ|others=卜部昌平監訳、長尾高弘訳|year=2009|month=1|title=プログラミング言語 Ruby|publisher=オライリー・ジャパン|isbn=978-4-87311-394-4|ref=harv
*Cite book|和書|author=まつもとゆきひろ|coauthors=石塚圭樹|year=1999|month=11|title=オブジェクト指向スクリプト言語 Ruby|series=ASCII software science : Language 11|publisher=アスキー|isbn=4-7561-3254-5
*Cite book|和書|author=まつもとゆきひろ|others=日経Linux編集|year=2009|month=5|title=まつもとゆきひろ コードの世界～スーパー・プログラマになる14の思考法|publisher=日経BP社|isbn=978-4-8222-3431-7|ref=harv
*author-link=山田祥寛

**関連項目**
Goby(Golang+Ruby)
*Perl
*Python
*スクリプト言語
*オブジェクト指向プログラミング

**外部リンク**
name=オブジェクト指向スクリプト言語 Ruby：Ruby公式ウェブサイト
*Rubyアソシエーション- JISC - JISX3017 プログラム言語Ruby