Ein großartiges Projekt ist http://www.xmlvm.org/. Es steht zwar erst am Anfang, aber der sieht sehr vielversprechend aus. Die Idee von XMLVM ist einfach: Man nehme den Bytecode, repräsentierte diesen als XML, transformiere den über XSLT in Objective C und kompilieren dann.
(Bilder von der Webseite)
Die Stack-Operationen vom Java-Bytecode werden über XSLT einfach in Objective C abgebildet, wobei die Stack-Operationen beibehalten werden. Die Mühe über einen internen AST oder so macht man sich nicht.
<xsl:template match=“jvm:irem“>
<xsl:text>
_op2.i = _stack[–_sp].i; // Pop operand 1
_op1.i = _stack[–_sp].i; // Pop operand 2
_stack[_sp++].i = _op1.i % _op2.i; // Push remainder
</xsl:text>
</xsl:template>
Das gibt zwar für den GCC ‘ne Menge zu optimieren, aber das ist der einfachste Weg der Transformation. Später sieht das dann so aus:
@interface org_xmlvm_test_HelloWorld : java_lang_Object
+ (void) main___java_lang_String_ARRAYTYPE :(NSMutableArray*)n1;
@end
@implementation org_xmlvm_test_HelloWorld;
+ (void) main___java_lang_String_ARRAYTYPE :(NSMutableArray*)n1
{
XMLVMElem _stack[2];
XMLVMElem _locals[1];
int _sp = 0;
XMLVMElem _op1, _op2, _op3;
int _i;
for (_i = 0; _i <1; _i++) _locals[_i].o = nil;
NSAutoreleasePool* _pool = [[NSAutoreleasePool alloc] init];
_locals[0].o = n1;
_op1.o = [java_lang_System _GET_STATIC_java_lang_System_out];
_stack[_sp++].o = _op1.o;
_stack[_sp++].o = @“Hello World“;
_sp -= 2;
[((java_io_PrintStream*) _stack[_sp].o) println___java_lang_String:_stack[_sp + 1].o];
[_pool release];
return;
}
@end
Weitere Beispiele gibt http://xmlvm.org/showcase/ und der Blog http://www.cokeandcode.com/aboidblog.
Insgesamt ein sehr spannendes Projekt, welches auch die Frage Android –> iPhone Entwicklung angeht, und .NET -> Java Cross-Compilation bietet. Mal sehen, wie sich das Entwickeln wird. MONO für iPhone ist auch bald bereit und dann wird iPhone Entwicklung wirklich einfach. (Bekommen wir dann noch mehr Schrott im Store?)