코드 생성 직전에 가장 먼저 하는 일은 Compose Runtime 버전을 확인하는 것이다. 버전 검사 중 Kotlin 컴파일러의 버전을 검사하고, 그 다음으로 Compose Runtime의 버전을 확인한다.
마지막으로 Compose Compiler는 코드 생성 단계로 넘어간다. 이는 어노테이션 프로세서와 컴파일러 플러그인의 공통점 중 하나이다.
컴파일러 플러그인은 목표로하는 플랫폼에 대해 최종적인 코드를 생성하기 전에 언어의 중간 표현인 IR에 접근할 수 있고, 코드를 생성하거나 코드를 수정할 수 있다. 이는 Kotlin 컴파일러의 백엔드 단계에서 발생한다.
컴파일러 플러그인은 다양한 형태로 코드를 생성할 수 있다. IR은 목표로 하는 플랫폼에 관계없이 언어 요소의 표현, 즉 “중간 표현”으로 존재한다.
Compose Compiler 플러그인은 IR생성 후 Kotlin 컴파일러의 공통 IR 백엔드에서 제공하는 익스텐션인 IrGenerationExtension을 통해 IR을 조작(변형)하는 역할을 수행한다.

Compose Compiler는 라이브러리가 지원하는 개념 중 일부의 수준을 낮추어 런타임이 이해할 수 있는 표현으로 정규화한다. 이 과정에서 IR 트리의 모든 엘리먼트를 방문하며 런타임의 요구사항에 따라 필요한 엘리먼트에 맞게 IR을 조정한다.
클래스와 타입의 안정성(stability)을 추론하고, 런타임이 recomposition 여부를 판단할 수 있도록 필요한 메타데이터를 IR에 추가한다.
소스 코드에 포함된 리터럴 값을 런타임에서 변경 가능하도록, 단순 상수 값이 아닌 상태(State) 접근 형태로 변환한다. 이를 통해 소스 코드를 재컴파일하지 않고도 값 변경이 가능해진다.
모든 Composable 함수에 암시적인 Composer 매개변수를 추가하고, Composable 호출 체인 전체에 해당 매개변수를 전달하도록 변환한다.
fun A(composer: Composer, changed: Int)