Android
[Android] Compose 컴파일러 - (5)
클래스 안정성 추론Compose의 smart recomposition은 Composable의 입력값이 변경되지 않고, 값이 안정적으로 간주될 때 생략되는 것을 의미한다. Compose Runtime은 필요에 따라 recomposition을 생략하기 위해 입력값을 안전하게 읽고 비교할 수 있다는 것을 의미하며 안정성의 궁극적인 목적은 런타임에 도움이 되는 데 있다.안정적인 타입에 충족하는 조건을 아래와 같다.두 인스턴스에 대한 equals 함수의 호출은 항상 동일한 두 인스턴스에 대해 동일한 결과를 반환한다. 이는 비교값을 일관적이라는 것을 의미하며, 란타임은 이 사실에 의존하는 가정을 가진다.타입의 public 프로퍼티가 변경될 때마다 composition은 항상 변경 사항에 대한 알림을 받게 된다. 이..
[Android] Compose 컴파일러 - (4)
정적 검사기정적 검사기들은 라이브러리의 올바른 사용을 보장하고 라이브러리가 해결하고자 하는 문제에 대해 명백한 가이드를 제공한다.예를 들어 Composable 함수의 요구 사항에 정의된 항목들이 검사기에 의해 검증되고 개발자가 위반하게 될 경우 즉각적으로 IDE를 통해 알려준다.익스텐션으로서 등록된 모든 검사기는 Kotlin Compiler의 프론트엔드 단계에서 실행되므로 속도가 매우 빠르고, CPU를 많이 소모하지 않는 작업들로 구성되어 있다.호출 검사호출 검사기는 코드베이스 전체에서 모든 호출에 대해 정적 분석을 수행하는 데 사용되는 컴파일러 익스텐션이다. 따라서 소스에서 호출로 간주되는 모든 계층 구조 요소를 방문하기 위해 반복적으로 호출되는 소스 검사 기능을 제공한다.Compose Compiler..
[Android] Compose 컴파일러 - (3)
Compose Compiler 확장 등록Compose Compiler Plugin이 수행하는 첫 번째 작업은 Kotlin Compiler에서 제공하는 메커니즘은 ComponentRegistrar를 사용하여 Kotlin Compiler 파이프라인에 자신을 등록하는 것이다.ComponentRegistrar는 다양한 목적을 위해 일련의 컴파일러 익스텐션을 등록하여 라이브러리 사용을 보다 쉽게 하고 Runtime에 필요한 코드들을 생성하는 역할을 한다.Compose Compiler는 활성화된 컴파일러 플래그(on/off 값)에 따라 몇 가지 익스텐션도 등록한다.Jetpack Compose를 사용하는 개발자들은 앱을 다시 컴파일하거나 재시작할 필요 없이 현재 타이핑 중인 코드를 실시간으로 UI에 반영하는 기능을 ..
[Android] Compose 컴파일러 - (2)
Compose AnnotationsCompose Compiler가 필요한 요소들을 스캔하고 변환할 수 있도록 마커의 역할을 해주는 어노테이션들은 어떻게 활용되는 걸까?Compose Compiler는 컴파일 단계에서 소스코드를 스캔하고 제약 사항이 충족되고 있는지, 타입 시스템이 Composable 함수나 선언 표현식을 일반 함수들과는 다르게 처리하고 있는지 확인한다.그 외에도 Compose는 추가적인 검사와 다양한 런타임 최적화를 위해 추가적인 어노테이션들을 제공한다.모든 Compose 어노테이션은 Compose Runtime 라이브러리에서 제공된다.@Composable대부분의 어노테이션 프로세스는 표현식을 변형하는 행위를 할 수 없다.그렇기에 @Composable 어노테이션이 붙어있는 대상을 Compo..
[Android] Compose 컴파일러 - (1)
Jetpack Compose는 다양한 라이브러리의 집합으로 구성되어 있다.그 중 눈여겨 봐야할 라이브러리는 Compose Compiler, Compose Runtime, Compose UI 세 가지가 있다.(나머지는 중요하지 않다는게 아니다.)Compose Compiler와 Compose Runtime은 Compose의 핵심 요소로 요구 사항을 충족하는 어떤 클라이언트 라이브러리에서든 사용될 수 있도록 포괄적으로 되자인 되었다.반면 Compose UI는 Runtime과 Compiler를 활용하는 클라이언트 정도로 애초에 Compose의 아키텍처에 속해 있지 않다.즉 Compose Compiler와 Compose Runtime과 상호작용할 수 있는 다른 클라이언트도 존재한다. Compose Compiler..
[Android] Compose Composable 함수들 - (3)
Suspend 함수와 유사성Kotlin의 suspend는 다른 suspend 함수 내부에서만 호출될 수 있고, suspend 함수 또한 호출 컨텍스트를 필요로 한다.이는 suspend 함수 끼리 묶여 있을 수 있도록 강제하며, Kotlin Compiler가 모든 계산 과정에 걸쳐 런타임 환경을 주입하고 전달하는 기회를 제공하게 된다.이 런타임 환경에선 매개변수 목록의 끝에 Continuation이라는 추가 매개변수가 각 susepnd 함수에 추가된다.이 매개변수는 암시적이며 비가시적인 매개변수이다. 이전에 알아보았던 Composer과 비슷한 형태를 가지고 있다.Continuation은 프로그램에게 어떻게 실행을 계속 이어서 할지 알려주는 콜백과 같으며 이런 특징을 통해 언어 차원에서 몇 가지의 강력한 기..