2012年5月17日

AndroidをC#に移植 (翻訳)




こんにちは。きねぶちです。

昨日紹介したXobotOS、ミゲルさんの元記事があまりに面白かったので、翻訳してみました。

今日は丸ごと翻訳記事です。

元の記事は「Android Ported to C#」

AndroidをC#に移植 by Miguel de Icaza

Javaの使い方をめぐってOracleとGoogleが10億ドル賭けて争ってるね。

Androidのネイティブアプリを作成するには、Javaは唯一の選択肢ではない。というより、ベストの選択肢でさえないんだ。私たちは、Javaの代わりにC#を使うことで、実行速度に優れ、バッテリーを消費しない開発手段を提供している。私たちの開発しているMonoプラットフォームは.NET frameworkのオープンソース実装で、Javaで書かれたOS上でC#を使ってアプリを書くことができるものだ。1つのソースからiOS版、Winodws Phone版を作ることができる。


SunのJavaとは違って、MicrosoftはC#.NET VMをECMAに標準化手続きを委ね、ついにはISO標準として採用されるところまで面倒を見た。その上、個人に対しては自らの特許を主張しないことを約束しているMicrosoftのこの声明は完全に法的に有効だ

昨年の7月にXamarinを設立したとき、Bostonでチームメンバーが顔を合わせ、Mono for iOSとMono for Androidをこれからどう発展させていくか話し合った。チャールズ川でカヤックを楽しんだ後ディナーの席に腰をおろして、どうすればAndroidアプリのパフォーマンスとバッテリー消費量を改善できるか、Mono for Androidをもっとよくしていくにはどうしたらよいかを中心に話をした。



何度も行き着いたのは、次の問題だ。Dalvikは成熟していない仮想マシンで、Monoのように最適化が進んでいない。しかも、ハイエンド向けのJava最適化技法のOracle HotSpotの恩恵も受けていないから、Javaの実行性能上の制約を数多く受けている。そのディナーで、チームメンバーは、AndroidのソースをC#で書き換えればいいんじゃないか、というクレイジーなアイディアを出してきた。そうすれば、構造体やP/Invoke、制限のないジェネリック型、それに私たちが培ってきた成熟したランタイムといったC#のパフォーマンス上のメリットを享受できる。

その時は話だけで終わったけれど、そのアイディアは深く私たちの心に残った。

その数カ月後にMono for Androidをリリースしたとき、私たちの製品のAndroid上での性能を向上させるにはどうしたらよいか、再び考え始めた。Java部分をC#で書き換えて、Dalvikのさまざまな制約を取り払ったらどうだろう?JavaコードもDalvik VMもいっさい使わないAndroid端末を作ることは可能だろうか?

チャレンジする価値のあることだと思った。そこで、社内に専門の研究プロジェクトを立ち上げた。目標はAndroidのJavaソースをC#に自動的に変換すること。プロジェクトはXobotOSと名付けた。

XobotOS研究プロジェクト

プロジェクトの成果として、AndroidのレイアウトとウィジェットのほとんどをC#で書くことができるようになった。Linux上で動作するXobotOSのスクリーンショットを載せよう。Javaコードは1行も含まれていない。



これを実現するには、AndroidのJavaコードの大半をC#に変換する必要があった。だから、このスクリーンショットは非常に大きな進歩の結果なんだ。どうやったのか説明しよう。

SharpenによるJavaトランスレーション

Androidのコアコードは100万行を越えるJavaソースだ。そして、Androidの最新リリースを常にキャッチアップできるようにしたい。実際、2011年に作業を始めたときはAndroid 2.x系だったが、今年の初めにGoogleがオープンソースのIce Cream Sandwichをリリースしたとき、XobotOSもAndroid 4.0にアップデートしている。したがって、JavaをC#に自動的に変換し、そのためのツールを構築してメンテナンスしていくという選択肢しか考えられなかった。

ツールの作成を始めたとき、Sharpenという名前をつけた。SharpenはFrank Kruegerのようなエンジニアには素晴らしく役に立つツールで、Javaアプレットをわずか2ヶ月で、賞をもらえるような素晴らしいiPadアプリに移植できた

Sharpenにたくさんの改良を加えた結果、誰でもJavaからC#に変換できるツールに成長した。Sharpenの改良したバージョンを今日リリースした。一緒にXobotOSのソースも公開したので、多くの人に役立てると思うし、色々な人がコントリビュートしてくれると嬉しい。

実行性能

Mono上でAndroidを実行したとき、誰の頭にも浮かぶのはDalvikに比べてMonoはどれくらい高速なのか、という疑問だ。

MicrosoftはC#の言語仕様を変更し、最適化が容易になるような重要な変更をおこなった。小さなオブジェクトのオーバーヘッドを減らすためにvalue型が導入されたり、バーチャルメソッドがオプトアウト方式ではなくオプトイン方式で生成されるようになるなどだ。JavaとC#は、ジェネリック型の実装方法で方向性が分かれた。Javaは後方互換性を最大限確保する方向で、C#はランタイムでサポートする方向だ。C#のアプローチだと、使い方も理解もシンプルになり、パフォーマンスも確保できる。

また、言語仕様も実行環境も改良と進歩が続けられてきた。Javaよりちょっといい程度だったC#は、今やJavaとは比べものにならないくらい進歩している。動的プログラミングの導入、言語レベルでの非同期実行、イテレータの採用、関数型言語的特徴の採用、並列プログラミングモデルの導入、ジェネリック型の優れた実装などである。Don Symeと彼のF#チームがおこなってきた研究プロジェクトから得られたこうした成果は、C#という言語に新しいアイディアを着実に加えてきた。

加えて、Mono仮想マシンは、これまで10年にわたって改善が続けられている。現在のMonoは、第8世代だ。

以上をまとめると、こうなる。JavaとC#でシンプルな二分木を実装し、ベンチマークを実行した結果、構造体とジェネリック型の性能は、次のように劇的な差が生じた。



今後について

今日、XobotOSをgithub上に公開したので、ぜひ自分で試してみてほしい。

私たちの企業としての目標はベストなモバイルアプリ開発環境を提供することなので、これ以上XobotOSプロジェクトを継続することはない。しかし楽しい実験プロジェクトだったし、今後の製品開発に役立ついくつかの技術的成果も得られた。

skiaへのダイレクトグラフィックアクセス: Mono for Androidの現在のバージョンは、グラフィックライブラリにJavaを介してアクセスしているのだが、XobotOSのコードを利用することで中間レイヤをスキップし、MonoのP/Invokeを使ってskiaのネイティブレンダリングエンジンに直接アクセスできるようになった。

JavaからC#への変換ツール: Sharpenの新しいバージョンはXobotOSのリリースとして利用できる

JavaコードをC#で書き換え: パフォーマンスに重要な影響を与える部分や、JavaよりC#の方が望ましい部分を、JavaからC#に置き換えることができるようになったのである。この研究プロジェクトの成果を利用し、自分たちの製品に統合する予定だ。

最初は純粋な楽しみのために始めたプロジェクトだったが、製品に応用できる重要な成果が得られた。スタートアップ企業にとって資源を集中させるのは大事なことだが、ときにはクレイジーなことにチャレンジしてみるのも悪くない。いつの日かGoogleが我々に感謝する日が来るに違いないよ:-)。

Xamarinでは人材を募集している。モバイル開発をよいものにしていくためのさまざまなポストを用意している。

0 コメント:

コメントを投稿

長崎県 引越 見積もり 単身引っ越し 料金 還暦祝い 父 Blog Entry Ranking
" ); 出会い系を例示