Qt Quick Compiler
Qt Quick Compiler können Sie QML- und JavaScript-Code zur Kompilierzeit und nicht zur Laufzeit verarbeiten. Dies ermöglicht:
- Schnelleres Starten der Anwendung
- Schnellere Auswertung von Bindungen und Funktionen
Die Qt Quick Compiler besteht aus zwei Komponenten:
Hinweis: qmltc, qmlsc und qmlcachegen sind interne Build-Tools. Wenn Sie sich um deren Aufruf kümmern müssen, schreiben Sie entweder ein Build-System, oder Sie machen etwas falsch.
Der QML-Typ-Compiler
Der QML-Typ-Compiler (qmltc) kompiliert QML-Typen in C++-Klassen. Diese C++-Klassen werden dann zu Ihrer Anwendung hinzugefügt und können von anderem C++-Code instanziiert werden. Auf diese Weise können Sie einen Großteil des Overheads vermeiden, der bei der Verwendung von QQmlComponent zur Erstellung von Instanzen Ihrer QML-Typen anfällt. Um von qmltc zu profitieren, müssen Sie Ihren C++-Code anpassen und die neuen Klassen verwenden.
qmltc kann ein QML-Dokument nur kompilieren, wenn es dessen Struktur vollständig versteht. Es wird fehlschlagen, wenn es auf ein nicht unterstütztes Sprachmerkmal stößt. Er muss jedoch nicht den JavaScript-Code in Bindungen und Funktionen verstehen.
Der QML-Skript-Compiler
Der QML-Skript-Compiler(qmlsc und qmlcachegen) kompiliert Bindungen und Funktionen sowohl in einen effizienten Bytecode als auch in C++-Funktionen. Dieser Prozess geschieht automatisch im Hintergrund, wenn Sie qt_add_qml_module verwenden, um Ihre QML-Module zu spezifizieren. Weitere Informationen über die verfügbaren Optionen zur Steuerung verschiedener Aspekte der QML-Kompilierung finden Sie unter Caching kompilierter QML-Quellen.
Zur Kompilierungszeit wird für jedes QML- oder JavaScript-Dokument eine entsprechende C++-Datei erstellt und in die Anwendung eingebaut. Die C++-Datei enthält dann eine QML-Kompilierungseinheit, die aus Folgendem besteht
- einer effizienten Darstellung der Dokumentstruktur
- Byte-Code für alle Funktionen und Bindungen im Dokument
- C++-Code für Funktionen und Bindungen, die der Compiler vollständig versteht
Die QML-Engine verzichtet dann auf die Kompilierung des QML- oder JavaScript-Quellcodes zur Laufzeit und verwendet stattdessen die vorgefertigte Kompilierungseinheit, um die QML-Komponente und ihre Funktionen und Bindungen schneller zu laden. Die Funktionen und Bindungen, die in C++ kompiliert wurden, können ebenfalls schneller ausgeführt werden. Andere Bindungen und Funktionen werden entweder direkt aus dem Bytecode interpretiert oder zur Laufzeit über einen JIT-Kompilierungsschritt in Maschinencode kompiliert. Zur Kompilierzeit kann eine aufwändigere Typanalyse durchgeführt werden. Daher ist der generierte C++-Code im Allgemeinen effizienter als das Ergebnis der JIT-Kompilierung.
Es gibt Einschränkungen bei der Kompilierung von JavaScript-Konstrukten nach C++. Weitere Informationen zu diesen Beschränkungen finden Sie unter Beschränkungen bei der Kompilierung von JavaScript nach C++. Statistiken darüber, wie gut ein QML-Projekt kompiliert werden kann, finden Sie unter Abrufen von Statistiken über die Kompilierung von Funktionen und Bindungen.
qmlsc wird anstelle von qmlcachegen verwendet, wenn die Qt Quick Compiler Extensions installiert sind. Es hat die folgenden zusätzlichen Funktionen gegenüber qmlcachegen:
- Es kann Dokumente im Direct Mode kompilieren. In diesem Fall werden die C++-Header der Typen, die anderen QML-Komponenten zugrunde liegen, direkt eingebunden und die Methoden dieser Typen werden direkt aufgerufen. Im Gegensatz dazu rufen qmlcachegen oder qmlsc im Indirect Mode Methoden über den Lookup-Mechanismus auf, der auch im Interpreter und JIT verwendet wird.
- Es kann Dokumente im Static Mode kompilieren. In diesem Fall geht qmlsc davon aus, dass keine Eigenschaften von Typen, die in C++ exponiert sind, von abgeleiteten Typen überschattet werden können. Dadurch können mehr Bindungen und Funktionen kompiliert werden, aber es wird ungültiger Code erzeugt, wenn Eigenschaften abgeschattet werden.
Anstatt C++ als Ausgabe zu erzeugen, können qmlsc und qmlcachegen auch .qmlc, .jsc und .mjsc "Cache-Dateien" erzeugen. Diese enthalten immer noch jeweils eine QML-Kompiliereinheit und können von der QML-Engine geladen werden, um eine erneute Kompilierung zu vermeiden. Sie können jedoch nur Dokumentstruktur und Bytecode enthalten. Die Kompilierung von Bindungen und Funktionen nach C++ entfällt, wenn Cache-Dateien erzeugt werden. Weder das von Qt angebotene CMake- noch das qmake-Build-System bieten diese Funktionalität an.
Zusammenfassung
Die folgende Tabelle fasst die Unterschiede zwischen qmltc, qmlcachegen und qmlsc zusammen:
qmltc | qmlcachegen | qmlsc |
---|---|---|
Kompiliert QML-Typen zu C++-Klassen | Kompiliert QML-Dokumente zu QML-Kompiliereinheiten | Kompiliert QML-Dokumente zu QML-Kompiliereinheiten |
Die generierte Ausgabe dient als schnellere Alternative zur QQmlComponent-basierten Objekterstellung. | Die generierte Ausgabe wird intern von der QML-Engine verwendet, um eine erneute Kompilierung zu vermeiden und die Ausführung zu beschleunigen. | Die generierte Ausgabe wird intern von der QML-Engine verwendet, um eine Neukompilierung zu vermeiden und die Ausführung zu beschleunigen. Direct Mode und Static Mode können Ihre Anwendung weiter beschleunigen. |
Verfügbar für alle Versionen von Qt | Erhältlich für alle Versionen von Qt | Verfügbar für kommerzielle Kunden |
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.