본문 바로가기
Kotlin/What's new

[Kotlin 번역] What's new in Kotlin 1.9.20-Beta

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

2023년 9월 11일

 

이 문서는 초기 액세스 미리보기 (EAP) 릴리스의 모든 기능을 다 다루지는 않지만, 최신 기능과 주요 개선 사항을 강조하고 있습니다.

GitHub 변경 로그에서 전체 변경 목록을 확인하세요.

Kotlin 1.9.20-Beta 릴리스가 출시되었습니다! 이 미리보기 버전의 주요 하이라이트는 다음과 같습니다:

  • 멀티플랫폼 프로젝트 설정을 위한 새로운 기본 계층 구조 템플릿
  • Kotlin Multiplatform에서 Gradle 구성 캐시의 완전한 지원
  • Kotlin/Native에서 기본으로 활성화된 사용자 지정 메모리 할당기
  • Kotlin/Native의 가비지 컬렉터 성능 개선
  • Kotlin/Wasm에서 새로운 및 이름이 변경된 대상들
  • Kotlin/Wasm을 위한 표준 라이브러리에서 WASI API 지원

 

IDE 지원


Kotlin 1.9.20-Beta를 지원하는 Kotlin 플러그인은 다음과 같은 IDE에서 사용할 수 있습니다:

 

Kotlin Multiplatform


멀티플랫폼 프로젝트 구성을 위한 템플릿


Kotlin 1.9.20-Beta부터 Kotlin Gradle 플러그인은 인기있는 멀티플랫폼 시나리오에 대한 공유 소스 세트를 자동으로 생성합니다. 프로젝트 설정이 그 중 하나인 경우, 소스 세트 계층 구조를 수동으로 설정할 필요가 없습니다. 필요한 프로젝트 대상을 명시적으로 지정하면 됩니다.

기본 계층 구조 템플릿은 Kotlin Gradle 플러그인의 새로운 기능으로 인해 설정이 더 쉬워졌습니다. 이것은 플러그인에 내장된 소스 세트 계층 구조의 미리 정의된 템플릿입니다. Kotlin이 자동으로 선언한 대상에 대한 중간 소스 세트를 포함합니다. 전체 템플릿을 확인하세요.


프로젝트를 쉽게 만들기


Android 및 iPhone 기기를 대상으로 하는 멀티플랫폼 프로젝트를 생각해보세요. 이 프로젝트가 다른 Kotlin 버전 간에 어떻게 설정되는지 비교해보세요.

 

 

기본 계층 구조 템플릿을 사용하면 프로젝트 설정에 필요한 보일러플레이트 코드 양이 상당히 줄어듭니다.

androidTarget, iosArm64 및 iosSimulatorArm64 대상을 코드에 선언하면 Kotlin Gradle 플러그인이 템플릿에서 적합한 공유 소스 세트를 찾아서 생성합니다. 결과 계층 구조는 다음과 같습니다:

 


녹색 소스 세트는 실제로 생성되어 프로젝트에 포함되고, 기본 템플릿의 회색 소스 세트는 무시됩니다.


개선된 도구 지원 즐기기


생성된 프로젝트 구조를 사용하기 쉽게 만들기 위해 IntelliJ IDEA는 이제 기본 계층 구조 템플릿으로 생성된 소스 세트에 대한 완성 기능을 제공합니다.

 


IDE는 또한 해당 대상을 선언하지 않았기 때문에 존재하지 않는 소스 세트에 액세스를 시도하면 경고 메시지를 표시합니다. 아래 예제에서는 JVM 대상이 없습니다(오직 androidTarget만 있습니다). 하지만 jvmMain 소스 세트를 사용해 보겠습니다:

kotlin {
    androidTarget()
    iosArm64()
    iosSimulatorArm64()

    sourceSets {
        jvmMain {
        }
    }
}


이 경우 Kotlin은 빌드 로그에 경고를 보고합니다:

w: Accessed 'source set jvmMain' without registering the jvm target:
  kotlin {
      jvm() /* <- 'jvm' 대상을 등록하세요 */

      sourceSets.jvmMain.dependencies {

      }
  }


대상 계층 구조 설정


