본문 바로가기
Kotlin/Release Notes

[Kotlin Release Notes] Kotlin/Native v0.9 is here!

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

2018년 9월 5일

 

여름이 거의 끝나가지만 Kotlin/Native 팀은 Kotlin/Native v0.9 릴리스를 위해 열심히 노력해왔고, 이제 여기에 있습니다! 번호에 속지 마세요 - 이것은 컴파일러 툴체인, Gradle 플러그인 및 IDE 플러그인의 주요 (그리고 중요한) 릴리스입니다.

이 릴리스에서 가장 중요한 변경 사항은 다음과 같습니다:

  • Kotlin 1.3-M2로의 이전 (컴파일러 및 표준 라이브러리)
  • Kotlin 표준 라이브러리에서 부호 없는 유형 지원
  • C/Objective-C/Swift 상호 운용 레이어에서 부호 없는 유형 지원
  • 안정 버전의 kotlin.coroutines 지원
  • 재작성된 동시성 기본 요소
  • kotlin.native 패키지

 

Kotlin 1.3-M2 지원


Kotlin 1.3의 곧 출시될 버전을 지원하기 위해 Kotlin/Native v0.9는 이미 마일스톤 버전인 Kotlin 1.3-M2 컴파일러와 표준 라이브러리를 기반으로 합니다. 이것은 인라인 클래스, 부호 없는 유형 및 공통 난수 생성기 API와 같은 새 언어 버전의 모든 장점이 모든 네이티브 대상에서 사용 가능하다는 것을 의미합니다.

부호 없는 유형 지원
Kotlin 1.3 버전의 프로그래밍 언어로서 JVM, Native 및 JS와 같은 모든 백엔드에서 언어 및 표준 라이브러리의 부호 없는 유형을 지원하게 되었습니다. 예를 들어 다음과 같은 코드는

 

fun main(args: Array<String>) {
    println(maxOf(1u, UInt.MAX_VALUE))
}

 

모든 Kotlin 버전에서 올바르게 작동하며 4294967295를 출력합니다. 표준 라이브러리의 많은 인기있는 연산은 부호 없는 피연산자를 지원하기 위해 확장되어 있으며 기본 제공됩니다.


부호 없는 유형과 상호 운용성


우리는 언어 자체에서 부호 없는 유형을 지원하는 것뿐만 아니라 Kotlin 부호 없는 유형을 적절한 C 및 Objective-C/Swift 유형에 매핑하여 Kotlin 및 플랫폼 세계를 매칭하는 측면에서 상호 운용성 레이어가 더욱 향상되도록 지원합니다. 예를 들어 Kotlin의 ByteArray로 소켓에서 데이터를 읽는 다음 네트워킹 코드를 살펴보겠습니다:

 

buffer.usePinned { pinned ->
    while (true) {
        val length = recv(commFd, pinned.addressOf(0), buffer.size.convert(), 0).toInt()
        .ensureUnixCallResult("read") { it >= 0 }
        if (length == 0) break
        send(commFd, pinned.addressOf(0), length.convert(), 0)
            .ensureUnixCallResult("send") { it >= 0 }
    }
}

 

이제 부호 있는 값과 부호 없는 값 사이에서 잠재적으로 안전하지 않은 변환이 발생할 수 있는 위치(convert() 내재 함수로 표시됨)를 명시적으로 볼 수 있으며 POSIX API도 다음과 같이 Kotlin 시그니처로 올바르게 변환됩니다:

 

typealias ssize_t = Long
typealias size_t = ULong
...
fun recv(arg0: Int, arg1: CValuesRef<*>?, arg2: size_t, arg3: Int): ssize_t

 

안정적인 코루틴 지원


코루틴은 더 이상 실험적인 상태가 아니며 Kotlin 1.3에서 공식적으로 제품 수준으로 지원되므로 Kotlin/Native v0.9에서는 Kotlin/Native v0.9에서 새로운 코루틴 API를 지원합니다. kotlin.coroutines.experimental의 실험적인 코루틴은 더 이상 컴파일러나 런타임에서 지원되지 않습니다.


재작성된 동시성 기본 요소


Kotlin/Native v0.8은 싱글톤 객체를 동결하여 여러 개의 동시 실행자 간에 신뢰할 수 있는 공유 글로벌 상태를 생성하는 것을 소개했습니다. v0.9에서는 모든 동시성 기본 요소를 심각하게 재작성하고 새로운 kotlin.native.concurrent 패키지로 이동했습니다. 중요한 변경 사항은 다음과 같습니다:

  • AtomicInt, AtomicLong, AtomicNativePtr 및 AtomicReference 클래스 API가 심각하게 재작성되었습니다.
  • lazy 대리자가 동결된 객체와 제대로 작동하도록 개선되었습니다.
  • 새로운 DetachedObjectGraph 클래스가 분리된 객체 하위 그래프 개념을 캡슐화하는 역할을 합니다.

 

예를 들어 다음 코드는:

 

dispatch_async_f(asyncQueue, DetachedObjectGraph {
    Data(clock_gettime_nsec_np(CLOCK_REALTIME))
}.asCPointer(), staticCFunction {
    it ->
    initRuntimeIfNeeded()
    val data = DetachedObjectGraph<Data>(it).attach()
    println("in async: $data")
})

 

macOS에서 다른 비동기 큐로 가변 객체 Data의 소유권을 전달할 수 있습니다.

다른 중요한 동시성 지원 측면은 이전에 최상위 변수가 스레드 로컬이었고 이제 응용 프로그램의 주 스레드에서만 액세스할 수 있었으며 모든 다른 액세스 시도는 런타임 예외로 이어졌다는 점입니다. 이 동작을 제어하기 위해 새로운 주석인 @ThreadLocal 및 @SharedImmutable을 도입하여 이러한 주석이 지정된 최상위 변수는 스레드 로컬 또는 초기화 후 동결되거나, 각각 스레드 로컬 또는 초기화 후 동결되도록 설정할 수 있습니다.


kotlin.native 패키지


더 나은 구조화된 표준 라이브러리 및 멀티 플랫폼 코드 작성 지원을 보장하기 위해 모든 코드가 konan 패키지에서 kotlin.native로 이동되었으며, 인터페이스도 심각하게 재작성되고 멀티 플랫폼 Kotlin 패러다임과 더 잘 일치하도록 정리되었습니다. 일부 네이티브 특정 작업은 공통 stdlib에 해당하는 작업과 대응되는 것이 내부 또는 비공개로 만들어져 이식 가능한 표준 작업의 사용을 장려하도록 되었습니다.


바이너리를 얻는 방법


자세한 내용은 GitHub 릴리스 페이지를 확인하거나 macOS, Linux 또는 Windows용 바이너리를 다운로드하세요. Linux Snap 패키지도 사용 가능합니다.

 

원문

 

https://blog.jetbrains.com/kotlin/2018/09/kotlinnative-v0-9-is-here/

반응형

댓글