Qt Quick コンパイラ
Qt Quick コンパイラを使用すると、QMLおよびJavaScriptコードを実行時ではなくコンパイル時に処理できます。これにより、以下のことが可能になります:
- アプリケーションの起動速度の向上
- バインディングや関数の評価の高速化
Qt Quick コンパイラは、次の2つのコンポーネントで構成されています:
注: qmltc、qmlsc、qmlcachegenは内部のビルドツールです。これらの呼び出しを気にする必要がある場合は、ビルドシステムを自作しているか、何か間違ったことをしているかのどちらかです。
QML型コンパイラ
QML型コンパイラ (qmltc)は、QML型をC++クラスにコンパイルします。これらのC++クラスはアプリケーションに追加され、他のC++コードからインスタンス化することができます。これにより、QQmlComponent を使用してQML型のインスタンスを作成する際のオーバーヘッドの多くを回避できます。qmltcの利点を活用するには、C++コードを適宜修正し、新しいクラスを活用する必要があります。
qmltcは、QMLドキュメントの構造を完全に理解できる場合にのみ、そのコンパイルを行うことができます。サポートされていない言語機能に遭遇した場合はコンパイルに失敗します。ただし、バインディングや関数内のJavaScriptコードについては、必ずしも理解している必要はありません。
QMLスクリプトコンパイラ
QMLスクリプトコンパイラ(qmlscおよびqmlcachegen)は、バインディングと関数を、効率的なバイトコードとC++関数の両方にコンパイルします。qt_add_qml_moduleを使用してQMLモジュールを指定している場合、この処理はバックグラウンドで自動的に行われます。 QML コンパイルのさまざまな側面を制御するための利用可能なオプションの詳細については、「コンパイル済み QML ソースのキャッシュ」を参照してください。
コンパイル時には、各 QML または JavaScript ドキュメントに対応する C++ ファイルが作成され、アプリケーションに組み込まれます。この C++ ファイルにはQML コンパイルユニットが含まれており、その構成要素は以下の通りです:
- ドキュメント構造の効率的な表現
- ドキュメント内のすべての関数およびバインディングに対するバイトコード
- コンパイラが完全に理解できる関数およびバインディング用の C++ コード
これにより、QML エンジンは実行時に QML または JavaScript ソースコードをコンパイルすることを避け、代わりに事前にビルドされたコンパイル単位を使用して、QML コンポーネントとその関数およびバインディングをより高速に読み込みます。C++ にコンパイルされた関数やバインディングも、より高速に実行できます。 その他のバインディングや関数は、バイトコードから直接解釈されるか、実行時にJITコンパイルステップを経てマシンコードにコンパイルされます。コンパイル時には、より詳細な型解析を行うことができます。そのため、生成されたC++コードは、一般的にJITコンパイルの結果よりも効率的です。
JavaScript のどの構文が C++ にコンパイルできるかには制限があります。これらの制限の詳細については、「JavaScript を C++ にコンパイルする際の制限事項」を参照してください。QML プロジェクトのコンパイル効率に関する統計については、「関数およびバインディングのコンパイルに関する統計情報の取得」を参照してください。
Qt Quick コンパイラ拡張機能がインストールされている場合、qmlcachegenの代わりにqmlscが使用されます。qmlscには、qmlcachegenに比べて以下の追加機能があります。
- ダイレクトモードでドキュメントをコンパイルできます。この場合、他の QML コンポーネントの基盤となる型の C++ ヘッダーが直接インクルードされ、それらの型のメソッドが直接呼び出されます。対照的に、間接モードでは、qmlcachegenまたはqmlsc は、インタプリタや JIT でも使用されるルックアップ機構を通じてメソッドを呼び出します。
- スタティックモードでドキュメントをコンパイルできます。この場合、qmlscは、C++に公開されているいかなる型のプロパティも、派生型によってシャドウされることはないものと仮定します。これにより、より多くのバインディングや関数をコンパイルできるようになりますが、プロパティがシャドウされている場合は無効なコードが生成されます。
qmlscおよびqmlcachegen は、C++ を出力する代わりに、.qmlc、.jsc、および .mjsc といった「キャッシュファイル」を生成することもできます。これらには依然としてそれぞれ 1 つの QML コンパイルユニットが含まれており、QML エンジンによって読み込まれることで再コンパイルを回避できます。 ただし、これらにはドキュメント構造とバイトコードしか含めることができません。キャッシュファイルが生成される場合、C++ へのバインディングや関数のコンパイルは省略されます。Qt が提供する CMake および qmake のビルドシステムのいずれも、この機能を公開していません。
まとめ
以下の表は、qmltc、qmlcachegen、およびqmlsc の違いをまとめたものです:
| qmltc | qmlcachegen | qmlsc |
|---|---|---|
| QML型をC++クラスにコンパイルする | QMLドキュメントをQMLコンパイルユニットにコンパイルする | QMLドキュメントをQMLコンパイルユニットにコンパイルします |
| 生成された出力は、QQmlComponent に基づくオブジェクト作成よりも高速な代替手段として機能します。 | 生成された出力は、再コンパイルを回避し、実行を高速化するために QML エンジン内部で使用されます。 | 生成された出力は、再コンパイルを回避し、実行を高速化するために、QML エンジン内部で使用されます。ダイレクトモードとスタティックモードを使用すると、アプリケーションをさらに高速化できます。 |
| Qt のすべてのバージョンで利用可能 | すべてのバージョンの Qt で利用可能 | 商用のお客様が利用可能 |
© 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.