본문 바로가기
Kotlin/Release Notes

[Kotlin Release Notes] Preview of Kotlin 1.6.20 With Prototype of Context Receivers, Parallel Compilation on JVM, Incremental Compilation in JS, and More

by 노력남자 2023. 9. 12.
반응형

2022년 2월 8일

 

1.6.20 릴리스의 첫 번째 미리보기가 나왔습니다! Kotlin 1.6.20-M1을 소개합니다! 이 미리보기에는 다음과 같은 내용이 포함되어 있습니다:

  • Kotlin/JVM에서 컨텍스트 수신자의 프로토타입을 사용하여 컨텍스트 종속 선언 정의.
  • JVM IR 백엔드에서 단일 모듈의 병렬 컴파일을 통한 빠른 빌드.
  • Kotlin/JS IR에서 점진적 컴파일을 통한 빠른 개발.
  • 멀티플랫폼 프로젝트의 계층 구조로 코드 공유가 더 쉬워짐.
  • Kotlin/Native 성능 개선

 

이러한 기능을 시도하고 Kotlin 1.6.20을 개선하는 데 도움이 되는 문제를 신고하기 위해 1.6.20-M1을 설치해 보세요.


Kotlin/JVM을 위한 컨텍스트 수신자 프로토타입


다중 수신자 지원에 대한 YouTrack 이슈는 많은 투표와 긍정적인 피드백을 받았으므로 이를 프로토타입으로 만드는 것이 로드맵의 일부가 되었습니다. 최근에는 이 기능의 초기 디자인 제안을 "컨텍스트 수신자"라는 이름으로 게시했습니다. 이제 Kotlin/JVM을 위한 프로토타입을 공유하고 있습니다.

Kotlin 1.6.20-M1을 사용하면 더 이상 하나의 수신자에 제한되지 않습니다. 더 필요하다면 함수, 프로퍼티 및 클래스를 컨텍스트 종속(또는 컨텍스트)으로 만들어 선언에 컨텍스트 수신자를 추가할 수 있습니다. 컨텍스트 종속 선언:

  • 호출자의 스코프에 모든 선언된 컨텍스트 수신자가 암시적 수신자로 존재해야 합니다.
  • 선언된 컨텍스트 수신자를 몸체 스코프로 암시적 수신자로 가져옵니다.

 

interface LoggingContext {
    val log: Logger // 이 컨텍스트는 로거에 대한 참조를 제공합니다
}

context(LoggingContext)

fun startBusinessOperation() {
    // LoggingContext가 암시적 수신자이므로 log 프로퍼티에 접근할 수 있습니다.
    log.info("작업이 시작되었습니다")
}

fun test(loggingContext: LoggingContext) {
    with(loggingContext) {
        // startBusinessOperation()을 호출하려면 스코프에 LoggingContext가 암시적 수신자로 존재해야 합니다.
        startBusinessOperation()
    }
}


프로젝트에서 컨텍스트 수신자를 활성화하려면 -Xcontext-receivers 컴파일러 옵션을 사용하십시오. 이 기능과 구문에 대한 자세한 설명은 KEEP에서 찾을 수 있습니다.

구현이 프로토타입임을 유의하십시오:

  • -Xcontext-receivers를 활성화하면 컴파일러가 프리릴리스 이진 파일을 생성하며 프로덕션 코드에서 사용할 수 없습니다.
  • 컨텍스트 수신자에 대한 IDE 지원은 지금은 최소한입니다.

 

이 기능을 장난감 프로젝트에서 시도하고 여기 YouTrack 이슈에서 여러분의 생각과 경험을 공유해 보세요. 문제가 발생하는 경우 새로운 이슈를 제출해 주세요.

 

JVM 백엔드의 단일 모듈 병렬 컴파일 지원


우리는 새로운 JVM IR 백엔드 컴파일 시간을 개선하기 위한 로드맵 항목을 계속해서 진행하고 있습니다. Kotlin 1.6.20-M1에서는 모듈 내의 모든 파일을 병렬로 컴파일하는 실험적인 JVM IR 백엔드 모드를 추가했습니다. 병렬 컴파일은 총 컴파일 시간을 최대 15%까지 줄일 수 있습니다.

이 실험적인 병렬 백엔드 모드를 -Xbackend-threads 컴파일러 옵션을 사용하여 활성화할 수 있습니다. 이 옵션에 대한 다음 인수를 사용하세요:

  • N은 사용하려는 스레드 수와 동일합니다. CPU 코어 수보다 크지 않아야 하며, 그렇지 않으면 스레드 간의 컨텍스트 전환 때문에 병렬화가 효과가 없어집니다.
  • 0은 각 CPU 코어에 대해 하나의 스레드를 사용합니다.

 

