BT

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

| 作者: Jonathan Allen フォローする 595 人のフォロワー , 翻訳者 吉田 英人 フォローする 0 人のフォロワー 投稿日 2013年2月13日. 推定読書時間: 2 分 |

原文(投稿日: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ユーロからとなっている。

 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT