Qt クイックコンパイラ

Qt Quick Compiler を使うと、QML や JavaScript のコードを実行時ではなくコンパイル時に処理することができます。これにより、以下のことが可能になります:

  • アプリケーション起動の高速化
  • バインディングや関数の評価の高速化

Qt Quick Compiler は 2 つのコンポーネントで構成されています:

注意: qmltcqmlscqmlcachegenは内部ビルドツールです。これらのツールの起動を気にする必要がある場合は、ビルドシステムを書いているか、何か間違ったことをしているかのどちらかです。

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 Compiler Extensions がインストールされている場合、qmlcachegenの代わりにqmlsc が使用されます。qmlcachegenには以下の機能が追加されています:

  • ダイレクト・モードでドキュメントをコンパイルできます。この場合、他のQMLコンポーネントを支える型のC++ヘッダが直接インクルードされ、それらの型のメソッドが直接呼び出されます。逆に間接モードでは、qmlcachegenや qmlscはインタプリタやJITでも使われているルックアップ機構を通してメソッドを呼び出します。
  • スタティック・モードで文書をコンパイルすることもできる。この場合、qmlscはC++に公開された型のプロパティが派生型によってシャドウされることはないと仮定します。これにより、より多くのバインディングや関数をコンパイルできるようになりますが、プロパティがシャドウされると無効なコードが生成されます。

qmlscと qmlcachegenは出力としてC++を生成する代わりに、.qmlc、.jsc、 .mjscの「キャッシュファイル」を生成することもできます。これらのファイルにはQMLコンパイルユニットが含まれており、QMLエンジンに読み込ませることで再コンパイルを避けることができます。しかし、これらのファイルには文書構造とバイトコードしか含めることができません。C++へのバインディングや関数のコンパイルは、キャッシュファイルが生成されれば省略されます。Qt が提供する CMake と qmake のどちらのビルドシステムも、この機能を公開していません。

まとめ

以下の表はqmltcqmlcachegenqmlscの違いをまとめたものです:

qmltcqmlcachegenqmlsc
QML 型を C++ クラスにコンパイルQMLドキュメントをQMLコンパイルユニットにコンパイルするQML ドキュメントを QML コンパイルユニットにコンパイルする
生成された出力は、QQmlComponent ベースのオブジェクト生成に代わる高速なものとして動作します。生成された出力はQMLエンジンの内部で再コンパイルを回避し、実行を高速化するために使用されます。生成された出力はQMLエンジン内部で再コンパイルを回避し、実行を高速化するために使用されます。ダイレクトモードとスタティックモードは、アプリケーションをさらに高速化します。
Qt のすべてのバージョンで利用可能Qt のすべてのバージョンで利用可能商用利用可能

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