Xamarin は、クロスプラットフォーム開発ツールとして紹介されることが多いので、他の同類のツールと比較してみたいと思います。
対象は Android と iOS に絞ります。 速度がーとか、メモリ使用量がー、とか言った話はナシで、仕組みとかを淡々と述べます。
ゲーム系は分からないのでナシで。業務アプリつくるレベルだと思ってください。
あ、いずれもガッツリ使ったことはないので、間違ってたらツッコミお願いします。
C#、F# などの .NET 言語を使います。VB.NET は…プロジェクトテンプレートが無いだけですかね?
Android では、パッケージ(apk) として Monoランタイムと.NET中間言語がパッケージングされ、アプリ実行時にネイティブコードにコンパイルされて実行されます、いわゆる JIT。
iOS では、 .NET言語は パッケージ(ipa) 作成時にネイティブコードにコンパイルされ、アプリ実行時にはネイティブコードが実行されます。事前コンパイル AOT(Ahead-Of-Time)コンパイルと呼ばれます。
UIパーツについては Android も iOS もネイティブのものが使われます。
コアロジックは共通化できます。
画面、GPSやカメラなどプラットフォーム毎にAPIが異なる箇所は共通化できません。
※ここでいう「ネイティブ」とは、iOS なら Objective-C、Android なら Java で開発された部品、の意です。C言語のガチなやつじゃないです。
各PF製の外部ライブラリは Binding という仕組みで呼び出すことができます。
思えばクロスプラットフォーム開発ツールでもっとも先に普及しましたね。
JavaScript を使います。
Android, iOS ともにパッケージには、Javascriptコードが含まれます。実行時にそれは、Javascriptエンジン(V8など)で解釈され、ネイティブAPIにブリッジされて実行されます。(あってる?
UIパーツについては Android も iOS もネイティブのものが使われます。
コアロジック、および GPS やセンサーなど、Titanium によって共通APIが用意されている機能は共通化ができます。UI も Label や EditBox など、簡素なものは共通になります。
PF固有の UIパーツ は共通化できません。CoverFlowView は iOS でしか使えません。
各PF製の外部ライブラリは Module という仕組みで呼び出すことができます。
正式名称なんですか?いわゆる Flash の AIR のモバイル版です。
ActionScript を使います。
Android では、パッケージ(apk) として AIRランタイムとActionScript言語がパッケージングされ、アプリ実行時にネイティブコードにコンパイルされて実行されます。(AIRランタイムは別アプリとして切り離すこともできます)
iOS では、 ActionScript言語は パッケージ(ipa) 作成時にネイティブコードにコンパイルされ、アプリ実行時にはネイティブコードが実行されます。
UIパーツについては、Android/iOS のネイティブUIは使わず、AIR で用意されたパーツを使います。
基本的に全てのロジック、UI が共通化できます。(機種依存や特定端末への最適化を除けば)
その替り AIR に用意されていない機能(例えば Android の Toast など)を使いたい場合、ネイティブ機能の呼び出しに頼ることになります。
各PF製の外部ライブラリは Native Extensions という仕組みで呼び出すことができます。
2010年あたりから Delphi "XE(X-platform Edition)" として、クロスプラットフォーム対応が可能になっています。(Android は最近対応しました)
Delphi を使います。
Android/iOS ともにパッケージングの際にネイティブコードにコンパイルされます。
UIパーツについては、Android/iOS のネイティブUIは使わず、Delphi(というか FireMonkey)で用意されたパーツを使います。
基本的に全てのロジック、UI が共通化できます。(機種依存や特定端末への最適化を除けば)
その替り Delphi(FireMonkey) に用意されていない機能(何があるのだろう?)を使いたい場合、ネイティブ機能の呼び出しに頼ることになります。
iOSapi.Foundation や、Androidapi.Log, Macapi.AppKit などの「Unit」を ``uses して使うことができます。 (コメントにて教えて頂きました)
認知度高いので、一応。
JavaScript を使います。
Android/iOS とも、アプリに見えて実際は WebView の上で JavaScript コードが動いてます。
WebView 上で動くので基本共通なはずです。細かい所はよく分かってません。
Plugin というのを自作することで実現可能なようです。
C++ で書くんですよね?ってくらいしか分かりませんすいません。
言語はまあそれぞれ違いますよね当然。
実行モデルは、iOS はその規約上全て AOT(Titanium を除く)、事前コンパイル方式です。 Android の方は、JIT型が Xamarin と AIR、AOT型が DelphiXE 、Titanium は何ていうの、iOS でも Androide でもインタプリタ?
画面を構成するパーツについては、各PFのネイティブUIを使うのが Xamarin、Titanium で、開発ツール側で頑張って全部レンダリングするのが AIR と DelphiXE 。DelphiXE は "Pixel Perfect" という技術でネイティブと寸分たがわない見た目を実現してるそうです。
ネイティブ機能の呼び出しは各社、なんらかの手段を用意してます(そりゃそうだ
これらの仕組みの違いが、それぞれメリット・デメリットを生み出します。 「使用上の注意をよく読み用法、用量を守り正しくお使いください」と言いたいところですが「それならはじめからネイティブでやるよ!」と突っ込まれそうですね。
Xamarin Advent Calendar で、Xamarin の特徴を一つでも伝えられたら、と思います。
以上、文字だらけの記事にお付き合い頂きありがとうございました。