QML 스크립트 컴파일러
QML 스크립트 컴파일러는 QML 및 JavaScript 파일의 함수와 표현식을 해석할 수 있는 바이트 코드로 컴파일하거나 QML 엔진에서 Just-in-time 컴파일할 수 있도록 컴파일합니다.
또한 QML 파일의 일부 함수와 표현식을 JavaScript의 특성에 따라 설정된 제한 내에서 C++ 코드로 컴파일합니다. 철저하게 분석할 수 있는 함수에 대한 C++ 코드를 생성합니다. 다음 순서도는 컴파일 워크플로우를 설명합니다.
QML 스크립트 컴파일러는 두 가지 버전으로 제공됩니다. 하나는 QML 스크립트 컴파일러의 일부인 Qt Quick Compiler. 또 다른 하나는 상용 전용 애드온 Qt Quick Compiler 확장 기능의 일부인 qmlsc입니다.
qmlcachegen
은 메타객체 시스템을 사용하여 조회를 생성하고 중앙 위치인 컴파일 유닛에 저장합니다. 컴파일 유닛에는 문서 구조의 표현, 각 함수 및 표현식에 대한 컴팩트한 바이트 코드 표현, 컴파일러가 완전히 이해하는 함수 및 바인딩에 대한 네이티브 코드가 포함되어 있습니다. 컴파일 유닛의 바이트 코드는 QML 엔진에서 재컴파일을 피하고 실행 속도를 높이기 위해 사용할 수 있습니다.
qmlsc
반대로qmlsc는 두 가지 추가 모드를 제공하여 qmlcachegen의 기본 기능을 확장합니다.
정적 모드
정적 모드에서 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 모듈을 공개 모듈 대신 링크하세요.
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++ 코드 생성을 건너뛰고 Just-in-time 컴파일러를 통해 해석되거나 실행될 바이트 코드만 생성합니다. 대부분의 일반적인 QML 표현식은 다소 단순합니다. QObject의 값 조회, 산술, 간단한 if/else 또는 루프 구문 등입니다. 이러한 표현식은 C++로 쉽게 표현할 수 있으며, 그렇게 하면 애플리케이션을 더 빠르게 실행할 수 있습니다.
함수 및 바인딩 컴파일에 대한 통계 얻기
QML 스크립트 컴파일러는 QML을 C++로 컴파일할 때 통계를 기록합니다. 이를 통해 함수 및 바인딩 컴파일이 성공했는지 또는 어떤 오류로 인해 컴파일이 실패했는지에 대한 통찰력을 얻을 수 있습니다. 이러한 결과는 바인딩 또는 함수별로 표시될 뿐만 아니라 파일별, 모듈별, 프로젝트 수준에서도 통계가 요약됩니다. 이를 통해 프로젝트가 얼마나 잘 컴파일되고 있는지에 대한 빠른 개요를 확인할 수 있습니다.
통계를 표시하려면 all_aotstats cmake 대상을 호출하세요.
참고: 이러한 통계는 qt_add_qml_module cmake API를 통해 등록된 모듈에 대해서만 사용할 수 있습니다.
© 2025 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.