Mirah(旧称Duby)は、 Ruby言語の構文、ローカル型推論、ハイブリッド静的-動的型システム、プラグイン可能なコンパイラツールチェーンに基づいたプログラミング言語です。Mirah は、Charles Oliver Nutter によって「堅牢で高速、慣用的なJVMバイトコードにコンパイルできる、おそらく Ruby 構文のサブセットである『Ruby ライクな』言語」として作成されました。[ 1 ] mirahという単語は、ジャワ語で宝石のルビーを指し、Java の Ruby の概念をもじったものです。[ 2 ]
JRubyプロジェクトへのRubyコミュニティメンバーの参加を促進するため、NutterはRuby構文を静的型モデルとネイティブへの直接コンパイルで提供する可能性を探り始めました。この文脈における「ネイティブ」とは主にJava仮想マシン(JVM)を意味していましたが、Mirahは.NET Frameworkの共通言語ランタイム(CLR)のような他のオブジェクト指向ランタイムの代替バックエンドを持つ可能性を考慮して設計されています。この言語はRubyのような外観と操作感を持ち、JRubyに新たなライブラリ依存関係を導入せず(これは他のほとんどのJVM言語を排除します)、パフォーマンス上のペナルティを受けない(これはRubyでの記述を排除します)必要がありました。
Mirah(当時はDuby)の初期バージョンは、主に数学的なパフォーマンスに重点を置いていました。動的計画法では、この分野で最も高いコストが発生することが多いからです。その後、Mirahは完全なJVM言語へと進化し、多くのユーザーや実際のアプリケーションでコアコンポーネントとして使用されています。
Mirahは主にプラグイン可能なコンパイラツールチェーンです。そのチェーンの主な要素は以下のとおりです。
これらのフェーズのうち、最終的なターゲットプラットフォームに関する具体的な知識が必要となるのは最後の2つのフェーズのみです。このため、Mirahは多くのバックエンドに対応でき、また、サポートされているすべてのバックエンドに等しく適用できる、Mirahの変換フェーズ用の言語プラグインを作成することも可能になります。
単純なコード片やJVMバイトコードバックエンドの場合、Mirahコンパイラは標準のjavacコンパイラとほぼ同じ命令を生成します。
Mirahは単なるコンパイラであるため、標準ライブラリは付属していません。Mirahの意図は、ユーザーが使用したいライブラリを選択し、場合によってはMirahコンパイラがそれらをサポートするプラグインを作成し、残りの処理はコンパイラが行うことです。これは明確な設計目標であり、新たな外部ライブラリへの依存を避けることを目的としています。したがって、Mirahの標準ライブラリは、現在のバックエンドの標準ライブラリと同じであり、言語を拡張・強化するためのライブラリではなく、コンパイラプラグインの作成に重点が置かれています。
Mirahはユーザーに特定の型システムを強制せず、ターゲットとなるバックエンドが提供する型システムに依存します。JVM上では、型システムは主にJavaの型システムであり、型宣言はJVMのクラス、プリミティブ型、およびインターフェースを参照します。
Mirahは基本的に静的型付け言語ですが、動的型付けにも対応できるよう開発が進められています。その仕組みはC# 4と同様で、特別な動的型によって、その変数の値に対するすべてのディスパッチを動的に実行することが示されます。動的型のサポートは現在、新しいバイトコードを使用するJava 7以降のみを対象としていますinvokedynamic。
Mirahの構文はRubyの構文とほぼ同じですが、静的型付けをサポートするためにいくつかの変更が加えられています。
def foo ( a : String , b : int )interfaceJVMスタイルのインターフェースを指定するために使用される単語などがこれに該当します。これらの違いを除けば、Mirahのコードは概ねRubyのコードに似ています。
def fib ( a : int ) if a < 2 a else fib ( a - 1 ) + fib ( a - 2 ) end end2012年現在Mirahは現在開発中ですが、一部の開発者は限定的な範囲の運用アプリケーションでMirahを使用しています。
Dubiousは、 Google App Engine上でMirahを実行するためのプロジェクトです。Ruby on RailsやSinatraを使用している開発者にとって馴染みのある規約で、Mirahアプリケーションを構築する方法を提供します。すべてが事前にコンパイルされるため、MirahアプリケーションにはJRubyに関連する初期化コストは一切かかりません。DubiousはERuby (ERb)をサポートしており、 Datamapperに似た構文を使用するシンプルなデータストアアダプタを備えています。