이 병렬화는 프로젝트 빌드가 Gradle과 같은 빌드 도구에 의해 충분히 병렬화되지 않을 때에만 도움이 됩니다. 예를 들어 매우 큰 단일 모듈이 있는 경우 해당 모듈에 -Xbackend-threads 컴파일러 옵션을 추가하면 도움이 될 수 있습니다. 그러나 프로젝트가 많은 작은 모듈로 구성되어 병렬 빌드가 있는 경우 추가적인 병렬화 레이어를 추가하면 컨텍스트 전환으로 인해 성능에 오히려 해로울 수 있습니다.

실험적인 병렬 컴파일은 kapt와 함께 작동하지 않음에 주의하십시오. kapt는 IR 백엔드를 비활성화합니다. 또한 병렬 컴파일에는 더 많은 JVM 힙이 필요합니다. 힙의 양은 스레드 수에 비례합니다.

이 YouTrack 이슈에서 여러분의 피드백을 감사히 받겠습니다.


Kotlin/JS IR 컴파일러의 개발용 바이너리에 대한 점진적 컴파일


Kotlin/JS 개발을 IR 컴파일러와 함께 더 효율적으로 하기 위해 새로운 점진적 컴파일 모드를 소개하고 있습니다.

이 모드에서는 compileDevelopmentExecutableKotlinJs Gradle 작업을 사용하여 개발용 바이너리를 빌드할 때 컴파일러가 모듈 수준에서 이전 컴파일의 결과를 캐시합니다. 이전 컴파일에서 변경되지 않은 소스 파일에 대해서는 캐시된 컴파일 결과를 사용하여 특히 소규모 변경 시에 더 빠르게 완료됩니다. 이 개선 사항은 주로 개발 프로세스(편집-빌드-디버그 주기 단축)을 대상으로 하며 프로덕션 아티팩트 빌드에는 영향을 주지 않습니다.

개발용 바이너리에 대한 점진적 컴파일을 활성화하려면 프로젝트의 gradle.properties에 다음 줄을 추가하십시오:

kotlin.incremental.js.ir=true // 기본값은 false입니다.


Kotlin/JS 프로젝트에서 점진적 컴파일 사용에 대한 여러분의 생각을 알려주세요. 이 YouTrack 이슈에서 결과와 의견을 공유해 주세요. 문제가 발생하는 경우 YouTrack에서 새로운 이슈를 제출해 주세요.

 

멀티플랫폼 프로젝트를 위한 계층 구조 지원

 

Kotlin 1.6.20은 계층 구조 지원을 기본적으로 활성화하여 제공합니다. Kotlin 1.4.0에서 처음 소개한 이후에 프런트엔드 및 IDE 가져오기 안정성을 크게 향상시켰습니다.

이제 여러 유사한 네이티브 타겟 간에 소스 코드를 공유할 수 있습니다. 이 기술은 올바른 기본 종속성을 제공하고 공유 코드에서 사용 가능한 정확한 API를 찾아줍니다. 이렇게 하면 복잡한 빌드 설정 및 네이티브 타겟 간 소스 세트 공유를 위한 작업을 없앨 수 있으며 다른 타겟을 위한 IDE 지원을 얻는 데 필요한 해결책을 제공합니다. 또한 다른 타겟을 위한 안전하지 않은 API 사용을 방지하는 데도 도움이 됩니다.

이 기술은 라이브러리 작성자에게도 유용합니다. 계층 구조 프로젝트 구조를 통해 일부 타겟을 대상으로하는 공통 API를 게시하고 사용할 수 있습니다.


프로젝트 내에서 더 나은 코드 공유


계층 구조 지원 없이는 Kotlin 타겟 중 일부에 대한 코드를 공유하기 위한 직접적인 방법이 없습니다. 인기 있는 예로는 모든 iOS 타겟 간에 코드를 공유하고 Foundation과 같은 iOS 특정 종속성에 액세스하는 경우입니다.

계층 구조 프로젝트 지원 덕분에 이제 이를 쉽게 구현할 수 있습니다. Kotlin 도구 체인은 올바른 기본 종속성(예: Kotlin/Native stdlib 또는 네이티브 라이브러리)을 제공합니다.

또한 이 기술은 공유 코드에서 사용 가능한 API 표면 영역을 정확하게 찾으려고 노력합니다. 이렇게 하면 macOS에 특정한 함수를 Windows를 위해 공유된 코드에서 사용하는 등의 문제를 방지할 수 있습니다.


라이브러리 생태계에 더 많은 기회


멀티플랫폼 라이브러리를 게시할 때 중간 소스 세트의 API도 이제 제대로 게시되어 소비자에게 사용 가능합니다. 또한 Kotlin 도구 체인은 안전하지 않은 사용(예: JVM API를 JS 코드에서 사용하는 경우)에 주의를 기울이면서 소비자 소스 세트에서 사용 가능한 API를 자동으로 파악합니다. 라이브러리에서 코드 공유에 대한 자세한 내용은 더 알아보세요.

계층 구조 프로젝트로 게시한 라이브러리는 기본적으로 계층 구조 프로젝트와만 호환됩니다. 프로젝트-라이브러리 호환성에 대한 자세한 내용을 확인하세요.


