Ruby
![]() |
|
| パラダイム | 構造化、命令型、オブジェクト指向 |
|---|---|
| 登場時期 | 1995年 |
| 設計者 | まつもとゆきひろ |
| 最新リリース | 2.2.1 / 2015年3月3日 |
| 型付け | 強い動的型付け, ダック・タイピング |
| 主な処理系 | Ruby MRI, YARV, JRuby, IronRuby, MacRuby |
| 影響を受けた言語 | Smalltalk, LISP, Perl, Python, CLU |
| 影響を与えた言語 | D言語、[1]Groovy |
| プラットフォーム | クロスプラットフォーム |
| ライセンス | BSDライセンス、Rubyライセンスのデュアル[2] (1.9.2まではGPLとRubyのデュアル) |
| ウェブサイト | www.ruby-lang.org |
Ruby(ルビー)は、まつもとゆきひろ(通称 Matz)により開発されたオブジェクト指向スクリプト言語であり、スクリプト言語が用いられてきた領域でのオブジェクト指向プログラミングを実現する。 また日本で開発されたプログラミング言語としては初めて国際電気標準会議で国際規格に認証された事例となった[3]。
目次
概要[編集]
Ruby は当初1993年2月24日に生まれ、1995年12月にfj上で発表された。名称の Ruby は、プログラミング言語 Perl が6月の誕生石である Pearl(真珠)と同じ発音をすることから、まつもとの同僚の誕生石(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)として承認された [3]。
フリーソフトウェアとしてバージョン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 に引き継がれてはいるものの最重要なものではないとも述べており、非推奨な手法も可能にするとともに、そのような手法を言語仕様により使いにくくすることによって自粛を促している。これは言語仕様が「望ましい」習慣の押し付けを行うということであり、洗脳言語(Babel-17)と言われる一面でもある。
実装[編集]
公式な実装[編集]
Rubyの公式な実装には、以下の二種類が存在する。
- MRI(Matz' Ruby Implementation)
- 1.8.x以前の公式実装。まつもとゆきひろによって開発されはじめたC言語による実装であり、最も広く使われている。JRuby などに対して CRuby と呼ばれることもある。また、JRuby などに対しては、広義の意味で後述の YARV を取り込んだ 1.9.x も含んで MRI と言うこともある。
- YARV
- 1.9で採用された、MRIを拡張した公式な処理系。これはソースコードをバイトコードへコンパイルした後、バイトコードを仮想機械上で実行するインタプリタである。もともとは開発中におけるその仮想機械の名前。
その他の実装[編集]
- JRuby
- Java 言語による実装。純粋な Java で行われているため、プラットフォーム非依存の利用が可能。ほとんどの Ruby クラスが組み込みで提供されている。インタープリタ・実行時コンパイラ・事前コンパイラの3種類が用意されている。事前コンパイラでは、Java バイトコードへ変換し、JRuby が無くても他の Java プラットフォーム上で動作させることが可能となる。
- IronRuby
- .NET Framework 上で Ruby を動作させる実装であり、.NET Framework のライブラリと連携させることができる。JIT方式のバイトコードインタプリタ。共通言語基盤に準拠した実装(Monoなど)で動作するため、プラットフォーム非依存の利用も可能(ただし、ソースコードが .NET Framework のライブラリに依存している場合は Mono での動作は不可能)。
- MacRuby
- Mac OS X 上で動作する Ruby 実装。Cocoa を含む様々なフレームワークとの連携が可能。RubyCocoa の問題点を解決するために開発されている。
- Rubinius
- 仮想機械上で Ruby を実行するJIT方式のバイトコードインタプリタ。大部分が Ruby で実装されている。
- MagLev
- smalltalk仮想マシン上で動作する実装[1]。
- mruby
- 組み込みシステム向けの軽量版。家電製品の他、スマートフォン、ゲームなどでの使用を想定している。
- その他
- Parrot 上で Ruby を動作させるための実装なども開発されている。
競合言語[編集]
| この節は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(2013年2月) |
プログラミング言語としての Ruby は、オブジェクト指向の動的型付け言語のインタプリタ言語として人気のある言語のひとつであり、多くの分野で Perl や Python と競合する。特に Python とは共通する点が多い。日本では開発者が日本人であることもあり、Ruby の人気は高く書籍も多く出版されている。2004年前後まで圧倒的なキラーアプリがなく、tDiary やバグトラッキングシステム「影舞」程度しか知られていなかったため、大きな普及には至らなかった。ところが2004年末に発表され2005年に一躍脚光を浴びた Ruby on Rails により注目を集め始めた。
例[編集]
基本的なコード
# 文字列、数値を含め、全てがオブジェクトである -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]] a[2] # 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 {|key, value| key == 'water'} # Deletes 'water' => 'wet'
制御構造[編集]
ほかの言語でもよくみられるような制御構造を用いることができる。
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 < 3 puts 'foobar' n += 1 end # 表示: foobar # foobar # foobar
一部の制御構造は後述するイテレータで代替することができる。
ブロック付きメソッド呼び出し[編集]
Ruby ではブロック付きメソッド呼び出しを用いるコードが好まれることが多い。これを用いると、ユーザー定義の制御構造やコールバックなど様々な処理を簡潔に記述できるからである。
ブロックとは波括弧({、})または do、end によって囲まれたコード列のことである。メソッド呼び出しの末尾に記述することが出来る。
# { ... } method1 { puts "Hello, World!" } # do ... end method2 do puts "Hello, world!" end
ブロック付きメソッド呼び出しが繰り返し処理を主な役割としていたことから、イテレータと呼ばれていた時期がある。しかし、実際には繰り返し処理にとどまらず、様々な使われ方をしているので、最近はブロック付きメソッド呼び出し全体の総称としてイテレータという名称を用いるのは適切でないと考えられている。[4]
繰り返し処理[編集]
配列の各要素への繰り返し処理
list = [1, 2, 5, 13, 21] list.map! {|item| item * 2} # listの各要素を2倍する処理
以下はブロックを使わずに同じことを行う場合
list = [1, 2, 5, 13, 21] n = 0 while n < list.length list[n] *= 2 n += 1 end
指定した回数の繰り返し処理
3.times { puts 'foobar' } # 制御構造の項のwhileの例と同じ
後処理の省力化[編集]
ブロックの内容を実行してから、決められた後処理を行うメソッドもある
File.open('file.txt', 'w+b') do |file| file.puts 'Wrote some text.' end # Fileはここで自動的にcloseされる
これは次の例と同様の処理を行う(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{|v| list.push v} if defined? unit.push end end bfs([0,1,[2,3],4,[5,[6,7,8]],9]) {|v| p v}
この例は、ツリーから要素と分枝をつぎつぎと取り出して取り出したものになんらかの処理を行うものである。メソッドの利用者は、なんらかの処理のみを記述すればよく、取り出しのアルゴリズムなど、本質的でない内容に意識を向ける必要がなくなる。
クロージャ[編集]
クロージャとなるようなブロックの引数渡し
# オブジェクトのインスタンス変数(変数名の頭に@が付く)でブロックを記憶。 def remember(&p) @block = p end # nameを受け取るブロックを引数に、上記のメソッドを呼び出す。 remember {|name| puts "Hello, " + name + "!"} # 後に必要になった時点でクロージャを呼び出す。 @block.call("John") # 表示:"Hello, John!"
メソッドからクロージャを返す例
def create_set_and_get(value = 0) return proc {|x| value = x}, proc { value } 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
Rubyの周辺技術[編集]
- 分散オブジェクトを実現する dRuby
- Ruby スクリプトに埋め込むことができる文書形式RD
- Ruby によるRDを採用したウィキ、RWiki
- Ruby からSDLライブラリを扱えるようにするRuby/SDL
- Ruby から Delphi を扱えるようにする Apollo
- Ruby によるウェブアプリケーションフレームワーク Ruby on Rails
- Ruby の別の処理系である YARV
- Ruby の統合開発環境 RDE
- Ruby のコードを Windows の実行形式ファイルに変換する Exerb
- Ruby 用のライブラリ管理システムである RubyGems
- Apache HTTP Server に組み込むための mod ruby
- サーバサイドでHTMLへの埋め込み Ruby 文を実現する eRuby
- Microsoft Windows の ActiveX 環境で Ruby インタープリターを呼び出す ActiveScriptRuby(Internet Explorer 限定だがHTMLに埋めこんでクライアント上で動かすスクリプト言語として Rubyを指定できるようになる)
- Ruby から Win32API やCOMコンポーネントを呼び出すためのライブラリー WIN32OLE
- JavaScript や Flash 上で動く Ruby の処理系 HotRuby
- Ruby によるビヘイビア駆動開発のためのフレームワーク RSpec
- Ruby で書かれたビルドツール Rake
Rubyで開発されたアプリケーション[編集]
Rubyを組み込んだアプリケーション[編集]
- RPGツクールXP・RPGツクールVX
- 株式会社エンターブレインから発売されているRPG制作ソフトシリーズのうち、RPGツクールXPとRPGツクールVXでは、Ruby をツクール専用にカスタマイズした RGSSを搭載している。同シリーズの従来ソフトではあらかじめ用意された機能しか使えなかったが、RGSSにより戦闘などのシステムを一から構築する事が出来るようになった。
エピソード[編集]
Ruby ではブロック構造を end で終える構文が採用されているが、開発者のまつもとゆきひろは他の構文が採用される可能性があったことを述べている。当時、Emacs 上で end で終える構文をオートインデントさせた例はあまりなく、Ruby 言語用の編集モードにオートインデント機能を持たせられるかどうかが問題になっていたためである[注釈 1]。実際には数日の試行でオートインデント可能であることがわかり、現在の構文になった。C言語のような{~}を使った構文も検討されていたが、結局これは採用されなかった[5]。
参考文献[編集]
- 高橋征義、後藤裕蔵 『たのしい Ruby Rubyではじめる気軽なプログラミング』 まつもとゆきひろ監修、ソフトバンクパブリッシング、2002年4月。ISBN 4-7973-1408-7。 - プログラム未経験者向けの入門書。
- 高橋征義、後藤裕蔵 『たのしいRuby Rubyではじめる気軽なプログラミング』 まつもとゆきひろ監修、ソフトバンクパブリッシング、2006年8月、第2版。ISBN 4-7973-3661-7。
- 高橋征義、後藤裕蔵 『たのしい Ruby』 まつもとゆきひろ監修、ソフトバンクパブリッシング、2010年3月、第3版。ISBN 978-4-7973-5740-0。
- デビット・トーマス、アンドリュー・ハント 『プログラミングRuby 達人プログラマーガイド』 田和勝訳、まつもとゆきひろ監修、ピアソン・エデュケーション、2001年9月。ISBN 4-89471-453-1。
- Dave Thomas、Chad Fowler・Andy Hunt 『プログラミング Ruby 言語編』 田和勝訳、まつもとゆきひろ監修、オーム社、2006年8月、第2版。ISBN 4-274-06642-8。
- Dave Thomas、Chad Fowler・Andy Hunt 『プログラミング Ruby ライブラリ編』 田和勝訳、まつもとゆきひろ監修、オーム社、2006年8月、第2版。ISBN 4-274-06643-6。
- Dave Thomas、Chad Fowler・Andy Hunt 『プログラミング Ruby 1.9 言語編』 田和勝訳、まつもとゆきひろ監修、オーム社、2010年5月。ISBN 978-4-274-06809-6。
- Dave Thomas、Chad Fowler・Andy Hunt 『プログラミング Ruby 1.9 ライブラリ編』 田和勝訳、まつもとゆきひろ監修、オーム社、2010年5月。ISBN 978-4-274-06810-2。
- David Flanagan、まつもとゆきひろ 『プログラミング言語 Ruby』 卜部昌平監訳、長尾高弘訳、オライリー・ジャパン、2009年1月。ISBN 978-4-87311-394-4。
- まつもとゆきひろ、石塚圭樹 『オブジェクト指向スクリプト言語 Ruby』 アスキー〈ASCII software science : Language 11〉、1999年11月。ISBN 4-7561-3254-5。
- まつもとゆきひろ 『まつもとゆきひろ コードの世界~スーパー・プログラマになる14の思考法』 日経Linux編集、日経BP社、2009年5月。ISBN 978-4-8222-3431-7。
脚注[編集]
- ^ Intro - D Programming Language 1.0 - Digital Mars
- ^ “Ruby'sライセンスの、BSDLとのデュアルライセンスへの変更” (日本語). ruby-dev mailing list.. (2010年9月24日) 2011年4月20日閲覧。
- ^ a b “プログラム言語Ruby、国際規格として承認” (プレスリリース), 独立行政法人情報処理推進機構, (2012年4月2日)
- ^ http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/39878
- ^ まつもとゆきひろ 「探訪 Ruby 第6回」『Linux Magazine』56号、株式会社アスキー、2004年。
- ^ まつもとゆきひろは1988年に Emacs に触れて以来、Emacsを使い続けている。(大竹智也 「本書に寄せて」『Emacs実践入門 思考を直感的にコード化し、開発を加速する』 技術評論社、2012年4月5日、初版第1刷、iiiからivページ。ISBN 978-4-7741-5002-4。、まつもとによる記述より)
関連項目[編集]
外部リンク[編集]
|
||||||||||||||||||||||||||

