QMLスクリプトコンパイラ

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

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

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

qmlcachegen

qmlcachegenはメタ・オブジェクト・システムを使用し、ルックアップを生成してコンパイル・ユニットという中心的な場所に保存します。コンパイルユニットには、ドキュメント構造の表現、各関数と式のコンパクトなバイトコード表現、コンパイラが完全に理解できる関数とバインディングのネイティブコードが含まれます。コンパイルユニット内のバイトコードは、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 によって登録されたモジュールに対してのみ利用可能です。

©2024 The Qt Company Ltd. ここに含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。