구성 및 설정


Kotlin 1.6.20-M1부터 모든 새로운 멀티플랫폼 프로젝트에는 계층 구조 프로젝트 구조가 포함됩니다. 추가 설정은 필요하지 않습니다.

  • 수동으로 활성화한 경우 gradle.properties에서 해당 옵션을 제거할 수 있습니다.
  • Kotlin 1.6.20을 사용하는 경우 최상의 경험을 얻으려면 Android Studio 2021.1.1 (Bumblebee) 이상을 사용하는 것이 좋습니다.


피드백 남기기


이것은 전체 생태계에 대한 중요한 변경 사항입니다. 더 나은 개선을 위해 여러분의 피드백을 감사히 받겠습니다. 지금 바로 시도하고 어려운 점이 있다면 YouTrack 이슈 트래커에 보고해 주세요.

 

Kotlin/Native 성능 개선


Kotlin/Native의 컴파일 프로세스를 가속화하고 개발 경험을 향상시키기 위해 열심히 노력하고 있습니다.

이 Kotlin 1.6.20 릴리스에서는 Kotlin이 생성하는 LLVM IR에 영향을 미치는 일부 성능 업데이트와 버그 수정이 포함되어 있습니다. 내부 프로젝트의 벤치마크에 따르면 다음과 같은 평균 성능 향상을 달성했습니다:

  • 실행 시간 감소: 15%
  • 릴리스 및 디버그 바이너리의 코드 크기 감소: 20%
  • 릴리스 바이너리의 컴파일 시간 감소: 26%

 

이러한 변경 사항은 큰 내부 프로젝트에서 디버그 바이너리에 대한 컴파일 시간도 10% 감소시킵니다.

이를 위해 몇 가지 컴파일러에서 생성한 합성 객체에 대한 정적 초기화를 구현하고, 각 함수의 LLVM IR 구조화 방법을 개선했으며, 컴파일러 캐시를 최적화했습니다.

이미 Kotlin 1.6에서 발표된 새로운 메모리 매니저로 전환한 경우, 평균적으로 35% 성능 향상을 확인할 수 있을 것입니다. 이 EAP 릴리스부터는 새로운 Kotlin/Native 메모리 매니저에 대한 sweep 단계에 대한 동시 구현도 제공됩니다. 이것도 성능을 향상시키고 가비지 컬렉터 일시 정지 시간을 줄일 것입니다. 이를 활성화하려면 새로운 Kotlin/Native 메모리 매니저용 -Xgc=cms 플래그를 사용하십시오.

새로운 메모리 매니저 성능에 대한 피드백은 YouTrack 이슈에서 공유해 주세요.

최신 Kotlin 기능에 대한 정보를 업데이트하려면 이 게시물 오른쪽의 양식을 사용하여 이메일 주소를 입력하고 Kotlin 업데이트를 구독하세요.

 

새로운 기능을 시도하고 피드백 제공하기


이러한 새로운 기능은 1.6.20 미리보기 릴리스인 Kotlin 1.6.20-M1에서 사용할 수 있습니다. 다음과 같은 방법 중 하나를 사용하여 IntelliJ IDEA 또는 Android Studio IDE에 쉽게 설치할 수 있습니다:

  • Early Access Preview 업데이트 채널을 사용하는 경우, IDE는 Kotlin 1.6.20-M1이 사용 가능해지는 즉시 자동으로 업데이트 제안을 할 것입니다.
  • Stable 업데이트 채널을 사용하는 경우, IDE에서 Tools | Kotlin | Configure Kotlin Plugin Updates를 선택하여 언제든지 Early Access Preview 채널로 변경할 수 있습니다. 그런 다음 최신 미리보기 릴리스를 설치할 수 있습니다. 자세한 내용은 해당 지침을 확인하세요. Kotlin 1.6.20-M1부터 Early Access Preview 채널만 사용할 수 있음을 참고하세요.


항상 이러한 IDE의 최신 버전을 다운로드하여 Kotlin에 대한 포괄적인 지원을 받을 수 있습니다:

  • 다양한 플랫폼용 Kotlin 애플리케이션을 개발하기 위한 IntelliJ IDEA.
  • Android 및 크로스 플랫폼 모바일 애플리케이션을 개발하기 위한 Android Studio.

 

1.6.20-M1을 설치한 후 빌드 스크립트에서 Kotlin 버전을 1.6.20-M1로 변경하십시오.


문제가 발생하는 경우:

 

  • 문제를 YouTrack 이슈 트래커에 보고하십시오.
  • Kotlin Slack의 #eap 채널에서 도움을 찾으실 수 있습니다(초대장 받기).
  • 최신 안정 버전으로 롤백하는 방법에 대한 내용을 배우려면 여기에서 확인하세요.

 

더 읽기

 

원문

 

https://blog.jetbrains.com/kotlin/2022/02/kotlin-1-6-20-m1-released/

반응형

댓글