この記事はRuby Advent Calendar 2017 8日目の記事です。
ruby-buildにでてくるいろんな実装、見たことはあってもよく知らなかったので調べてみた。ソースが割と適当なので、あまり真に受けずゆるい読み物としてお楽しみください。
思い込み、勘違いなどありましたら、ご指摘ください。
調査対象
Rubyライクな言語ではなく、Ruby言語の実装であること。
- ruby-buildに含まれるもの
- それ以外
- おまけ
はじめにまとめ
- 実用的そうなのは(やっぱり)CRubyかJRubyなので素直にそれ使いましょう
- JRuby思ってたよりがんばってる感
最新リリース / リリース日 | 公式実装との互換性 | 公式サイトの処理系案内 | 備考 | |
---|---|---|---|---|
Ruby (CRuby) | 2.4.2 / 2017年9月14日 | - | - | 公式 |
JRuby | 9.1.14.0 / 2017年11月8日 | 2.3.x | あり | |
MagLev | 1.0.0 / 2011年10月31日 | 1.8.7 | あり | |
mruby | 1.3.0 / 2017年7月4日 | 部分的 | あり | |
Rubinius | 3.86 / 2017年9月27日 | 2.4 | あり | |
Ruby Enterprise Edition | 1.8.7-2012.02 /2012年2月21日 | 1.8.7 | なし | 終了 |
Topaz | 0.1? / 2013年2月6日 | 部分的 | なし | 未完成色強い |
IronRuby | 1.1.3 / 2011年3月13日 | 1.9.2 | あり | |
MacRuby | 0.12 / 2012年6月9日 | 1.9.x | あり | 事実上終了、RubyMotionへ |
Cardinal | リリースなし | 部分的 | あり | 実験的 |
HotRuby | 2008年1月15日? | 部分的 | なし | 実験的 |
TruffleRuby | 0.29 / 2017年10月? | 2.3.3 | なし | JRubyのフォーク。まだ実験的。 |
RubyMotion | なし | MacRubyのフォーク | ||
GoRuby | 部分的 | なし | 先は長そう | |
Opal | v0.10.5 / 2017年6月21日 | 2.2.7? | なし | JavaScriptトランスコンパイラ |
Ruby処理系
Ruby
C言語で実装されたRubyの公式処理系。すべてのプラットフォームで動作可能。Rubyアソシエーションの理事長である まつもとゆきひろ により開発され始めたもので、最も広く使われている。
http://www.ruby.or.jp/ja/tech/install/ruby/implementations.html
JRuby(じぇいるびー)
http://jruby.org/
https://ja.wikipedia.org/wiki/JRuby
JRubyは、JVM(Java仮想マシン)上に構築されたRubyです。 JVMの最適化されたJITコンパイラやGC、並行スレッド、ツール群、そして膨大なコレクションのライブラリを使うことができます。
https://www.ruby-lang.org/ja/about/
Java言語で実装されたRubyの処理系。RubyのコードをクロスプラットフォームであるJVM(Java Virtual Machine)上で実行でき、Rubyで実装されたコード上でJavaのライブラリが利用可能である。インタプリタ・実行時コンパイラ・事前コンパイラ の3種類が用意されている。
http://www.ruby.or.jp/ja/tech/install/ruby/implementations.html
JRuby は、RubyインタプリタのJavaによる実装である。フリーソフトウェアであり、CPL/GPL/LGPL の3つのライセンスを採用している。JRuby はJavaと密に連携しており、インタプリタを任意のJavaアプリケーションに埋め込むことができ、JavaとRubyのコード間で双方向のアクセスを可能にしている。
https://ja.wikipedia.org/w/index.php?title=JRuby&oldid=64492270
Ruby Kaigi 2017 LightningTalkのドワンゴのkinoppydさんがニコニコ動画のコメントサーバのWebSocketプロキシをRubyで書いたもののいろいろあって当初予定よりも大量のアクセスを裁く必要性に迫られマルチスレッドの速いJRubyにして幸せになった話(超訳)が個人的に印象に残っています。
MagLev(まぐれぶ)
https://maglev.github.io/
https://en.wikipedia.org/wiki/MagLev_(software)
MagLev:GemstoneがSmalltalk VMをベースに構築するRubyランタイム
MagLevは、オブジェクトの永続化と分散共有キャッシュを持った、高速で安定したRuby処理系です。
https://www.ruby-lang.org/ja/about/
64ビットのSmalltalk Virtual MachineであるGemStone/S上に構築されたRuby Virtual Machine。Linux, Mac OS X, Solarisで動作可能。Rubyをバイトコードに変換し、実行時コンパイラによってネイティブコードに変換している。ターゲットはMRI1.8.7。
http://www.ruby.or.jp/ja/tech/install/ruby/implementations.html
Smalltalk処理系の1つGemStone/Sの開発元が開発したSmalltalk VM上で動くRuby実装だそう。
もともとGemStone/Sはオブジェクトを永続化・分散し、ACID特性を備えるトランザクションデータストア製品として金融・運送業などで使われてきたそうで、MagLevはこの分散オブジェクトテクノロジーでRubyを実行するというもの。複数のRubyインスタンス間でオブジェクトを扱える。
同名のGoogleによるロードバランサーとは無関係。(たぶん)
ちなみにMagLevとは磁気浮上式鉄道のこと。
mruby(えむるびー)
http://mruby.org/
Web界から組み込みに向けられた刺客「mruby」はこう使われている
mrubyはRubyの軽量実装です。アプリケーションにリンクし、組み込むことができます。Rubyの作者であるまつもと ゆきひろ氏によって開発が進められています。
https://www.ruby-lang.org/ja/about/
エンベッドシステムの他、他のソフトウェアを拡張する用途などで使われているようです。後者の競合としてはLuaあたりになりそうです。余談ですがLuaといえばラグナロクオンラインというMMORPGで『ホムンクルス』というNPCキャラクターを味方にできたのですが、その行動パターンをLuaで記述することができ、僕もやっていましたが正直書きやすい言語ではなかったので、そのときにmrubyがあれば嬉しかったなと。(個人の感想です)
話が逸れましたが、実例としてApache/Nginxの柔軟な設定・拡張を可能にするmod_mruby/ngx_mruby、ハードウェア機器の制御プログラム作成などに使われているようです。またRubyでiOSアプリが書けるMobiRubyは処理系としてmrubyを採用しているそうです。
本記事作成時(2017年11月19日)最新の1.3.0ではぼっち演算子などRuby 2.3の機能も入ってたりします。
Rubinius(るびにうす)
Rubiniusは「Rubyで書かれたRuby」です。LLVM上に構築されています。LLVMは他の言語も構築されるよくできた仮想マシンです。
https://www.ruby-lang.org/ja/about/
高速なRuby実行環境を目指して開発されたRubyの処理系。Mac OS X、Linux、FreeBSDをサポートしている。Rubiniusはバイトコード仮想マシンがC++で実装されており、実行時にはLLVM(Low Level Virtual Machine)と連携してネイティブコードを生成する仕組みになっている。バイトコードコンパイラとクラスの大半はRubyで記述されている。現在の RubiniusがターゲットにしているのはMRI 1.8.7。
http://www.ruby.or.jp/ja/tech/install/ruby/implementations.html
ざっくり把握するのに@k0kubunさんのメモを読みました→Rubinius Hacking Guide
GILがないためスレッドセーフへの意識が必要→週刊Railsウォッチ(20170210)JRubyやRubiniusの配列への追加はスレッドセーフではないほか
現在は、Ruby処理系というより、『Rubiniusは、静的型または動的型のオブジェクト指向言語と関数型言語の両方をサポートする機能を持つ、言語開発者のためのより一般的なプラットフォームを提供するように進化しました。(Rubinius has evolved to provide a more general platform for language developers with features that support both object-oriented and functional languages with static or dynamic types.)』と謳っているようです。
Ruby Enterprise Edition(るびーえんたーぷらいずえでぃしょん)
Passengerで有名なPushionが(MRI)RubyをベースにRuby on Rails向けにメモリ関係の最適化を施し省メモリ高速化を実現&分析・デバッグ機能を追加したというものでした。
Ruby 1.9の登場により役目を終えましたが、Ruby 1.8時代のRailsエンジニアにはなじみ深い処理系でした。
Topaz(とぱーず)
http://topazruby.com/
本家の5倍速? Pythonで実装したRuby処理系の「Topaz」が登場
TopazはRPythonで書かれたRuby処理系です。
RPythonの”R”はRubyの”R”ではなく、Ristricted(制限された) の”R”で、RPython Toolchainの中で動的言語インタプリタを実装するのに使われるものだそうです。
RPythonの情報とRPythonで実装されている言語処理系
https://ja.wikipedia.org/wiki/PyPy
PyPyは、Python(の制限版であるRPython)で実装されたPythonの処理系である。したがって、Python処理系上でPyPyを動作させることも可能であるため、PyPyの中から改善できる領域を見極めることや、開発者が様々な実験的な実装を試すことが容易になっている。
PyPyは、Pythonだけでなく、一般の動的プログラミング言語の実装を作るためのツールキットおよびフレームワークとしても使うことができる。PyPyでは、言語仕様の定義とその具体的かつ低水準な実装を分離できるようにしている。Python以外の言語を本格的に実装した例として、PyPyで実装されたRubyの処理系であるTopazがある。
PyPyの目的の1つは、Pythonの柔軟かつ高速な実装を作ることである。上記のフレームワークを使うことで、低水準な詳細を混入せずに高度な機能を実装できるようになっている。
https://ja.wikipedia.org/w/index.php?title=PyPy&oldid=64415362
IronRuby(あいあんるびー)
http://ironruby.net/
IronRuby はご臨終でしょうか ?
IronRubyは、.Netフレームワークにしっかりと統合されたRuby処理系です。
https://www.ruby-lang.org/ja/about/
.NET Framework上でRubyを動作させることができるRubyの処理系。.NET Frameworkのライブラリと連携させることができる(最新版で動作保証しているランタイムは.NET 4.0とSilverlight 4)。.NET上で動的言語を動作させる動的言語ライタイム(DLR)を利用し、共通言語ランタイム(CLR)上で動作している。実行時コンパイラによっ てRubyを動作させる。
http://www.ruby.or.jp/ja/tech/install/ruby/implementations.html
.NET Framework上で動作するRuby処理系です。Rubyで.NET Frameworkを使ったり、IronRubyを通してC#からRuby言語で書かれたスクリプトを実行したりできるようです。JRubyなどと同様にGIL(GVL)はありませんでした。
Rubyで.NET Frameworkを使ったGUIアプリを書けるとあって、僕は発表当時わりと楽しみにしていたのですが全く流行りませんでしたね。気になってはいたのですが、そうしている間に更新が止まってしまったので使う機会が完全に無くなった感あります。
ちなみにPython版のIronPythonもありますがこちらは2016年12月にアップデートがあったのでまだ状況はよいようです。
MacRuby(まっくるびー)
http://macruby.org/
「MacRuby」 - ひさしを借りて母屋を乗っ取るか? Mac OS Xの新たなRuby環境
MacRubyは、Mac OS X用のCocoaライブラリとしっかり統合されたRubyです。デスクトップアプリケーションを作成できます。
https://www.ruby-lang.org/ja/about/
Mac OS Xで動作するRubyの処理系。Objective-CラインタイムとCore Foundation上で動作する。MRI 1.9をターゲットとし、LLVM(Low Level Virtual Machine)を用いている。事前コンパイラと実行時コンパイラをサポートしている。
http://www.ruby.or.jp/ja/tech/install/ruby/implementations.html
Objective-CランタイムとCore Foundationフレームワークで作られたRuby実装とのこと。
MacRubyのObjectクラスはObjective-CのNSObjectのサブクラスで、つまりはMacRubyのすべてのオブジェクトはObjective-Cのオブジェクトという面白い性質があります。それに起因する挙動の違いもあったようですが・・・。
IronRubyと同様にObjective-CアプリケーションからRuby言語で書かれたスクリプトを実行することができたようです。
Cardinal(かーでぃなる)
CardinalはPerl6用の仮想マシンであるParrot上のRubyコンパイラです。
https://www.ruby-lang.org/ja/about/
Parrot Virtual Machine(http://www.parrot.org/)上で動作するRubyコンパイラ。
http://www.ruby.or.jp/ja/tech/install/ruby/implementations.html
RubyのプログラムをコンパイルしてParrotVM上で実行できるようにするプロジェクトです。Ruby言語で書かれたソースコードを中間コンパイルコードに変換して、Parrotでコンパイルして実行します、とのこと。
ParrotVMについてはWikipedia
Parrot はレジスタベースの仮想機械(仮想マシン)で、動的プログラミング言語を効率的に動作させるために開発された、C言語で書かれたソフトウェアである。Parrotは他の多くの仮想マシンと異なり、型情報を扱うことができる。Parrot アセンブリ言語とPIR(Parrot中間言語)をParrotのバイトコードに変換し、実行することができる。
https://ja.wikipedia.org/w/index.php?title=Parrot&oldid=65887573
名前は紅色のParrot(オウム)の一種Cardinal Lory(ベニインコ)から。
HotRuby(ほっとるびー)
WebブラウザとFlashで動作するRuby。JavaScriptとActionScriptで実装されている。
http://www.ruby.or.jp/ja/tech/install/ruby/implementations.html
基本的な文法は、大体、実装しました。ただし、組み込み関数や組み込みクラスは、大部分が実装されていません。文法面でも、例外は実装していません。
仕組みは、一度、サーバーの Ruby 1.9.0 の YARV でオペコード列にコンパイルさせて、それを JSON でクライアント側に渡し、JavaScript 上の RubyVM で実行しています。つまり、RubyVM on JavaScript です。
http://d.hatena.ne.jp/yukoba/searchdiary?word=%2a%5bHotRuby%5d
TruffleRuby(とりゅふるびー)
http://chrisseaton.com/rubytruffle/
http://rubykaigi.org/2017/presentations/nirvdrum.html
GraalVMとTruffle
OracleのGraalVMというJVM向けJITコンパイラ上で動くRuby処理系の様子。JRubyのfork。
とにかく高速なのがウリらしいです。
SubstrateVMを使うことで、静的リンクされた実行可能バイナリを作ることができて、実行にJVMを必要としなくなるそうです。これによりJVMの起動時のコストをなくすることができるそうです。
Improving TruffleRuby’s Startup Time with the SubstrateVM
yuichi@yuichi-ws:~/truffleruby/graalvm-0.29> jre/languages/ruby/bin/ruby -v
truffleruby 0.29, like ruby 2.3.3 <Java HotSpot(TM) 64-Bit Server VM 1.8.0_141-b15 with Graal> [linux-x86_64]
RubyMotion(るびーもーしょん)
http://www.rubymotion.com/
RubyでiOS、Android、OS Xで動くクロスプラットフォームアプリを書ける、という製品です。
MacRubyの開発者がRuby愛からAppleを退職して会社を設立した、という経緯を謳っています。
MacRuby のクリエータでリード開発者である、Laurent Sansonetti は Ruby をプッシュするためそれが叶わない (Apple のモバイル OS、iOS)、Apple を去る決断をしました。愛するものを作る生活を望み、会社の設立を決意しました。会社は Scratchwork Development と名付けられました。
http://www.rubymotion.com/jp/about/
有償製品ですし、Windowsユーザーの僕は試したことが無くよくわかりません。
GoRuby(ごーるびー)
GoRuby, an implementation of Ruby written in Go
GoによるRuby実装。
チェックリストを見るとまだまだ先は長そうですね。
yuichi@yuichi-ws:~/go/src/github.com/goruby/goruby> go get github.com/goruby/goruby
yuichi@yuichi-ws:~/go/src/github.com/goruby/goruby> cd $GOPATH/src/github.com/goruby/goruby
yuichi@yuichi-ws:~/go/src/github.com/goruby/goruby> go run cmd/girb/main.go
girb:001> puts 'Hello, GoRuby World!!'
Hello, GoRuby World!!
=> nil
girb:002>
yuichi@yuichi-ws:~/go/src/github.com/goruby/goruby> go run main.go ~/hello.rb
Hello, GoRuby World!!
おまけ
Opal(おぱーる)
http://opalrb.com/
https://qiita.com/advent-calendar/2016/opal 昨年のアドベントカレンダー
Opal is a Ruby to JavaScript source-to-source compiler.
It comes packed with the Ruby corelib you know and love.
It is both fast as a runtime and small in its footprint.Opalは、RubyからJavaScriptへのソース・ソースコンパイラです。
あなたが知っていると愛しているRubyのcorelibが詰まっています。
それはランタイムとして高速であり、フットプリントでも小さい。
The Ruby Spec Suiteをパスしているということで、RubyライクではなくRuby言語といっていいでしょう。たぶん。というわけでOpal。
RubyでJavaScriptを書けるだなんて・・・!
GitHubのリポジトリをみるとなかなか活発なようで、日本でも昨年のアドベントカレンダー作成者の方が、Pragmatic Opalという同人誌を書かれています。
yuichi@yuichi-ws:~> gem install opal
yuichi@yuichi-ws:~> opal -v
Opal v0.10.5
yuichi@yuichi-ws:~> echo 'puts RUBY_VERSION' > ruby_version.js.rb
yuichi@yuichi-ws:~> opal ruby_version.js.rb
2.2.7
WindowsにおけるRuby/Rails開発 2017 Winter
Ruby on Rails Advent Calendar 2017 1日目の記事も書きました。よろしければこちらもどうぞ!
自宅で黙々とRuby開発したいエンジニアを募集しています。
当社は自由に働けることを何より重視しているRuby on Rails受託会社です。
完全リモート、地方在住OK、完全フレックスで働きたいRailsエンジニアを募集中です。
週3日ぐらいからでも働けて、好きな日に開発できます。
一緒にRuby/Rails開発をしませんか?
自宅で黙々と開発したいRailsエンジニアを募集!フリーランスもOK! - タケユー・ウェブ株式会社のWeb エンジニア中途・契約・委託の求人 - Wantedly