1. takeyuweb

    Posted

    takeyuweb
Changes in title
+CRuby以外のRuby実装について調べたよ
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,296 @@
+# Ruby実装
+[ruby-build](https://github.com/rbenv/ruby-build)にでてくるいろんな実装、見たことはあってもよく知らなかったので調べてみた。ソースが割と適当なので、あまり真に受けずゆるい読み物としてお楽しみください。
+
+思い込み、勘違いなどありましたら、ご指摘ください。
+
+# 調査対象
+
+Rubyライクな言語ではなく、Ruby言語の実装であること。
+
+- ruby-buildに含まれるもの
+ - Ruby(公式な実装、所謂CRuby)
+ - JRuby
+ - MagLev
+ - mruby
+ - Rubinius
+ - Ruby Enterprise Edition
+ - Topaz
+- それ以外
+ - IronRuby
+ - MacRuby
+ - Cardinal
+ - HotRuby
+ - TruffleRuby
+ - RubyMotion
+ - GoRuby
+- おまけ
+ - Opal
+
+# はじめにまとめ
+
+- 実用的そうなのは(やっぱり)CRubyかJRubyなので素直にそれ使いましょう
+ - JRuby思ってたよりがんばってる感
+
+| | 最新リリース / リリース日 | 公式実装との互換性 | [公式サイトの処理系案内](https://www.ruby-lang.org/ja/about/) | 備考 |
+| ---------------------------------------------------------------- | ------------------------- | --------- | -------------------------------------------------- | ----------------- |
+| Ruby (CRuby) | 2.4.2 / 2017年9月14日 | - | - | 公式 |
+| [JRuby](http://jruby.org/) | 9.1.14.0 / 2017年11月8日 | 2.3.x | あり | |
+| [MagLev](https://maglev.github.io/) | 1.0.0 / 2011年10月31日 | 1.8.7 | あり | |
+| [mruby](http://mruby.org/) | 1.3.0 / 2017年7月4日 | 部分的 | あり | |
+| [Rubinius](https://rubinius.com/) | 3.86 / 2017年9月27日 | 2.4 | あり | |
+| [Ruby Enterprise Edition](http://www.rubyenterpriseedition.com/) | 1.8.7-2012.02 /2012年2月21日 | 1.8.7 | なし | 終了 |
+| [Topaz](https://github.com/topazproject/topaz) | 0.1? / 2013年2月6日 | 部分的 | なし | 未完成色強い |
+| [IronRuby](http://ironruby.net/) | 1.1.3 / 2011年3月13日 | 1.9.2 | あり | |
+| [MacRuby](http://macruby.org/) | 0.12 / 2012年6月9日 | 1.9.x | あり | 事実上終了、RubyMotionへ |
+| [Cardinal](https://github.com/parrot/cardinal) | リリースなし | 部分的 | あり | 実験的 |
+| [HotRuby](http://hotruby.yukoba.jp/) | 2008年1月15日? | 部分的 | なし | 実験的 |
+| [TruffleRuby](http://chrisseaton.com/rubytruffle/) | 0.29 / 2017年10月? | 2.3.3 | なし | JRubyのフォーク。まだ実験的。 |
+| [RubyMotion](http://www.rubymotion.com/) | | | なし | MacRubyのフォーク |
+| [GoRuby](https://github.com/goruby/goruby) | | 部分的 | なし | 先は長そう |
+| [Opal](http://opalrb.com/) | 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](http://jruby.org)は、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](https://ja.wikipedia.org/wiki/Ruby)[インタプリタ](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF)の[Java](https://ja.wikipedia.org/wiki/Java)による実装である。[フリーソフトウェア](https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)であり、[CPL](https://ja.wikipedia.org/wiki/Common_Public_License)/[GPL](https://ja.wikipedia.org/wiki/GNU_General_Public_License)/[LGPL](https://ja.wikipedia.org/wiki/GNU_Lesser_General_Public_License) の3つのライセンスを採用している。JRuby は[Java](https://ja.wikipedia.org/wiki/Java)と密に連携しており、インタプリタを任意のJavaアプリケーションに埋め込むことができ、JavaとRubyのコード間で双方向のアクセスを可能にしている。
+> https://ja.wikipedia.org/w/index.php?title=JRuby&oldid=64492270
+
+Ruby Kaigi 2017 LightningTalkの[ドワンゴのkinoppydさんがニコニコ動画のコメントサーバのWebSocketプロキシをRubyで書いたもののいろいろあって当初予定よりも大量のアクセスを裁く必要性に迫られマルチスレッドの速いJRubyにして幸せになった話(超訳)](https://niconare.nicovideo.jp/watch/kn2595)が個人的に印象に残っています。
+
+## MagLev(まぐれぶ)
+
+https://maglev.github.io/
+[https://en.wikipedia.org/wiki/MagLev_(software)](https://en.wikipedia.org/wiki/MagLev_(software))
+[MagLev:GemstoneがSmalltalk VMをベースに構築するRubyランタイム](https://www.infoq.com/jp/news/2008/05/maglev-gemstone-builds-ruby)
+
+
+> [MagLev](http://ruby.gemstone.com)は、オブジェクトの永続化と分散共有キャッシュを持った、高速で安定した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特性](https://ja.wikipedia.org/wiki/ACID_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E7%A7%91%E5%AD%A6))を備えるトランザクションデータストア製品として金融・運送業などで使われてきたそうで、MagLevはこの分散オブジェクトテクノロジーでRubyを実行するというもの。複数のRubyインスタンス間でオブジェクトを扱える。
+[同名のGoogleによるロードバランサー](https://www.school.ctc-g.co.jp/columns/nakai2/nakai201.html)とは無関係。(たぶん)
+ちなみにMagLevとは磁気浮上式鉄道のこと。
+
+## mruby(えむるびー)
+
+http://mruby.org/
+[Web界から組み込みに向けられた刺客「mruby」はこう使われている](http://monoist.atmarkit.co.jp/mn/articles/1601/12/news016.html)
+
+
+> [mruby](http://www.mruby.org/)はRubyの軽量実装です。アプリケーションにリンクし、組み込むことができます。Rubyの作者であるまつもと ゆきひろ氏によって開発が進められています。
+> https://www.ruby-lang.org/ja/about/
+
+エンベッドシステムの他、他のソフトウェアを拡張する用途などで使われているようです。後者の競合としては[Lua](https://www.lua.org/)あたりになりそうです。余談ですがLuaといえばラグナロクオンラインというMMORPGで『ホムンクルス』というNPCキャラクターを味方にできたのですが、その行動パターンをLuaで記述することができ、僕もやっていましたが正直書きやすい言語ではなかったので、そのときにmrubyがあれば嬉しかったなと。(個人の感想です)
+話が逸れましたが、実例としてApache/Nginxの柔軟な設定・拡張を可能にする[mod_mruby](http://mod.mruby.org/)/[ngx_mruby](https://github.com/matsumotory/ngx_mruby)、ハードウェア機器の制御プログラム作成などに使われているようです。またRubyでiOSアプリが書ける[MobiRuby](http://mobiruby.org/)は処理系としてmrubyを採用しているそうです。
+[本記事作成時(2017年11月19日)最新の1.3.0ではぼっち演算子などRuby 2.3の機能も入ってたりします。](http://mruby.org/releases/2017/07/04/mruby-1.3.0-released.html)
+
+## Rubinius(るびにうす)
+
+https://rubinius.com/
+
+
+> [Rubinius](http://rubini.us)は「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](https://qiita.com/k0kubun/items/927be4411b8a629409a4)
+GILがないためスレッドセーフへの意識が必要→[週刊Railsウォッチ(20170210)JRubyやRubiniusの配列への追加はスレッドセーフではないほか](https://techracho.bpsinc.jp/hachi8833/2017_02_10/35059)
+
+現在は、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(るびーえんたーぷらいずえでぃしょん)
+
+http://www.rubyenterpriseedition.com
+
+Passengerで有名なPushionが(MRI)RubyをベースにRuby on Rails向けにメモリ関係の最適化を施し省メモリ高速化を実現&分析・デバッグ機能を追加したというものでした。
+Ruby 1.9の登場により役目を終えましたが、Ruby 1.8時代のRailsエンジニアにはなじみ深い処理系でした。
+
+## Topaz(とぱーず)
+
+http://topazruby.com/
+[本家の5倍速? Pythonで実装したRuby処理系の「Topaz」が登場](http://el.jibun.atmarkit.co.jp/rails/2013/02/5-pythonrubytop-0220.html)
+
+TopazはRPythonで書かれたRuby処理系です。
+RPythonの”R”はRubyの”R”ではなく、Ristricted(制限された) の”R”で、RPython Toolchainの中で動的言語インタプリタを実装するのに使われるものだそうです。
+[RPythonの情報とRPythonで実装されている言語処理系](http://rokujyouhitoma.hatenablog.com/entry/2015/06/12/115239)
+https://ja.wikipedia.org/wiki/PyPy
+
+
+> PyPyは、Python(の制限版であるRPython)で実装されたPythonの処理系である。したがって、Python処理系上でPyPyを動作させることも可能であるため、PyPyの中から改善できる領域を見極めることや、開発者が様々な実験的な実装を試すことが容易になっている。
+> PyPyは、Pythonだけでなく、一般の[動的プログラミング言語](https://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)の実装を作るためのツールキットおよびフレームワークとしても使うことができる。PyPyでは、言語仕様の定義とその具体的かつ低水準な実装を分離できるようにしている。Python以外の言語を本格的に実装した例として、PyPyで実装された[Ruby](https://ja.wikipedia.org/wiki/Ruby)の処理系である[Topaz](https://ja.wikipedia.org/wiki/Topaz)がある。
+> PyPyの目的の1つは、Pythonの柔軟かつ高速な実装を作ることである。上記のフレームワークを使うことで、低水準な詳細を混入せずに高度な機能を実装できるようになっている。
+> https://ja.wikipedia.org/w/index.php?title=PyPy&oldid=64415362
+
+
+## IronRuby(あいあんるびー)
+
+http://ironruby.net/
+[IronRuby はご臨終でしょうか ?](https://qiita.com/tadnakam/items/1892ab27dee014f7df90)
+
+
+> [IronRuby](http://www.ironruby.net)は、.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環境](http://news.mynavi.jp/articles/2008/03/17/macruby_for_leopard/002.html)
+
+
+> [MacRuby](http://www.macruby.org)は、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
+
+https://github.com/parrot/cardinal
+
+
+> [Cardinal](https://github.com/parrot/cardinal)はPerl6用の仮想マシンである[Parrot](http://parrot.org)上のRubyコンパイラです。
+> https://www.ruby-lang.org/ja/about/
+
+
+> Parrot Virtual Machine([http://www.parrot.org/](http://www.parrot.org/))上で動作するRubyコンパイラ。
+> http://www.ruby.or.jp/ja/tech/install/ruby/implementations.html
+
+RubyのプログラムをコンパイルしてParrotVM上で実行できるようにするプロジェクトです。Ruby言語で書かれたソースコードを中間コンパイルコードに変換して、Parrotでコンパイルして実行します、とのこと。
+
+ParrotVMについては[Wikipedia](https://ja.wikipedia.org/wiki/Parrot)
+
+> **Parrot** は[レジスタ](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%B7%E3%83%B3)ベースの[仮想機械](https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E6%A9%9F%E6%A2%B0)(仮想マシン)で、[動的プログラミング言語](https://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)を効率的に動作させるために開発された、[C言語](https://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E)で書かれたソフトウェアである。Parrotは他の多くの仮想マシンと異なり、[型](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B)情報を扱うことができる。[Parrot アセンブリ言語](https://en.wikipedia.org/wiki/Parrot_assembly_language)と[PIR](https://en.wikipedia.org/wiki/Parrot_intermediate_representation)(Parrot[中間言語](https://ja.wikipedia.org/wiki/%E4%B8%AD%E9%96%93%E8%A8%80%E8%AA%9E))をParrotの[バイトコード](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89)に変換し、実行することができる。
+> https://ja.wikipedia.org/w/index.php?title=Parrot&oldid=65887573
+
+名前は紅色のParrot(オウム)の一種Cardinal Lory(ベニインコ)から。
+
+## HotRuby
+
+http://hotruby.yukoba.jp/
+
+
+> WebブラウザとFlashで動作するRuby。JavaScriptとActionScriptで実装されている。
+> http://www.ruby.or.jp/ja/tech/install/ruby/implementations.html
+
+
+> 基本的な文法は、大体、実装しました。ただし、[組み込み](http://d.hatena.ne.jp/keyword/%C1%C8%A4%DF%B9%FE%A4%DF)[関数](http://d.hatena.ne.jp/keyword/%B4%D8%BF%F4)や組み込み[クラス](http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%B9)は、大部分が実装されていません。文法面でも、例外は実装していません。
+> 仕組みは、一度、[サーバー](http://d.hatena.ne.jp/keyword/%A5%B5%A1%BC%A5%D0%A1%BC)の Ruby 1.9.0 の YARV でオペ[コード](http://d.hatena.ne.jp/keyword/%A5%B3%A1%BC%A5%C9)列に[コンパイル](http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB)させて、それを [JSON](http://d.hatena.ne.jp/keyword/JSON) で[クライアント](http://d.hatena.ne.jp/keyword/%A5%AF%A5%E9%A5%A4%A5%A2%A5%F3%A5%C8)側に渡し、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](http://hashiwa.hatenablog.com/entry/2017/01/09/172949)
+
+Oracleの[GraalVM](http://www.oracle.com/technetwork/oracle-labs/program-languages/overview/index.html)というJVM向けJITコンパイラ上で動くRuby処理系の様子。JRubyのfork。
+とにかく高速なのがウリらしいです。
+SubstrateVMを使うことで、静的リンクされた実行可能バイナリを作ることができて、実行にJVMを必要としなくなるそうです。これによりJVMの起動時のコストをなくすることができるそうです。
+[Improving TruffleRuby’s Startup Time with the SubstrateVM](http://rubykaigi.org/2017/presentations/nirvdrum.html)
+
+
+ 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(ごーるびー)
+
+https://github.com/goruby/goruby
+
+> GoRuby, an implementation of Ruby written in Go
+
+GoによるRuby実装。
+チェックリストを見るとまだまだ先は長そうですね。
+
+```bash
+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が詰まっています。
+> それはランタイムとして高速であり、フットプリントでも小さい。
+>
+> http://opalrb.com/
+
+[The Ruby Spec Suiteをパスしている](http://yhara.jp/2016/12/07/opal-and-rubyspec)ということで、RubyライクではなくRuby言語といっていいでしょう。たぶん。というわけでOpal。
+
+RubyでJavaScriptを書けるだなんて・・・!
+[GitHubのリポジトリ](https://github.com/opal/opal)をみるとなかなか活発なようで、日本でも[昨年のアドベントカレンダー](https://qiita.com/advent-calendar/2016/opal)作成者の方が、[Pragmatic Opalという同人誌](https://youchan.booth.pm/items/665611)を書かれています。
+
+```bash
+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
+```