Mirah : 静的型付けを持った Ruby 風の JVM 言語

今回は Ruby 風の構文を持った静的型付けの JVM 言語である Mirah について紹介します。

Mirah とは

Mirah はジャワ語(javanese)でルビーを意味しているらしいです。 この名前からもわかるように Mirah は Ruby の影響を強く受けているJVM 言語です。
Mirah の文法は基本的に Ruby ですが、 静的型付けなど一部変更し、 JVM で効率的に動作するようになっています。


ただし、静的型付けの Ruby というのが言語の特徴ですが、作者の意図としては Ruby を拡張した言語という位置づけではないらしいです。
じゃなにかというと、 Java の置き換えを狙った新言語です。 Ruby 風の構文を採用しているけど、 静的型は残したといった感じだと思います。 そのため、 『Java でできることはすべて Mirah できるが、 Ruby でできることの一部は Mirah ではできない』 というスタンスがとられています。
このように Mirah は Java の置き換えなので、基本的にコンパイルして使うことを想定して作られています。ただ、スクリプトとしても動作します。 Ruby 風なのに静的型付けにした理由はおそらく速度のためでしょう。 JVM に動的言語の対応機能が付いたとはいえ、 やはり JVM では静的型付けの方が速い(Java と同程度)と思います。また Java との連携もよくなります。
ただ、静的言語ですが、型推論もできるので、それほど頻繁に型指定を書く必要はありません。 メソッドの引数など必要最小限の型指定だけで済むようにもなっています。
しかし、贅沢をいえば、自動ジェネリックでメソッドの引数の型指定も省略できたらもっといいのに とは思います。 個人的には Ruby が "もっとも書きやすい言語" と思っています。ちょっとしたツールを作るスクリプト言語としては最適でしょう。
ただし、"大規模開発も Ruby でやりたいか"といわれると、それはまた別の話です。 速度やコードの安全性の面で大規模開発、多人数開発には不安な面があります。
それに対して、 Mirah は静的型による速度の向上や型指定、インターフェースなどコードの安全性の面にも優れ、 大規模開発にも使える能力を秘めていると思います。

特徴

Mirah の特徴をサンプルを挙げて紹介します。

静的型付けと型推論

まずは静的形付けでしょう。 ローカル変数の場合は型推論で省略し、関数の引数でだけ型指定しています。
greeting = "Hello World!"       # 型指定は省略
puts greeting
def fib(a:int)
  if a < 2
    a
  else
    fib(a - 1) + fib(a - 2)
  end
end

n = 10
puts "fib(#{n}): #{fib(n)}"

インターフェース

型指定できるなら、やっぱりインターフェースもほしいところです。 Mirah はちゃんとインターフェースも使えます。
import java.util.List

# インターフェース
interface Printer do
  def printAll(a:List)
    return void
  end
end

# インタフェースの実装
class MyPrinter
  implements Printer
  def printAll(a)
    a.each {|element| puts element}
  end
end

list = ['foo', 'bar', 'baz']
printer = MyPrinter.new
printer.printAll(list)

JRuby, Groovy との違い

Ruby 風の JVM 言語といえば、他にも JRubyGroovy があります。
JRuby 、 Groovy 、 Mirah はどれもスクリプト言語として動作し、事前コンパイルもできます。 違いを 構文の面から見ると次のような感じです。
言語 構文の特徴
JRuby Ruby の互換
Mirah 基本的に Ruby の構文で、静的型付けなど一部を改造
Groovy Ruby の影響を色濃く受けているが、新しい構文

JRuby

JRuby の目的は Ruby を JVM 上で動作させることです。
Rails アプリをコード修正することなく動作させることが目標とされいるように互換性が重視されています。

一方、 Mirah は Java の代替言語であり、目的が違います。
このため、Ruby との互換性もなく、Rails は動きません。ただ、 Mirah には Rails と似た Dubious という Web フレームワークも開発されています。 ちなみに Mirah の作者は JRuby の主要開発者の一人でもあります。
RPython で PyPy が書かれているように、 Mirah で JRuby が書かれるようになる可能性が将来的にはあるそうです。 ただ、現状では逆に Mirah が Ruby で書かれています。

Groovy

