BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース dot42 - AndroidのDalvikランタイム用C#コンパイラ

dot42 - AndroidのDalvikランタイム用C#コンパイラ

原文(投稿日:2013/02/06)へのリンク

 

Mono for Androidのもっとも大きなデメリットは,Androidが想定しているものとはまったく異なるランタイムであるMono上でプログラミングしなければならないことだ。CLRの機能をすべて活用できるというメリットは確かにあるが,CLRコールとAndroidのDalvikランタイム間に必要なマーシャリング処理のコストは小さくない。それならばILコードをスキップして,直接dexコードを生成するようにしたらどうだろう?

実を言うと,この説明には少し誇張がある。dot42 コンパイラはILをスキップしている訳ではない。ILコードを読み込んで,RLまたはRegister Languageと呼ばれる別の言語に変換しているのだ。ILとRLのおもな違いとしては,ILがスタックベース(Javaのバイトコードにやや近い)であるのに対して,RLがレジスタを主体としている点がある。RLに変換された後は,一連の最適化が実行され,最終的なコードに再びコンパイルされる。この最後のコンパイル処理によって,AndroidのDalvikランタイム用のdexコードが生成されるのだ。

.NET独自のデバッグ情報は,それぞれの処理ステップを通じて維持されている。ただし,当然ながらWindows/.NETのPDB形式からdexのデバッグ情報形式への変換は必要だ。dot42では,Visual Studioのデバッグ機能への接続手段として,Android Debug Bridgeを使用する。

Androidのライブラリには,直接JARファイルを参照してアクセスする。"コンパイル後のライブラリコールは,Android自体のライブラリコールにリダイレクトされます。" タイプ間のマッピングが必要な部分も一部あるが,大半はコンパイラによって処理される。例えば java.lang.Boolean はC#の Nullable<bool> にマップされる。

dot42がdexコードを出力することによって,使用できなくなるC#の機能もいくつかある。中でも注意が必要なのはユーザ定義の値型,すなわち構造体が使用できないことだ。Dalvikには存在しないものであるため,これをマップする手段はない。

dot42を使用すると,C#とAndroid,どちらの共通データ構造を使うかを決めなければならないことが多々あるだろう。.NETの List<T> と Javaの ArrayList<T>のどちらを使えばよいのか,というようにである。Ewout Prangsma氏によれば,メモリ使用量やダウンロードサイズに懸念がある場合は,Javaのデータ構造を使った方がよい。dot42の List<T> の実装は,基本的には ArrayList<T> に薄いラッパを被せたものに過ぎないが,それでも余分なコードをパックして,デバイスに転送する必要があることに変わりない。

dot42は有償のソフトウェア製品である。価格は通常のバルクライセンスオプションで,開発者あたり499ユーロからとなっている。

 

この記事に星をつける

おすすめ度
スタイル

BT