• 목록 (128)
    • Android (62)
    • Back-End (2)
    • Java (3)
    • Kotlin (16)
    • CS (7)
    • 개발 서적 (12)
    • 문제 풀이 (26)

최근 글

티스토리

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
MJ_94

한 우물만 파는 기술 블로그

Android

[Android] Compose 컴파일러 - (4)

2024. 11. 18. 12:58

정적 검사기

정적 검사기들은 라이브러리의 올바른 사용을 보장하고 라이브러리가 해결하고자 하는 문제에 대해 명백한 가이드를 제공한다.

예를 들어 Composable 함수의 요구 사항에 정의된 항목들이 검사기에 의해 검증되고 개발자가 위반하게 될 경우 즉각적으로 IDE를 통해 알려준다.

익스텐션으로서 등록된 모든 검사기는 Kotlin Compiler의 프론트엔드 단계에서 실행되므로 속도가 매우 빠르고, CPU를 많이 소모하지 않는 작업들로 구성되어 있다.

호출 검사

호출 검사기는 코드베이스 전체에서 모든 호출에 대해 정적 분석을 수행하는 데 사용되는 컴파일러 익스텐션이다. 따라서 소스에서 호출로 간주되는 모든 계층 구조 요소를 방문하기 위해 반복적으로 호출되는 소스 검사 기능을 제공한다.

Compose Compiler가 검사를 위한 정보를 수집하려면 이동 경로와 같이 한 번 방문했던 엘리먼트에 작은 bit 단위의 정보를 기록하고, 추가 방문 경로에서 더욱 복잡한 검증을 수행해야 한다.

이를 위해 Compiler는 해당 정보를 컨텍스트 추적을 통해 편리하게 기록 후 검사 범위를 넓히고 람다식이나 try/catch 구문 혹은 관련이 있을 수 있는 항목들을 모두 탐색할 수 있다.

타입 검사

Compose Compiler에는 타입 추론과 관련 검사가 있으며 @Composable 어노테이션이 달려있지 않은 타입이 발견된 경우 이에 대해 오류 보고를 할 수 있다.

선언 검사

호출 위치와 타입에 대한 검사도 필요하지만, 프로퍼티, 프로퍼티 접근자, 함수, 함수의 매개변수와 같은 것들의 위치도 모든 Compose 코드베이스의 일부이기에 분석되어야 한다.

프로퍼티, 프로퍼티의 getter 함수들은 Composable로 어노테이션 되어 있어도 재정의될 수 있다. Compose Compiler에는 이러한 KtElements 중 어느 것이든 재정의될 경우 Composable로 어노테이션 되어 있는지를 확인하여 일관성을 유지하는 검사를 수행한다.

또 다른 선언 검사로는 Composable 함수가 suspend 함수가 아닌지 확인하는 것으로, Composable 함수는 suspend를 지원하지 않기 때문이다. suspend와 composable 함수는 색깔이 다른 함수이며 개념적인 차이점은 분명하다.

진단 제지기

컴파일러 플러그인은 진단 제지기를 익스텐션으로 등록할 수 있으며 일부 특정 상황에 대한 진단을 무시할 수 있다.
(예시를 들면 정적 검사를 통한 오류 알림을 무시한다던지..)

런타임 버전 검사

Kotlin Compiler 버전 검사 완료 후, 각 Compose Compiler는 버전에 따라 지원하는 최소 Runtime 버전이 있고, 최소 버전 보다 높은 다중의 런타임을 지원한다.

코드 생성

마지막 작업으로 Compose Compiler가 코드 생성 단계로 넘어간다. 이는 어노테이션 프로세서와 컴파일러 플러그인의 공통점 중 하나로, 둘 다 런타임 라이브러리들이 사용할 수 있는 편리한 코드를 생성하거나 합성하는데 자주 활용된다.

코틀린 IR

이전에 나온것 처럼 Compiler 플러그인은 목표로 하는 플랫폼의 최종적인 코드를 생성하기 전에 언어의 IR에 접근할 수 있다. Kotlin IR은 목표로 하는 플랫폼에 관계없이 언어 요소의 표현, 즉 ‘중간 표현’으로써 존재하며 Jetpack Compose로 생성된 코드는 멀티플랫폼이 될 가능성을 가지고 있다.

IR이란 Intermediate Representation으로 Kotlin Compiler가 소스파일을 해석하는 하나의 과정이다.

낮추기

낮추기란 번역 컴파일러가 더 높은 수준의 프로그래밍 개념에서 더 낮은 수준의 완자적인 개념의 조합으로 수행할 수 있는 작업을 의미한다.

Compose Compiler는 라이브러리가 지원하는 개념 중 일부의 수준을 낮춰 런타임이 이해할 수 있는 표현으로 정규화해야 한다.

수준을 낮추는 과정은 Compose Compiler Plugin의 코드 생성 단계에서 진행되며, 이 과정에서 IR 트리의 모든 엘리먼트를 방문하고 런타임의 요구 사항에 따라 필요한 엘리먼트에 맞게 IR을 조정한다.

아래는 낮추기 단계에서 발생하는 몇 가지 예시이다.

  • 클래스 안정성을 추론하고 런타임에서 이를 이해하는데 필요한 메타데이터 추가.
  • 소스 코드의 변경 사항을 리컴파일하지 않고도 런타임에서 반영할 수 있도록 라이브 리터럴 표현식을 가변적인 상태의 인스턴스에 접근하도록 변환하는 것.
  • Composable 함수에 암시적인 Composer 매개변수를 삽입하고, 해당 매개변수를 모든 Composable 호출에 전달.
  • recomposition, 상태 변경 전파와 같은 기능을 지원하기 위해 Composable 본문 래핑.
저작자표시 비영리 변경금지 (새창열림)

'Android' 카테고리의 다른 글

[Android] Compose 컴파일러 - (6)  (0) 2024.11.20
[Android] Compose 컴파일러 - (5)  (0) 2024.11.19
[Android] Compose 컴파일러 - (3)  (0) 2024.11.15
[Android] Compose 컴파일러 - (2)  (0) 2024.11.14
[Android] Compose 컴파일러 - (1)  (0) 2024.11.13
    'Android' 카테고리의 다른 글
    • [Android] Compose 컴파일러 - (6)
    • [Android] Compose 컴파일러 - (5)
    • [Android] Compose 컴파일러 - (3)
    • [Android] Compose 컴파일러 - (2)
    MJ_94
    MJ_94
    안드로이드, 개발 관련 기술 블로그

    티스토리툴바