QML-Skript-Compiler

Der QML-Script-Compiler kompiliert Funktionen und Ausdrücke in QML- und JavaScript-Dateien in einen Bytecode, der von der QML-Engine interpretiert oder just-in-time kompiliert werden kann.

Darüber hinaus kompiliert er einige Funktionen und Ausdrücke in QML-Dateien in C++-Code, wobei die Grenzen durch die Natur von JavaScript gesetzt sind. Es erzeugt C++-Code für Funktionen, die vollständig analysiert werden können. Das folgende Flussdiagramm erklärt den Kompilierungsablauf.

Der QML-Skriptcompiler ist in zwei Versionen erhältlich. Die eine ist qmlcachegen, die ein Teil des Qt Quick Compiler. Die andere ist qmlsc, die Teil des kommerziellen Add-ons Qt Quick Compiler Extensions ist.

qmlcachegen

qmlcachegen verwendet das Meta-Objekt-System und generiert Nachschlagewerke und speichert sie an einem zentralen Ort, einer Kompiliereinheit. Die Kompiliereinheit enthält eine Darstellung der Dokumentstruktur, eine kompakte Bytecode-Darstellung für jede Funktion und jeden Ausdruck sowie nativen Code für Funktionen und Bindungen, den der Compiler vollständig versteht. Der Bytecode in einer Kompiliereinheit kann von der QML-Engine verwendet werden, um eine Neukompilierung zu vermeiden und die Ausführung zu beschleunigen.

qmlsc

qmlsc hingegen erweitert die Basisfunktionalität von qmlcachegen durch zwei zusätzliche Modi.

statischer Modus

Im statischen Modus geht qmlsc davon aus, dass keine Eigenschaften von Typen, die in C++ exponiert sind, von abgeleiteten Typen überschattet werden können. Damit entfällt der Mechanismus der Schattenprüfung, und es kann mehr JavaScript-Code nach C++ kompiliert werden, was letztendlich zu schnellerem Code führt.

Um den statischen Modus in qmlsc zu aktivieren, sollten Sie --static über QT_QMLCACHEGEN_ARGUMENTS an qt_add_qml_module übergeben.

qt_add_qml_module(someTarget
...
)

set_target_properties(someTarget PROPERTIES
    QT_QMLCACHEGEN_ARGUMENTS "--static"
)

Warnung: qmlsc static-mode erzeugt ungültigen Code, wenn irgendwelche Eigenschaften im QML-Dokument schattiert sind.

direkter Modus

Im direkten Modus geht qmlsc davon aus, dass alle in Ihrem QML-Code verwendeten C++-Typen verfügbar sind und als C++-Header in den generierten Code eingebunden werden können. Dann greift der generierte Code auf Eigenschaften zu oder ändert sie, indem er Getter, Setter und aufrufbare Funktionen in diesen Headern direkt aufruft, was die Ausführung noch schneller macht. Das bedeutet, dass Sie in CMake auf private Qt-APIs verlinken müssen.

Warnung: Private Qt-APIs ändern sich häufig. Sie werden Qt für jede neue Version neu kompilieren müssen.

Warnung: Wenn ein Typ nur in einem Plugin definiert ist oder keinen Header hat, können Sie ihn nicht im direkten Modus verwenden.

Um den direkten Modus zu aktivieren, sollten Sie die folgenden Punkte beachten:

  • Sie sollten --direct-calls über QT_QMLCACHEGEN_ARGUMENTS an qt_add_qml_module übergeben.
    qt_add_qml_module(someTarget
    ...
    )
    
    set_target_properties(someTarget PROPERTIES
        QT_QMLCACHEGEN_ARGUMENTS "--direct-calls"
    )
  • Verknüpfen Sie alle relevanten privaten Qt-Module anstelle ihrer öffentlichen Gegenstücke.
    qt_add_qml_module(someTarget
    ...
    )
    
    target_link_libraries(someTarget PRIVATE
        Qt::QmlPrivate
        Qt::QuickPrivate
        ...
    )
  • Setzen Sie PLUGIN_TARGET nicht auf das gleiche wie das Ziel der Backing Library.
    # direct mode will not function in this setup.
    qt_add_qml_module(someTarget
    PLUGIN_TARGET someTarget
    ...
    )

Einschränkungen beim Kompilieren von JavaScript nach C++

Viele JavaScript-Konstrukte können in C++ nicht effizient dargestellt werden. Der QML-Skript-Compiler überspringt die Erzeugung von C++-Code für Funktionen, die solche Konstrukte enthalten, und erzeugt nur Byte-Code, der interpretiert oder durch den Just-in-time-Compiler ausgeführt wird. Die meisten gebräuchlichen QML-Ausdrücke sind recht einfach: Wertabfragen auf QObjects, Arithmetik, einfache if/else- oder Schleifenkonstrukte. Diese können leicht in C++ ausgedrückt werden, und dadurch wird Ihre Anwendung schneller ausgeführt.

Erstellen von Statistiken über die Kompilierung von Funktionen und Bindungen

Der QML Script Compiler zeichnet bei der Kompilierung von QML nach C++ Statistiken auf. Diese können Aufschluss über die Kompilierung von Funktionen und Bindungen geben und darüber, ob sie erfolgreich war oder welcher Fehler sie zum Scheitern gebracht hat. Zusätzlich zur Anzeige dieser Ergebnisse pro Bindung oder Funktion werden die Statistiken auch pro Datei, pro Modul und auf Projektebene zusammengefasst. Dies kann einen schnellen Überblick darüber geben, wie gut ein Projekt kompiliert wird.

Um Statistiken anzuzeigen, rufen Sie das cmake-Target all_aotstats auf.

Hinweis: Diese Statistiken sind nur für Module verfügbar, die über die cmake-API qt_add_qml_module registriert wurden.

© 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.