Compose Compiler와 Compose Runtime은 Jetpack Compose의 핵심 요소이다. Compose UI는 엄밀하게 말하자면 Compose 아키텍처의 일부가 아니다. 그 이유는 Runtime과 Compiler는 어떤 클라이언트 라이브러리에서든 사용될 수 있도록 포괄적으로 디자인되었기 때문이다. Compose UI는 Runtime과 Compiler를 활용하는 클라이언트 중 하나일 뿐이다.

Compose는 코드 생성에 다소 의존한다.
Kotlin과 JVM에서 보통 kapt를 통한 어노테이션 프로세서를 사용하는 것이 일반적이지만, Compose Compiler는 Kotlin 컴파일러 플러그인이다. 이는 라이브러리가 Kotlin 컴파일 단계 내에서 진행되는 컴파일 타임 작업을 수반할 수 있게 한다. Kotlin 컴파일러 플러그인이라는 것은 컴파일러의 프론트엔드 단계에서 진단을 보고할 수 있는 기회를 제공하며, 이는 매우 빠른 피드백 루프로 이어진다.
Kotlin 컴파일러 플러그인의 또 다른 장점은 개발자가 작성한 소스를 정적 분석하여 마음대로 수정할 수 있다는 것이다. 개발자가 작성한 소스 코드에 대한 중간 출력 단계인 IR 과정의 소스 코드를 수정할 수 있으며, 플랫폼별 원시 코드로 변환되기 전에 원하는 구조로 바꾼다. (JVM → bytecode instruction)
<aside> 💡
Compose Compiler는 IR 단계에서 소스 코드를 수정함으로써 Compose Compiler는 Compose Runtime이 요구하는 대로 Composable 함수를 마음대로 변형시킬 수 있다.
</aside>
Compiler 플러그인은 annotation processor보다 훨씬 더 많은 작업을 할 수 있지만, 둘 다 컴파일 타임에 코드를 분석하고 검증한다는 공통점이 있다. 이 과정에서 중요한 역할을 하는 것이 컴파일러의 프론트엔드 단계이다.
Compose Compiler는 Kotlin 컴파일러의 프론트엔드에서 제공하는 **확장 지점(extension point)**을 활용해 다음과 같은 작업을 수행한다.
@Composable 함수 호출 규칙 검증즉, Compose Compiler는 단순히 코드를 생성하는 수준을 넘어서 언어 규칙처럼 동작하는 제약을 컴파일 시점에 검사한다**.**
그 외에도 Compose는 특정 상황에서 추가 검사나 런타임 최적화를 돕기 위해 여러 어노테이션을 제공한다. 이 어노테이션들은 단순한 표시가 아니라, 컴파일러나 런타임이 해당 선언을 어떻게 해석하고 최적화할지에 대한 힌트로 사용된다.