Kotlin 1.9.20-Beta부터 기본 계층 구조 템플릿이 자동으로 활성화됩니다. 대부분의 경우, 추가적인 설정이 필요하지 않습니다.

그러나 1.9.20 이전에 생성된 기존 프로젝트를 마이그레이션하는 경우, 이전에 dependsOn() 호출로 수동으로 중간 소스 세트를 도입한 경우 경고가 발생할 수 있습니다. 이 문제를 해결하려면 다음을 수행하십시오:

  • 중간 소스 세트가 현재 기본 계층 구조 템플릿에 포함되어 있는 경우, 모든 수동 dependsOn() 호출과 by creating 구문으로 생성된 소스 세트를 제거합니다.
  • 모든 기본 소스 세트 목록을 확인하려면 전체 계층 템플릿을 확인하세요.
kotlin {
    jvm()
    js { browser() }
    iosArm64()
    iosSimulatorArm64()

    // 기본 계층을 명시적으로 적용합니다. 예를 들어 iosMain 소스 세트를 생성합니다:
    applyDefaultHierarchyTemplate()

    sourceSets {
        // 추가 jsAndJvmMain 소스 세트 생성
        val jsAndJvmMain by creating {
            dependsOn(commonMain.get())
    }

        jsMain.get().dependsOn(jsAndJvmMain)
        jvmMain.get().dependsOn(jsAndJvmMain)
    }
}

 

  • 본 계층 구조 템플릿에서 제공하지 않는 추가 소스 세트를 사용하려면 예를 들어 JS와 JVM 사이에 소스 세트를 원한다면 applyDefaultHierarchyTemplate()을 사용하여 계층 구조를 명시적으로 다시 적용하고 dependsOn()을 사용하여 일반적으로 추가 소스 세트를 구성하세요:

    프로젝트에 이미 템플릿이 생성하는 소스 세트와 동일한 이름을 가진 소스 세트가 있는 경우, 그러나 서로 다른 대상 집합에서 공유되는 경우, 템플릿 소스 세트 간의 기본 dependsOn 관계를 수정하는 방법은 현재 없습니다.

    이 경우 다른 목적을 위한 서로 다른 소스 세트를 기본 계층 구조 템플릿이나 수동으로 생성된 것 중에서 찾는 것이 하나의 옵션입니다. 다른 하나는 템플릿에서 완전히 제외되는 것입니다.

    템플릿에서 완전히 제외하려면 gradle.properties에 kotlin.mpp.applyDefaultHierarchyTemplate=false를 추가하고 모든 다른 소스 세트를 수동으로 구성하세요.

    우리는 현재 이러한 경우를 단순화하기 위해 자체 계층 템플릿을 만드는 API에 대해 작업 중입니다.

 

전체 계층 템플릿 보기


프로젝트가 컴파일되는 대상을 선언할 때 플러그인은 해당 템플릿에서 공유 소스 세트를 선택하고 프로젝트에 생성합니다.

 


이 예제는 프로젝트의 프로덕션 부분만 보여주며 Main 접미사를 생략합니다 (예: commonMain 대신 common 사용). 그러나 *Test 소스에 대해서도 동일합니다.


Kotlin Multiplatform에서 Gradle 구성 캐시의 완전한 지원


이전에 Kotlin 멀티플랫폼 라이브러리에서 사용 가능한 Gradle 구성 캐시의 미리보기를 소개했습니다. 1.9.20-Beta에서 Kotlin Multiplatform 플러그인은 한 걸음 더 나아갑니다.

이제 Kotlin CocoaPods Gradle 플러그인과 Xcode 빌드에 필요한 통합 작업에서 Gradle 구성 캐시를 지원합니다. 

 

이제 모든 멀티플랫폼 프로젝트는 개선된 빌드 시간을 활용할 수 있습니다. Gradle 구성 캐시는 구성 단계의 결과를 재사용하여 후속 빌드를 위한 빌드 프로세스를 가속화합니다. 자세한 내용 및 설정 지침은 Gradle 문서를 참조하세요.

 

Kotlin/Native


기본으로 활성화된 사용자 지정 메모리 할당기


