2009-09-21 7 views
16

Gradirei davvero che qualcuno potesse spiegarmi brevemente, qual è l'approccio generale all'implementazione di cose come MonoTouch? Sono davvero stupito perché non è il primo esempio che vedo quando la gente ottiene una piattaforma come Java e la traduce in qualcosa come C/Objective-C. Non riesco davvero a immaginare come cose come Garbage Collector e cose che vengono tradotte.Come funziona MonoTouch?

Grazie in anticipo.

EDIT: Comprendo la possibilità teorica di tradurre una lingua in un'altra. La mia domanda è un po 'più tecnica: implementano un runtime completo in ObjC e lo raggruppano? (Ne dubito ...) O semplicemente traducono il codice C# in ObjC/binary/etc?

risposta

8

Monotouch utilizza la compilazione Ahead-Of-Time per produrre un singolo file compilato staticamente, pertanto non implementa il runtime .Net su iPhone. Monotouch utilizza il binding alle librerie iPhone esposte a C#. Non vi è alcuna traduzione in Objective-C.

Fondamentalmente, ti dà la familiarità di lavorare in C# e la sua toolchain associata mentre esponi le chiamate di libreria del SO iPhone sottostante.

Miguel di Icaza ha spiegato questo un po 'sul podcast Stackoverflow in cui era ospite. link

+1

* "quindi non implementa il runtime .Net su iPhone" * - questa affermazione è ** errata ** o, per lo meno, fuorviante. Il runtime è presente, infatti il ​​runtime è contenuto nel "file staticamente compilato" di cui fai riferimento. – cdhowie

0

Monotouch è presumibilmente un porto di Mono per l'iPod.

Mono stesso è un'implementazione open source del runtime .NET (e alcuni strumenti di sviluppo) in vari ambienti * nix.

Questo è stato un enorme lavoro condotto da Miguel de Icaza che ha capito presto l'importanza di .NET e ha impostato il porting su piattaforme aperte. Incidentalmente ricevette una grande quantità di supporto da MicroSoft in quanto MONO forniva ineteroparabilità tra nativo .NET e mono.

Quindi la prima risposta è che devi essere un genio ben organizzato e operoso.

La seconda risposta è più Comp Scienza. "Turing Complete" è un insieme minimo di funzioni che un sistema deve considerare come un computer programmabile. In realtà è un set molto piccolo: sottrarre, confrontare, ramificare, leggere e memorizzare.

La teoria è che qualsiasi sistema "Turing Complete" può fare qualsiasi cosa possa fare qualsiasi altro sistema "Turing Complete". Quindi, dato qualsiasi ambiente di linguaggio di programmazione ragionevolmente completo, dovresti essere in grado di emularlo usando un altro ambiente di programmazione.

Ci sono numerosi esempi di questo intorno. Jpython esegue l'emula C python in una JVM Java. I miei due preferiti personali sono which runs original zX spectrum games in your browser e Knuth MIX assembeler machine entrambi sono javascript puri.

+0

Grazie per la risposta! Tuttavia, sono a conoscenza del completamento di Turing e di altre cose relative alla scienza della comput, ma la mia domanda è più tecnica: come fanno? Implementano semplicemente un runtime e in qualche modo lo raggruppano nell'app? O cosa? – Anton

+0

Iniziano con lo standard, che specifica quali componenti devono essere presenti in un ambiente .NET e quindi implementano tali componenti in modo tale che siano conformi allo standard. – Eric

+0

Lo capisco. Ma ancora, come l'app MonoTouch, scritta in .NET, funziona su iPhone? Hanno un runtime lì? O loro in qualche modo lo traducono in Obj-C/Arm Asm/qualunque? – Anton

39

MonoTouch non è un traduttore. È semplicemente il runtime Mono in esecuzione su iPhone, con alcuni trucchetti per renderlo compatibile con le restrizioni dell'iPhone.

Il "runtime" convenzionale Mono non è solo JIT, gestisce anche GC, reflection, I/O layer, threading, eccezioni ecc. Sono presenti anche le librerie di classi. Affinché la tua app possa essere eseguita su iPhone, la maggior parte deve essere inclusa nell'app. Dimagrire presenta alcune sfide. Inoltre, l'iPhone impedisce la generazione del codice di runtime JIT, esegue solo il codice firmato e non consente le librerie dinamiche.

Ciò che MonoTouch fa è utilizzare un linker IL per combinare solo le parti delle librerie di classi utilizzate dal codice in un singolo binario IL. Quindi utilizza la compilazione AOT per pre-generare tutto il codice nativo che il JIT normalmente genererebbe dall'IL, quindi collega questo insieme al runtime JIT-less in un singolo binario nativo che può essere firmato. Infine, l'IL viene rimosso dal file binario gestito. lasciando solo i metadati.