Was macht Expression.Compile bei Monotouch?

9

Also Expression.Compile macht Folgendes:

  

Kompiliert den vom Ausdrucksbaum beschriebenen Lambda-Ausdruck in ausführbaren Code und erzeugt einen Delegaten, der den Lambda-Ausdruck darstellt.

Und es ist in Portable Class Libraries verfügbar.

Wenn Sie jedoch .net über Monotouch ausführen wird die dynamische Codegenerierung nicht unterstützt

  

Da der Kernel des iPhones verhindert, dass eine Anwendung Code dynamisch generiert, unterstützt Mono auf dem iPhone keine Form der dynamischen Code-Generierung.

Daher kann Xamarin auf IOS Expression.Compile nicht unterstützen.

Was passiert also, wenn Sie Expression.Compile Xamarin auf IOS aufrufen? Es wirft und Ausnahme, und wenn ja, welche Ausnahme? Und ist das überall dokumentiert?

    
Simon 27.07.2014, 04:35
quelle

2 Antworten

4

Der Code wird mit der AOT-Option kompiliert, so dass er zur Laufzeit nicht kompiliert wird (ich kenne die Details, die im Hintergrund bei Compile () passieren) nicht. Das Beispiel aus der Microsoft-Dokumentation funktioniert problemlos auf iOS-Geräten, keine Ausnahmen.

%Vor%

Sie können IL-Code nicht zur Laufzeit erstellen (System.Reflection.Emit) und es gibt auch Einschränkungen bei der Verwendung von Reflection mit bestimmten Linker-Optionen, weitere Informationen zu diesem Thema. Es könnte Ausdrücke geben, die nicht AOT kompilieren und in diesen Fällen würden Sie zur Laufzeit eine Ausnahme zum Versuch bekommen JIT kompiliert mit nur AOT-Option.

    
SKall 27.07.2014 17:53
quelle
1

Die neue Compile(bool) -Überladung kann dies beim Betrachten klarer machen, obwohl die Dokumente (derzeit) nicht viele Informationen zu den Details enthalten.

Compile() verwendet immer IL-Generierung und war daher nicht mit AOT verfügbar.

Seit einiger Zeit (ich vergesse, wann es dazu kam) kann Compile() nun auch "compilieren" zu einer Menge von Objekten, die Operationen darstellen (sie funktionieren ganz ähnlich wie IL, wobei ein Stack durch eine feste Länge% repräsentiert wird) co_de%), die Reflektion (aber nicht Reflection.Emit 'Reflection) für Methodenaufrufe und ihren eigenen Code für grundlegende Operationen wie Arithmetik verwendet.

object[] Lassen Sie uns nach IL-Generierung (falsch) oder Interpretation (true) fragen, aber es wird eher als Präferenz und nicht als Nachfrage behandelt; Wenn Sie nach einer IL-Generation auf einer Plattform fragen, die nur eine Interpretation hat, erhalten Sie eine Interpretation und umgekehrt. Meistens, wenn Sie entweder IL-Generierung (in der Regel schneller, und es gibt einige Einschränkungen für den Interpreter) wollen, aber Sie möchten möglicherweise Unterschiede zwischen der Plattform ausschließen, oder Sie können feststellen, dass im Durchschnitt die interpretierten Delegierten langsamer sind ausführen, im Durchschnitt ist der Compile(bool) step selbst schneller mit dem Interpreter und manchmal, wenn Sie mehrere einmalige Ausdrücke erstellen, ist die Gesamtzeit schneller mit dem Interpreter. (Aber nicht immer, wenn Sie dies aus Performance-Gründen versuchen, Profil und / oder in Betracht ziehen, Delegierte zu cachen, wenn Sie können).

Das bedeutet übrigens, dass Compile() Code enthält, der eine Sprache repräsentiert (Ausdrücke sind eine Art Sprache für sich), in einer zweiten (C #) geschrieben, die nicht nur in eine dritte Sprache (CIL), sondern auch in noch kompiliert wird eine andere Sprache (da die inneren Strukturen der Interpretation noch eine andere Sprache sind), für die sie einen Interpreter enthält. Das ist ein großer Teil davon, warum ich finde, dass es ein lustiges Projekt ist, zu dem ich beitragen kann:)

    
Jon Hanna 24.11.2017 16:15
quelle

Tags und Links