QMLスクリプトコンパイラ
QMLスクリプトコンパイラは、QMLおよびJavaScriptファイル内の関数や式を、QMLエンジンによって解釈またはジャストインタイム(JIT)コンパイル可能なバイトコードにコンパイルします。
さらに、JavaScriptの性質によって定められた制限の範囲内で、QMLファイル内の一部の関数や式をC++コードにコンパイルします。これは、網羅的に解析可能な関数に対してC++コードを生成します。以下のフローチャートは、コンパイルのワークフローを説明しています。

QMLスクリプトコンパイラには2つのバージョンがあります。1つはQt Quick コンパイラの一部であるqmlcachegenです。もう1つは、商用版限定のアドオンであるQt Quick コンパイラ拡張機能の一部であるqmlscです。
qmlcachegen
qmlcachegenはメタオブジェクトシステムを利用し、ルックアップを生成して、それらを「コンパイルユニット」という一元的な場所に格納します。コンパイルユニットには、ドキュメント構造の表現、各関数および式に対するコンパクトなバイトコード表現、およびコンパイラが完全に理解できる関数やバインディング用のネイティブコードが含まれます。 コンパイル・ユニット内のバイトコードは、QMLエンジンによって再コンパイルを回避し、実行を高速化するために使用されます。
qmlsc
一方、qmlsc は、2 つの追加モードを提供することで、qmlcachegen の基本機能を拡張しています。
static モード
静的モードでは、qmlsc は、C++ に公開されているいかなるタイプのプロパティも、派生型によってシャドウされることはないものとみなします。これにより、シャドウチェックのメカニズムが排除され、より多くの JavaScript コードを C++ にコンパイルできるようになり、最終的にはより高速なコードが生成されます。
qmlsc で静的モードを有効にするには、QT_QMLCACHEGEN_ARGUMENTS 経由で--static をqt_add_qml_module に渡す必要があります。
qt_add_qml_module(someTarget
...
)
set_target_properties(someTarget PROPERTIES
QT_QMLCACHEGEN_ARGUMENTS "--static"
)警告: QMLドキュメント内でプロパティがシャドウされている場合、qmlscの 静的モードでは無効なコードが生成されます。
ダイレクトモード
ダイレクトモードでは、qmlsc は QML コードで使用されるすべての C++ 型が利用可能であり、生成されたコードに C++ ヘッダーとして含めることができると想定します。 これにより、生成されたコードは、それらのヘッダー内のゲッター、セッター、および呼び出し可能な関数を直接呼び出すことでプロパティにアクセスまたは変更するため、実行がさらに高速になります。つまり、CMake で Qt のプライベート API にリンクする必要があります。
警告: Qt のプライベート API は頻繁に変更されます。新しいバージョンが出るたびに Qt を再コンパイルする必要があります。
警告: 型がプラグイン内でのみ定義されている場合や 、ヘッダーファイルが存在しない場合は 、ダイレクトモードで使用することはできません。
ダイレクトモードを有効にするには、以下の点に留意してください:
- `
QT_QMLCACHEGEN_ARGUMENTS` 経由で `--direct-calls` を `qt_add_qml_module` に渡す必要があります。qt_add_qml_module(someTarget ... ) set_target_properties(someTarget PROPERTIES QT_QMLCACHEGEN_ARGUMENTS "--direct-calls" ) - 関連するすべてのプライベート Qt モジュールを、パブリックなモジュールではなく、リンクする必要があります。
find_package(Qt6 COMPONENTS QmlPrivate QuickPrivate) 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++ コードの生成をスキップし、インタプリタまたはジャストインタイム(JIT)コンパイラによって実行されるバイトコードのみを生成します。 一般的な QML 式は、QObject に対する値の検索、算術演算、単純な if/else やループ構文など、比較的単純なものです。これらは C++ で容易に表現でき、そうすることでアプリケーションの実行速度が向上します。
関数およびバインディングのコンパイルに関する統計情報の取得
QMLスクリプトコンパイラは、QMLをC++にコンパイルする際に統計情報を記録します。これらから、関数やバインディングのコンパイル状況に関する洞察を得ることができます。統計情報には、コンパイルにかかった時間、コンパイルが成功したかどうか、失敗した場合はどのエラーが原因だったかなどが含まれます。 これらの結果は、バインディングや関数ごとに表示されるほか、ファイルごと、モジュールごと、およびプロジェクトレベルでも集計されます。これにより、プロジェクトのコンパイル状況を一目で把握することができます。
統計情報を表示するには、all_aotstatsCMakeターゲットを呼び出します。
コンパイル統計情報の収集はデフォルトで有効になっています。これを無効にするには、qt_add_qml_module を初めて呼び出す前に、CMake 変数QT_QML_GENERATE_AOTSTATSを OFF に設定してください。
注:これらの 統計情報は、qt_add_qml_moduleCMake API を通じて登録されたモジュールでのみ利用可能です。
© 2026 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.