aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/doc/src/qtqml-qtquick-compiler-tech.qdoc
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/doc/src/qtqml-qtquick-compiler-tech.qdoc')
-rw-r--r--src/qml/doc/src/qtqml-qtquick-compiler-tech.qdoc123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/qml/doc/src/qtqml-qtquick-compiler-tech.qdoc b/src/qml/doc/src/qtqml-qtquick-compiler-tech.qdoc
new file mode 100644
index 0000000000..3631a85b5f
--- /dev/null
+++ b/src/qml/doc/src/qtqml-qtquick-compiler-tech.qdoc
@@ -0,0 +1,123 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+\page qtqml-qtquick-compiler-tech.html
+\ingroup overviews
+\title Qt Quick Compiler
+\brief Overview of Qt Quick Compiler components
+
+Qt Quick Compiler lets you process QML and JavaScript code at compile
+time, rather than at run time. This allows for:
+
+\list
+ \li Faster application startup
+ \li Faster evaluation of bindings and functions
+\endlist
+
+The Qt Quick Compiler consist of two components:
+\list
+ \li \l {QML type compiler}
+ \li \l {QML script compiler}
+\endlist
+
+\note \e qmltc, \e qmlsc and \l qmlcachegen are internal build tools. If you
+need to care about their invocation, you are either writing a build system, or
+you are doing something wrong.
+
+\section1 The QML type compiler
+
+The \l{QML type compiler}, \e(qmltc) compiles QML types to C++ classes. These C++
+classes are then added to your application and can be instantiated from other
+C++ code. This way you can avoid much of the overhead of using \l{QQmlComponent}
+to create instances of your QML types. In order to benefit from \l qmltc, you
+need to adapt your C++ code and make use of the new classes.
+
+\l qmltc can only compile a QML document if it completely understands its
+structure. It will fail if an unsupported language feature is encountered.
+It does not have to understand the JavaScript code in bindings and functions,
+though.
+
+\section1 The QML script compiler
+
+The \l{QML script compiler}, (\e qmlsc and \e qmlcachegen) compiles bindings and
+functions to both, an efficient byte code and C++ functions. This process
+automatically happens behind the scenes if you are using \l{qt_add_qml_module}
+to specify your QML modules. For more information about available options to
+control different aspects of QML compilation, see
+\l {Caching compiled QML sources}.
+
+At compile time, for each QML or JavaScript
+document a corresponding C++ file is created and built into the application. The
+C++ file then contains a \e{QML compilation unit}, which consists of:
+
+\list
+ \li An efficient representation of the document structure
+ \li Byte code for all functions and bindings in the document
+ \li C++ code for functions and bindings the compiler fully understands
+\endlist
+
+The QML engine then refrains from compiling the QML or JavaScript source code
+at run time and instead uses the pre-built compilation unit to load the QML
+component and its functions and bindings more quickly. The functions and
+bindings that were compiled to C++ can also be executed faster. Other bindings
+and functions are either interpreted directly from the byte code, or compiled
+to machine code via a JIT compilation step at run time. At compile time, more
+involved type analysis can be performed. Therefore, the generated C++ code
+is generally more efficient than the result of the JIT compilation.
+
+There are limitations on what JavaScript constructs can be compiled to C++.
+For more information, see \l {Limitations when compiling JavaScript to C++}.
+
+\e{qmlsc} will be used instead of \e{qmlcachegen} if the Qt Quick Compiler
+Extensions are installed. It has the following additional features over
+\e{qmlcachegen}:
+
+\list
+ \li It can compile documents in Direct Mode. In that case, the C++ headers
+ of the types underpinning other QML components are directly included
+ and the methods of those types are directly called. Conversely, in
+ Indirect Mode, \e qmlcachegen or \e qmlsc call methods through the
+ lookup mechanism which is also used in the interpreter and JIT.
+ \li It can compile documents in Static Mode. In that case, \e qmlsc assumes
+ that no properties of any types exposed to C++ can be shadowed by
+ derived types. This allows for more bindings and functions to be
+ compiled, but generates invalid code if any properties are shadowed.
+\endlist
+
+Instead of producing C++ as output, \l {qmlsc} and \l {qmlcachegen} can also
+generate .qmlc, .jsc and .mjsc "cache files". These still contain a QML
+compilation unit each, and can be loaded by the QML engine to avoid
+re-compilation. They can only contain document structure and byte code, though.
+Compilation of bindings and functions to C++ is omitted if cache files are
+produced. Neither the CMake nor the qmake build system offered by Qt expose this
+functionality.
+
+\section1 Summary
+
+The following table summarizes the differences between \l{qmltc},
+\l{qmlcachegen} and \l{qmlsc}:
+
+\table
+ \header
+ \li \e qmltc
+ \li \e qmlcachegen
+ \li \e qmlsc
+ \row
+ \li Compiles QML types to C++ classes
+ \li Compiles QML documents to QML compilation units
+ \li Compiles QML documents to QML compilation units
+ \row
+ \li Generated output acts as faster alternative to
+ \l{QQmlComponent}-based object creation.
+ \li Generated output is used internally by the QML engine to avoid
+ re-compilation, and to speed up execution.
+ \li Generated output is used internally by the QML engine to avoid
+ re-compilation, and to speed up execution. Direct Mode and Static
+ Mode can further accelerate your application.
+ \row
+ \li Available for all versions of Qt
+ \li Available for all versions of Qt
+ \li Available for commercial customers
+\endtable
+*/