Kotlin 1.9.20-Beta에는 새로운 메모리 할당기가 기본으로 활성화되어 있습니다. 이것은 이전의 기본 할당기인 mimaloc를 대체하여 가비지 컬렉션을 더 효율적으로 만들고 Kotlin/Native 메모리 관리자의 런타임 성능을 향상시키기 위해 설계되었습니다.

새로운 사용자 지정 할당기는 시스템 메모리를 페이지로 나누어 연속적인 순서로 독립적인 스위핑을 허용합니다. 각 할당은 페이지 내의 메모리 블록이 되며 페이지는 블록 크기를 추적합니다. 서로 다른 페이지 유형은 다양한 할당 크기에 최적화되어 있습니다. 메모리 블록의 연속 배치는 모든 할당된 블록을 효율적으로 반복할 수 있도록 보장합니다.

스레드가 메모리를 할당하면 할당 크기를 기반으로 적합한 페이지를 찾습니다. 스레드는 다른 크기 범주에 대한 페이지 세트를 유지합니다. 일반적으로 주어진 크기에 대한 현재 페이지가 할당을 수용할 수 있습니다. 그렇지 않으면 스레드는 공유 할당 공간에서 다른 페이지를 요청합니다. 이 페이지는 이미 사용 가능할 수 있고, 스위핑이 필요할 수도 있으며, 먼저 생성해야 할 수도 있습니다.

새로운 할당기는 동시에 여러 독립적인 할당 공간을 허용하므로 Kotlin 팀은 성능을 더 개선하기 위해 다양한 페이지 레이아웃을 실험할 수 있게 됩니다.


사용자 지정 메모리 할당기를 활성화하는 방법


Kotlin 1.9.20-Beta부터는 새 메모리 할당기가 기본값으로 사용됩니다. 추가 설정은 필요하지 않습니다.

메모리 소비가 높게 나타나는 경우 Gradle 빌드 스크립트에서 -Xallocator=mimalloc 또는 -Xallocator=std를 사용하여 mimaloc 또는 시스템 할당기로 돌아갈 수 있습니다. 새 메모리 할당기를 개선하도록 도와주려면 이러한 문제를 YouTrack에 신고해 주세요.

새 할당기의 기술적인 세부 정보는 이 README를 참조하세요.


가비지 컬렉터의 성능 개선


Kotlin 팀은 Kotlin/Native 메모리 관리자의 성능과 안정성을 계속해서 개선하고 있습니다. 이 릴리스는 가비지 컬렉터 (GC)에 다음과 같은 1.9.20-Beta의 중요한 변경 사항을 포함하여 몇 가지 중요한 변경 사항을 가져왔습니다.


GC의 일시 중지 시간을 줄이기 위한 완전한 병렬 마크


이전에 기본 가비지 컬렉터는 부분 병렬 마크만 수행했습니다. 뮤테이터 스레드가 일시 중지될 때, 스레드 로컬 변수 및 호출 스택과 같은 자체 루트에서 GC의 시작을 표시했습니다. 한편, 별도의 GC 스레드가 전역 루트 및 네이티브 코드를 활발하게 실행하고 따라서 일시 중지되지 않는 모든 뮤테이터의 루트를 표시하기 위한 역할을 했습니다.

이 접근 방식은 전역 객체 수가 제한적이고 뮤테이터 스레드가 Kotlin 코드를 실행하는 런타임 상태에서 상당한 시간을 소비하는 경우에는 잘 작동했습니다. 그러나 이는 일반적인 iOS 애플리케이션에는 해당되지 않습니다.

이제 GC는 일시 중지된 뮤테이터, GC 스레드 및 선택적인 마커 스레드를 결합하여 마크 큐를 처리하는 완전한 병렬 마크를 사용합니다. 기본적으로 마킹 프로세스는 다음과 같이 수행됩니다.

  • 일시 중지된 뮤테이터. 자체 루트를 처리하고 코드를 실행하지 않는 동안 비활성 상태가 아니라 전체 마킹 프로세스에 기여합니다.
  • GC 스레드. 이렇게 하면 적어도 하나의 스레드가 마킹을 수행합니다.


이 새로운 접근 방식은 마킹 프로세스를 효율적으로 만들어 GC의 일시 중지 시간을 줄입니다.

할당 성능을 향상시키기 위해 큰 청크로 메모리 추적


