Compose internal ch.2 - Compose 컴파일러 (The Compose compiler)

Doach Gosum·2024년 5월 28일

Compose 컴파일러
-> Kotlin compiler plugin 의 일종

Annotation Processor와의 차이점?

  • Annotation Processor -> 단순히 코드를 추가만 할 수 있음, 컴파일 이전에 수행.
  • Compiler plugin -> 코드 자체를 수정할 수 있음

(컴파일러 플러그인의 장점 중, 프론트엔드 단계에서 진단을 보고한다는 것이 있는데 어떤 의미인지 좀더 파악 필요함)

KSP

  • 구글에서 제안하는 경량 컴파일러 플러그인
  • 컴파일러 플러그인 사용 시 수반되는 단점과 위험을 보완

Compose Annotations

@Composable
@ComposableCompilerApi
@InternalComposeApi
@DisallowComposableCalls
@ReadOnlyComposable
@NonRestartableComposable
@StableMarker

  • @Immutable
  • @Stable

컴파일러 확장(Compiler Extension, 이하 CE) 등록

Compose compiler plugin은 kotlin compiler에 자신을 등록함 (ComponentRegistrar 메커니즘 사용)

  • 라이브 리터럴, composition 검사 등의 기능을 사용할 수 있도록 하는 특정 컴파일러 플래그 활성화

Kotlin 컴파일러 버전

Compose compiler 는 매우 구체적인 Kotlin Compiler 버전이 요구됨.

  • 버전 일치여부 확인 필요

정적 분석

컴파일러 플러그인의 표준동작에서 린팅이 가장 먼저 수행되어야 함.

  • 린팅(linting)
    • 프론트엔드 단계에서 수행
    • 라이브러리 어노테이션이 런타임에서 기대하는 방식으로 사용되고 있는지 추적 검사

(정적분석이란? -> 소스 코드의 실행 없이 정적으로 프로그램의 문제를 찾는 과정, 비 런타임 환경에서 수행)

정적 검사기

  • CE의 일부로 제공됨
  • 프론트엔드 단계에서 수행, 빠르고 리소스 소모가 적음

호출 검사

  • 코드베이스 전체에서 모든 호출에 대한 정적분석을 수행하는 CE
  • composable 함수의 호출 범위를 주기적으로 체크
    • 호출자가 적절한지? (composable 함수 내에서만 호출이 가능하므로)
    • inline 함수의 경우, 상위 호출자가 composable 인지 여부 등

해당 기능들을 수행하기 위해 넓은 컨텍스트가 필요하고 이를 탐색하는 과정에서 방문자 패턴(visitor pattern)이 사용됨

타입 검사

함수 호출 검사와 유사

  • @Composable 타입인지 체크

선언 검사

  • @Composable 함수의 재정의, 함수의 suspend 여부 체크 등

진단 제지기 (Diagnostic suppression)

CE의 일종으로 Kotlin Compiler의 검사를 피하려는 경우에 흔히 사용 (언어적인 제한 우회)

  • inline 람다의 경우 non-source(BINARY or RUNTIME) annotation 처리가 불가능함
    근데 @Composable은 가능함. (@Composable은 BINARY 타입임)
  • 인수에 NamedParameter가 가능
profile
기본 그리고 간결함

0개의 댓글