2009-09-21 7 views
16

Ich würde es wirklich schätzen, wenn mir jemand kurz erklären könnte, wie die allgemeine Vorgehensweise bei der Implementierung von Dingen wie MonoTouch aussieht? Ich bin wirklich erstaunt, weil es nicht das erste Beispiel ist, das ich sehe, wenn Leute eine Plattform wie Java bekommen und sie in etwas wie C/Objective-C übersetzen lassen. Ich kann mir nicht wirklich vorstellen, wie Dinge wie Müllsammler und Zeug übersetzt werden.Wie funktioniert MonoTouch?

Vielen Dank im Voraus.

EDIT: Ich verstehe theoretische Möglichkeit der Übersetzung einer Sprache in eine andere. Meine Frage ist ein bisschen technischer: implementieren sie eine komplette Laufzeit in ObjC und bündeln sie? (Ich bezweifle es ...) Oder sie übersetzen nur C# -Code in ObjC/binary/etc?

Antwort

8

Monotouch verwendet die Ahead-Of-Time-Kompilierung, um eine einzige statisch kompilierte Datei zu erstellen. Daher implementiert es nicht die .NET-Laufzeitumgebung auf dem iPhone. Monotouch verwendet die Bindung an die iPhone-Bibliotheken, die C# ausgesetzt sind. Es gibt keine Übersetzung in Objective-C.

Im Grunde gibt es Ihnen die Vertrautheit der Arbeit in C# und der damit verbundenen Toolchain, während die Bibliotheksaufrufe des zugrunde liegenden iPhone OS offen gelegt werden.

Miguel di Icaza erklärte dies ein wenig auf dem Stackoverflow-Podcast, wo er zu Gast war. link

+1

* "so implementiert es nicht die .NET-Laufzeit auf dem iPhone" * - diese Aussage ist ** falsch **, oder zumindest irreführend. Die Laufzeit ist vorhanden, die Laufzeit befindet sich in der "statisch kompilierten Datei", auf die Sie verweisen. – cdhowie

0

Monotouch ist vermutlich ein Port von Mono zum iPod.

Mono selbst ist eine Open-Source-Implementierung der .NET-Laufzeitumgebung (und einiger Entwicklungstools) in verschiedenen * nix-Umgebungen.

Dies war eine massive Arbeit von Miguel de Icaza, der früh die Bedeutung von .NET erkannte und es auf offene Plattformen portierte. Zufällig erhielt er eine Menge Unterstützung von MicroSoft selbst, da MONO Unvereinbarkeit zwischen nativem .NET und mono gab.

Also die erste Antwort ist, dass Sie ein gut organisiertes, hart arbeitendes Genie sein müssen.

Die zweite Antwort ist mehr Comp Sciency. "Turing Complete" ist ein Minimum an Funktionen, die ein System als programmierbarer Computer betrachtet. Es ist tatsächlich eine sehr kleine Menge - subtrahieren, vergleichen, verzweigen und lesen und speichern.

Die Theorie ist, dass jedes "Turing Complete" System kann alles andere "Turing Complete" System tun kann. Wenn Sie also eine einigermaßen vollständige Programmiersprachenumgebung verwenden, sollten Sie in der Lage sein, sie mit einer anderen Programmumgebung zu emulieren.

Es gibt zahlreiche Beispiele dafür. Jpython führt das Emulationspython in einer Java-JVM aus. Meine zwei persönlichen Favoriten sind which runs original zX spectrum games in your browser und Knuth MIX assembeler machine, die beide reines Javascript sind.

+0

Vielen Dank für die Antwort! Ich bin mir jedoch der Turing-Vervollständigung und anderen comp-science-bezogenen Sachen bewusst, aber meine Frage ist technischer: Wie machen sie das? Implementieren sie einfach eine Laufzeit und bündeln sie sie irgendwie in die App? Oder was? – Anton

+0

Sie beginnen mit dem Standard, der angibt, welche Komponenten in einer .NET-Umgebung vorhanden sein müssen, und dann implementieren sie diese Komponenten so, dass sie dem Standard entsprechen. – Eric

+0

Ich verstehe das. Aber wie läuft die MonoTouch App, die in .NET geschrieben wurde, auf dem iPhone? Sie haben dort eine Laufzeit? Oder sie übersetzen das irgendwie in Obj-C/Arm Asm/was auch immer? – Anton

39

MonoTouch ist kein Übersetzer. Es ist einfach die Mono-Laufzeit, die auf dem iPhone läuft, mit einigen raffinierten Tricks, um es mit den Einschränkungen des iPhone kompatibel zu machen.

Die herkömmliche Mono "Runtime" ist nicht nur das JIT, sondern auch GC, Reflection, I/O Layer, Threading, Exceptions usw. Es gibt auch die Klassenbibliotheken. Damit Ihre App auf dem iPhone ausgeführt werden kann, muss ein Großteil davon in der App enthalten sein. Das Abnehmen bringt einige Herausforderungen mit sich. Darüber hinaus verhindert das iPhone die Generierung von JIT-Laufzeitcode, führt nur signierten Code aus und lässt keine dynamischen Bibliotheken zu.

Was MonoTouch tut, ist die Verwendung eines IL-Linkers, um nur die Teile der Klassenbibliotheken zu kombinieren, die Ihr Code in einer einzigen IL-Binärdatei verwendet. Anschließend verwendet es die AOT-Kompilierung, um den gesamten nativen Code, den das JIT normalerweise aus der IL generiert, vorab zu generieren, und verknüpft es dann mit der JIT-less-Laufzeit in eine einzige native binäre Datei, die signiert werden kann. Schließlich wird die IL aus der verwalteten Binärdatei entfernt. nur Metadaten übrig lassen.