이 페이지에서

QML 스크립트 컴파일러

QML 스크립트 컴파일러는 QML 및 JavaScript 파일 내의 함수와 식을 QML 엔진에서 해석하거나 JIT(Just-in-time) 컴파일할 수 있는 바이트 코드로 컴파일합니다.

또한, JavaScript의 특성상 정해진 제한 범위 내에서 QML 파일에 포함된 일부 함수와 표현식을 C++ 코드로 컴파일합니다. 이 컴파일러는 철저히 분석할 수 있는 함수에 대해 C++ 코드를 생성합니다. 다음 순서도는 컴파일 워크플로를 설명합니다.

흐름도는 컴파일 방식을 보여줍니다

QML 스크립트 컴파일러는 두 가지 버전으로 제공됩니다. 하나는 qmlcachegen으로, 이는 Qt Quick Compiler의 일부입니다. 다른 하나는 상업용 전용 애드온인 ‘Qt Quick Compiler Extensions’의 일부인 qmlsc입니다.

qmlcachegen

qmlcachegen은 메타 객체 시스템을 사용하여 룩업(lookup)을 생성하고 이를 중앙 위치인 컴파일 유닛에 저장합니다. 컴파일 유닛에는 문서 구조의 표현, 각 함수 및 표현식에 대한 압축된 바이트 코드 표현, 그리고 컴파일러가 완전히 이해하는 함수 및 바인딩에 대한 네이티브 코드가 포함됩니다. 컴파일 유닛 내의 바이트 코드는 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 모듈을 링크해야 합니다.
    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(Just-in-time) 컴파일러를 통해 실행될 바이트 코드만 생성합니다. 가장 일반적인 QML 표현식은 비교적 단순합니다. QObject에 대한 값 조회, 산술 연산, 간단한 if/else 또는 루프 구문 등이 이에 해당합니다. 이러한 표현식은 C++로 쉽게 표현할 수 있으며, 이렇게 하면 애플리케이션의 실행 속도가 빨라집니다.

함수 및 바인딩 컴파일 통계 확보

QML 스크립트 컴파일러는 QML을 C++로 컴파일할 때 통계를 기록합니다. 이를 통해 함수 및 바인딩의 컴파일 현황을 파악할 수 있습니다. 여기에는 컴파일에 소요된 시간, 컴파일 성공 여부, 실패한 경우 어떤 오류로 인해 실패했는지가 포함됩니다. 이러한 결과를 바인딩이나 함수별로 표시하는 것 외에도, 통계는 파일별, 모듈별, 그리고 프로젝트 수준별로 요약되어 제공됩니다. 이를 통해 프로젝트의 컴파일 상태를 한눈에 파악할 수 있습니다.

통계 정보를 표시하려면 all_aotstats CMake 타깃을 호출하십시오.

컴파일 통계 수집은 기본적으로 활성화되어 있습니다. 이를 비활성화하려면 qt_add_qml_module을 처음 호출하기 전에 QT_QML_GENERATE_AOTSTATS CMake 변수를 OFF로 설정하십시오.

참고: 이 통계는 qt_add_qml_module CMake 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.