QMLスクリプトコンパイラ

QMLスクリプトコンパイラは、QMLファイルやJavaScriptファイル中の関数や式を、QMLエンジンで解釈可能なバイトコードにコンパイルしたり、ジャストインタイムコンパイルしたりします。

また、JavaScript の性質による制限の範囲内で、QML ファイル中の関数や式の一部を C++ コードにコンパイルします。網羅的な解析が可能な関数についてはC++コードを生成します。次のフローチャートは、コンパイルのワークフローを説明したものです。

QMLスクリプトコンパイラには2つのバージョンがあります。ひとつはqmlcachegenでQt Quick Compilerの一部です。もうひとつはqmlscで、商用専用のアドオンQt Quick Compiler Extensionsの一部です。

qmlcachegen

qmlcachegenはメタ-Objectシステムを使用し、ルックアップを生成し、コンパイルユニットという中心的な場所に保存します。コンパイルユニットには、ドキュメント構造の表現、各関数と式のコンパクトなバイトコード表現、コンパイラが完全に理解できる関数とバインディングのネイティブコードが含まれます。コンパイルユニット内のバイトコードは、QMLエンジンが再コンパイルを回避し、実行を高速化するために使用することができます。

qmlsc

qmlscはqmlcachegenの基本機能を拡張し、2つのモードを提供します。

静的モード

静的モードでは、qmlsc は C++ に公開されるすべての型のプロパティが派生型によってシャドウされることはないと仮定します。これはシャドウチェック機構を排除し、より多くのJavaScriptコードをC++にコンパイルすることを可能にし、最終的にはより高速なコードを生成します。

qmlscでスタティックモードを有効にするには、--staticqt_add_qml_moduleQT_QMLCACHEGEN_ARGUMENTS 経由で渡す必要があります。

qt_add_qml_module(someTarget
...
)

set_target_properties(someTarget PROPERTIES
    QT_QMLCACHEGEN_ARGUMENTS "--static"
)

Warning: qmlsc の static-mode は QML ドキュメントに shadow されているプロパティがあると無効なコードを生成します。

ダイレクトモード

直接モードでは、qmlscはQMLコードで使われるすべてのC++型が利用可能であり、生成されるコードにC++ヘッダとして含めることができると仮定します。そして、生成されたコードはヘッダ内のゲッターやセッター、呼び出し可能な関数を直接呼び出すことで、プロパティへのアクセスや変更を行います。つまり、CMakeでQtのプライベートAPIにリンクする必要があります。

警告 プライベートQt APIは頻繁に変更されます。新しいバージョンごとに Qt を再コンパイルする必要があります。

警告 型がプラグインでのみ定義されていたり、ヘッダがない場合、ダイレクトモードでは使用できません。

ダイレクトモードを有効にするには、以下のことを考慮する必要があります:

  • qt_add_qml_moduleQT_QMLCACHEGEN_ARGUMENTS 経由で--direct-calls を渡してください。
    qt_add_qml_module(someTarget
    ...
    )
    
    set_target_properties(someTarget PROPERTIES
        QT_QMLCACHEGEN_ARGUMENTS "--direct-calls"
    )
  • パブリックモジュールではなく、関連するプライベートモジュールをリンクする。
    qt_add_qml_module(someTarget
    ...
    )
    
    target_link_libraries(someTarget PRIVATE
        Qt::QmlPrivate
        Qt::QuickPrivate
        ...
    )
  • PLUGIN_TARGET をバッキングライブラリのターゲットと同じにしない。
    # direct mode will not function in this setup.
    qt_add_qml_module(someTarget
    PLUGIN_TARGET someTarget
    ...
    )

JavaScript を C++ にコンパイルする際の制限事項

JavaScript の構成要素の多くは C++ では効率的に表現できません。QML スクリプトコンパイラは、そのような構成要素を含む関数の C++ コード生成をスキップし、解釈またはジャストインタイムコンパイラで実行されるバイトコードのみを生成します。QML でよく使われる表現は、QObject の値探索、演算、if/else やループといった単純なものです。これらは簡単に C++ で表現することができ、そうすることでアプリケーションの実行を高速化することができます。

関数やバインディングのコンパイルに関する統計情報の取得

QMLスクリプトコンパイラは、QMLをC++にコンパイルする際の統計情報を記録します。これにより、関数やバインディングのコンパイルが成功したか、どのエラーで失敗したかを知ることができます。統計情報はバインディングや関数ごとに表示されるだけでなく、ファイルごと、モジュールごと、プロジェクトレベルでも要約されます。これにより、プロジェクトのコンパイル状況を簡単に把握することができます。

統計情報を表示するには、all_aotstatscmakeターゲットを実行してください。

注意: これらの統計情報は、qt_add_qml_modulecmake API によって登録されたモジュールに対してのみ利用可能です。

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