Groovy は Java の置き換えや JVM と親和性の高いスクリプト言語など目的や特徴は Mirah とほぼ同じです。
ただ、 Mirah の方がより Ruby に近いです。このため Ruby ユーザーにとっては学習コストも低いでしょう。

Ruby が素晴らしい言語なのは間違いありません。しかし、 JVM 言語として考えた場合には、必ずしも Ruby に近い方がより優れた言語とは言えません。 この辺の Mirah がいいか、 Groovy がいいかは好みの問題でしょう。
現時点では、 シェアの広さや成熟度は Groovy の方が上のような気がします。 それらを重視するなら Groovy ですし、 より Ruby っぽさを重視したい場合は Mirah という感じではないかと思います。

Ruby と Groovy の違いについては以下の記事がわかりやすいと思います。

インストール

Mirah のインストールでは 3 つの方法が選べます。 Mirah を使う場合にはどっちにしろ JRuby が必要となってくるので、 jgem を使った方法が一番いいでしょう。
Windows 環境で説明していますが、 JRuby がインストール済みであれば、 jgem を実行するだけなので、他の環境でもほとんど一緒だと思います。


Mirah をつかうためにはまず JDK をインストールします。
この時、JAVA_HOME の環境変数も設定しておきます。 JDK のインストール方法については以前の記事をご覧ください。 JDK といった用語の説明も行っています。 次に JRuby をインストールします。
JRuby のインストールに関しては以下の記事をご覧ください。 jgem の使い方についても説明しています。 ここまで準備できていれば、 jgem のコマンド一発でインストールできます。
~ $ jgem install mirah

使い方

インストールが完了すると jruby の実行ファイルと同じフォルダーに以下のコマンドが追加されます。
コマンド(bat) 機能
mirah スクリプトとして実行
mirahc ソースをコンパイル
mirahp ソースのパース結果を表示

使い方は 3 つのコマンドともほとんど同じです。
ファイルを直接実行したい場合は mirah で、コンパイルして class ファイルを生成したい場合には mirahc を使用します。
mirahp を使うことはほとんどないと思います。


使用する場合はコマンド引数にソースファイルを渡して実行します。
~/lang/mirah $ mirah hello.mirah 
Hello World!
Ruby のように -e を使ったワンライナーの実行も可能です。
~/lang/mirah $ mirah -e "puts 'Hello, Mirah!'"
Hello, Mirah!
詳しくは -h, --help オプションで Usage が表示されるので、 そちらをご覧ください。

Emacs モードの設定

残念ながら、 Mirah 用の Emacs モードはまだありません。
ただ、 Ruby 用のモードで結構いけます。逆に Ruby 用モードで我慢できる分、誰も作っていないのでしょう。


おそらく Ruby 用のモードはデフォルトでインストールされていると思います。
以下の記述を ~/.emacs.d/init.el (~/.emscs.el) に追加すると *.mirah のファイルで ruby-mode となります。
 (add-to-list 'auto-mode-alist '("\\.mirah$" . ruby-mode))

感想

Mirah は非常に魅力的な言語だと思いました。
私は Ruby が好きですが、 オプショナルな型チェックやインターフェースがないのはちょっと不満です。 Mirah は自動ジェネリックこそないものの、インターフェース、型指定があるのは魅力です。
とはいえ、 JVM 上で動作するスクリプト言語としてみた場合、 使えるライブラリーの量などを考慮して、やっぱり JRuby を選びます。


Java の置き換え、Java.next(次世代 Java)としてみた場合には、なかなか有力な候補だと思います。
ただ、私は Ruby だけでなく、 Clojure も好きです。 実際にプログラムを作る場合にはその目的、用途にもよりますが、 次世代 Java としては構文の美しさ、並列処理の強さなどをもった Clojure を一番の候補に推します。 しかし、 同時に Clojure は独特な Lisp 構文や関数型プログラミングのため、 若干ハードルの高い言語でもあります。
Mirah は速度、コードの安全性を上げつつ、 Ruby の書きやすさ、覚えやすさも残しており、 ハードルの低い次世代 Java としてはいいのではないかと思います。


関連記事
スポンサーサイト



Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
31位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
5位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

08月 | 2023年09月 | 10月
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。