Unity veröffentlichte am 13. Mai 2015 einen technischen Blick auf den von IL2CPP erzeugten C++-Code. Der Beitrag untersucht die Ausgabe von il2cpp.exe anhand eines kleinen Unity-5.0.1p1-Projekts für WebGL und beschreibt, wie verwaltete Typen in nativen Code übertragen werden.
IL2CPP besteht aus einem Ahead-of-Time-Compiler und der Laufzeitbibliothek libil2cpp. Der Compiler verarbeitet Intermediate Language aus .NET- und Mono-Assemblies und erzeugt C++-Quellcode. Die Plattform übersetzt diesen Code anschließend mit ihrem jeweiligen C++-Compiler. Dadurch kann Unity Projekte auf Zielsysteme bringen, auf denen eine Just-in-Time-Ausführung nicht vorgesehen ist.
Generierter Code und Laufzeitprüfungen
Im Beispielprojekt erzeugte il2cpp.exe 4.625 Header-Dateien und 89 C++-Quelldateien. Ein Teil davon stammt aus den Standardbibliotheken wie mscorlib.dll. Unity wandelt diese Bibliotheken bei jedem Lauf erneut um, weil das Bytecode-Stripping je nach Script verändern kann, welche Teile tatsächlich in der Anwendung landen.
Die generierten Methoden erhalten zusätzliche Parameter für das Objekt und die Method-Metadaten. Namen enden bei Typen auf _t und bei Methoden auf _m. Für Nullwerte, Array-Grenzen und inkompatible Elementtypen fügt IL2CPP Prüfungen ein, die den Zusicherungen der .NET-Laufzeit entsprechen. Unity verweist zugleich darauf, dass sich die konkrete Ausgabe in späteren Versionen ändern kann.
Der Beitrag ist der zweite Teil der IL2CPP-Interna-Serie. Der zuvor veröffentlichte Auftakt erklärte bereits den Compiler, die Laufzeitbibliothek und den grundsätzlichen Übersetzungsweg.
