Wie funktioniert die Compil Time Function Evaluation (CTFE)? Ich versuche zu verstehen, wie der Compiler, während er läuft, etwas erzeugt, das nicht existiert (z. B. eine Funktion) und es ausführt. Ich bin an die Idee gewöhnt, dass Quellcode durch Kompilierung zu einer Binärdatei wird, und dann wird die Binärdatei ausgeführt. Also, wie wird ein Quelltext zu etwas, das ausführbar ist, während der Compiler läuft und es ausgeführt werden kann? Wird eine Funktion wirklich erstellt und ausgeführt oder ist sie nur eine Emulation eines Funktionsaufrufs?
CTFE verwendet einen Interpreter, der in den Compiler integriert ist - ähnlich wie man es von einer interpretierten Sprache wie Python erwartet. Wenn Sie etwas wie folgt kompilieren:
%Vor%Der Compiler durchläuft die üblichen Stufen des Tokening / Lexing / Parsing und so weiter. Wenn enum compileTime gefunden wird (oder jedes andere Konstrukt, das einen Wert für die Kompilierzeit benötigt), versucht es zu evaluieren, was sich auf der rechten Seite des Ausdrucks befindet. Im Falle einer Konstanten tut es das, was Sie erwarten würden und speichert eine Konstante. Wenn ein Funktionsaufruf auftritt, wird der CTFE-Interpreter gestartet. In dem gegebenen Beispiel weiß es, was die Argumente sind, und was die Anweisungen in der Funktion tun, es geht Schritt für Schritt durch und interpretiert jede einzelne. Wenn es die Anweisung zum Zeitpunkt der Kompilierung nicht interpretieren kann, wird ein Kompilierzeitfehler ausgegeben. In diesem einfachen Beispiel negiert es einfach den Parameter, aber CTFE kann Strukturen, Klassen, Schleifen und vieles mehr interpretieren, was hier dokumentiert ist - Ссылка .
Dies ist im Wesentlichen eine erweiterte Form der konstanten Faltung , in der der Compiler versucht, die verwendeten Werte zu berechnen, die er nicht hat zur Laufzeit auftreten (Operationen, die nicht während der Kompilierungszeit passieren können (IO, Speicherzuweisung, ...) führen dazu, dass es fehlschlägt)
CTFE ist insofern besonders, als dass es explizit gemacht werden kann (indem beispielsweise eine enum
zugewiesen wird) und dass es versucht, benutzerdefinierte Funktionen auszuwerten
In der Praxis kann dies durch einen im Compiler eingebauten Interpreter erfolgen
Tags und Links compiler-construction d