이전에 GC 스케줄러는 개별 객체의 할당을 추적했습니다. 그러나 기본 사용자 지정 할당기나 mimalloc 메모리 할당기는 개별 객체에 별도의 저장소를 할당하지 않습니다. 대신, 여러 객체에 대한 대규모 영역을 할당합니다.

Kotlin 1.9.20-Beta에서는 개별 객체 대신 영역을 추적합니다. 이렇게 하면 각 할당에 대해 수행되는 작업 수를 줄여 작은 객체의 할당을 가속화하고, 따라서 가비지 컬렉터의 메모리 사용을 최소화하는 데 도움이 됩니다.

 

Kotlin/Wasm


Kotlin Wasm은 실험적입니다. 언제든지 변경될 수 있습니다. 평가 목적으로만 사용하십시오.

YouTrack에서의 피드백을 환영합니다.

새로운 wasm-wasi 대상 및 wasm 대상을 wasm-js로 이름 변경


이 릴리스에서 Kotlin/Wasm을 위한 새로운 대상인 wasm-wasi를 소개하고 wasm 대상을 wasm-js로 이름을 변경하고 있습니다. Gradle DSL에서 이러한 대상은 각각 wasmWasi 및 wasmJs로 사용할 수 있습니다.

프로젝트에서 이러한 대상을 사용하려면 build.gradle.kts 파일을 업데이트하십시오:

kotlin {
   wasmWasi {
      // ...
   }
   wasmJs {
      // ...
   }
}


이전에 소개된 wasm 블록은 wasmJs를 선호하는 방향으로 폐기되었습니다.

기존 Kotlin/Wasm 프로젝트를 마이그레이션하려면 다음을 수행하십시오:

  • build.gradle.kts 파일에서 wasm 블록의 이름을 wasmJs로 변경하십시오.
  • 프로젝트 구조에서 wasmMain 폴더의 이름을 wasmJsMain으로 변경하십시오.


표준 라이브러리에서 WASI API 지원


이 릴리스에서는 Wasm 플랫폼을 위한 시스템 인터페이스인 WASI의 지원이 포함되었습니다. WASI 지원을 통해 시스템 리소스에 대한 표준화된 API 집합을 제공하여 브라우저 외부에서 Kotlin/Wasm을 사용하는 것이 더 쉬워집니다. 또한 WASI는 외부 리소스에 액세스할 때 보안의 추가 계층을 제공하는 능력 기반 보안을 제공합니다.

Kotlin/Wasm 애플리케이션을 실행하려면 Wasm Garbage Collection (GC)을 지원하는 VM이 필요합니다. 예를 들어 Node.js 또는 Deno와 같은 VM이 그러한 VM입니다. Wasmtime, WasmEdge 등은 여전히 완전한 Wasm GC 지원을 향해 노력 중입니다.

WASI 함수를 가져오려면 @WasmImport 주석을 사용하십시오:

import kotlin.wasm.WasmImport

@WasmImport("wasi_snapshot_preview1", "clock_time_get")
private external fun wasiRawClockTimeGet(clockId: Int, precision: Long, resultPtr: Int): Int


GitHub 저장소에서 전체 예제를 찾을 수 있습니다.

wasmWasi를 대상으로 하면 JavaScript와의 상호 운용성을 사용할 수 없습니다.


Kotlin 1.9.20-Beta로 업데이트하는 방법


다음 방법 중 하나로 Kotlin 1.9.20-Beta를 설치하십시오:

  • Early Access Preview 업데이트 채널을 사용하는 경우, IDE에서 1.9.20-Beta로 자동 업데이트를 제안합니다.
  • 안정적인 업데이트 채널을 사용하는 경우, IDE에서 Tools | Kotlin | Configure Kotlin Plugin Updates를 선택하여 언제든지 Early Access Preview 채널로 변경할 수 있습니다. 그런 다음 최신 미리 보기 릴리스를 설치할 수 있습니다. 자세한 내용은 이 설명서를 참조하십시오.


1.9.20-Beta를 설치한 후 빌드 스크립트에서 Kotlin 버전을 1.9.20-Beta로 변경하는 것을 잊지 마십시오.

 

원문

 

https://kotlinlang.org/docs/whatsnew-eap.html

반응형

댓글