2009-09-21 15 views
16

MonoTouchのようなものを実装する一般的なアプローチは何ですか?人々がJavaのようなプラットフォームを手に入れてC/Objective-Cのようなものに変換すると、最初の例ではないので、私は本当に驚いています。ガベージコレクターやものがどのように翻訳されているのか、私は本当に想像することはできません。MonoTouchの仕組みは?

ありがとうございます。

EDIT:ある言語を別の言語に翻訳する理論的な可能性を理解しています。私の質問はもう少し技術的です:彼らはObjCで完全なランタイムを実装し、それをバンドルしていますか? (私はそれを疑う...)あるいは、C#コードをObjC /バイナリ/その他に変換するだけですか?

答えて

8

Monotouchは、Ahead-Of-Timeコンパイルを使用して静的にコンパイルされた単一のファイルを生成します。そのため、iPhoneでは.Netランタイムは実装されません。 Monotouchは、C#に公開されているiPhoneライブラリへのバインドを使用します。 Objective-Cへの翻訳はありません。

基本的には、基礎となるiPhone OSのライブラリ呼び出しを公開しながら、C#とその関連ツールチェーンでの作業に精通しています。

Miguel di Icazaはこのことについて、Stackoverflowのポッドキャストで説明しました。彼はゲストでした。 link

+1

* "これはiPhone上で.NETランタイムを実装していない" * - このステートメントは間違っている**、または少なくとも、誤解を招く。ランタイムは存在します。実際、ランタイムは参照する「静的にコンパイルされたファイル」に含まれています。 – cdhowie

0

モノトックはおそらくiPodのMonoのポートです。

Mono自体は、さまざまな* nix環境での.NETランタイム(およびいくつかの開発ツール)のオープンソース実装です。

これはMiguel de Icazaが率いる大規模な労働で、.NETの重要性を早期に認識し、オープンプラットフォームに移植することを約束しました。それにもかかわらず、彼はMicroSoft自身から多大なサポートを受けました。これは、MONOがネイティブの.NETとモノラルの間の不可聴性を与えたからです。

最初の答えは、うまく組織された、勤勉な天才である必要があるということです。

2番目の答えは、よりComp Sciencyです。 「Turing Complete」は、システムをプログラム可能なコンピュータとみなす必要がある機能の最小セットです。その実際は非常に小さなセット - 減算、比較、分岐、読み取りと格納。

「チューリング・コンプリート」システムは、他の「チューリング・コンプリート」システムでできることは何でもできます。合理的に完全なプログラミング言語環境があれば、別のプログラム環境を使ってそれをエミュレートすることができます。

これには数多くの例があります。 JpythonはJava JVMでエミュレートCのPythonを実行します。私の2つの個人的なお気に入りはwhich runs original zX spectrum games in your browserKnuth MIX assembeler machineです。どちらも純粋なjavascriptです。

+0

ありがとうございました!しかし、私はチューリングの完了と他のcomp - science関連のものを知っていますが、私の質問はより技術的です:彼らはそれをどのようにしますか?彼らは単にランタイムを実装し、何とかそれをアプリにバンドルしていますか?または何? – Anton

+0

標準から始まります。これは、.NET環境に存在する必要があるコンポーネントを指定し、標準に準拠するようにコンポーネントを実装します。 – Eric

+0

私はそれを理解しています。しかし、やはり、HOW MonoTouchアプリは.NETで書かれており、iPhone上で動作しますか?彼らはランタイムをそこに持っていますか?あるいは、どういうわけかこれをObj-C/Arm Asmに変換するのですか? – Anton

39

MonoTouchは翻訳者ではありません。 iPhone上で動作する単なるMonoランタイムであり、iPhoneの制限と互換性を持たせるための巧妙なトリッキーです。

従来のMono「ランタイム」はJITだけでなく、GC、リフレクション、I/Oレイヤ、スレッド、例外なども処理します。クラスライブラリもあります。あなたのアプリがiPhone上で動作するためには、その多くがアプリに含まれている必要があります。それを減らすことはいくつかの課題を提示する。さらに、iPhoneはJITランタイムコードの生成を防ぎ、署名されたコードのみを実行し、動的ライブラリは許可しません。

MonoTouchの機能は、ILリンカーを使用して、コードが使用するクラスライブラリの一部だけを1つのILバイナリに結合することです。次に、AOTコンパイルを使用して、JITが通常ILから生成するすべてのネイティブコードを事前に生成し、JITレスランタイムとこれをリンクして署名可能な単一のネイティブバイナリにリンクします。最後に、管理されたバイナリからILが削除されます。メタデータのみを残します。