본문 바로가기
Kotlin/Release Notes

[Kotlin Release Notes] Kotlin/Native v0.4 released: Objective-C interop, WebAssembly and more

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

2017년 11월 16일

 

Kotlin/Native v0.4 버전 출시를 기쁜 마음으로 알려드립니다! 이 릴리스에는 iOS 및 macOS에서 Objective-C API에 액세스할 수 있는 지원, WebAssembly 대상 플랫폼, Kotlin/Native에서 앱 개발을 더욱 쉽게 만드는 주요 변경 사항이 포함되어 있습니다.


플랫폼 라이브러리


Kotlin/Native은 특정 플랫폼을 대상으로 하는 모든 프로그램에서 기반이 되는 운영 체제 인터페이스에 액세스할 수 있도록 플랫폼별 라이브러리 세트를 제공합니다. 이전에는 cinterop 도구를 사용하여 라이브러리를 직접 생성해야 했지만, 이제는 라이브러리가 미리 제공됩니다.

다음 프로그램은 v0.4 릴리스의 새로운 플랫폼 라이브러리 사용 예시를 보여줍니다.

 

import platform.posix.*
import kotlinx.cinterop.*

fun readFileData(path: String) = memScoped {
    val info = alloc<stat>()
    if (stat(path, info.ptr) != 0) return@memScoped null
    val size = info.st_size.toInt()
    val result = ByteArray(size)
    val file = fopen(path, "rb") ?: return@memScoped null
    var position = 0
    while (position < size) {
        val toRead = minOf(size - position, 4096)
        val read = fread(result.refTo(position), 1, toRead.signExtend(), file).toInt()
        if (read <= 0) break
        position += read
    }
    fclose(file)
    result
}

fun main(args: Array<String>) {
  for (file in args) {
      val data = readFileData(file)
      if (data != null) {
          write(STDOUT_FILENO, data.refTo(0), data.size.signExtend())
      }
  }
}

 

이 코드는 파일의 내용을 Kotlin ByteArray로 읽은 다음 표준 출력에 출력합니다. 이제 명시적인 인터옵 스텁 생성이 필요하지 않고 운영 체제 인터페이스의 전체 기능을 사용할 수 있습니다.


iOS 및 macOS 프레임워크 상호 운용성


Apple 플랫폼에서는 대부분의 다른 플랫폼과 달리 시스템 프레임워크에 액세스하려면 Objective-C API 형식으로 제공됩니다. 이를 지원하기 위해 Kotlin/Native 팀은 Objective-C 상호 운용성 레이어를 구현했습니다. 예를 들어, 다음 Kotlin/Native 코드는 iOS에서 애플리케이션 리소스를 읽을 것입니다.

 

fun readResource(resourceName: String): ByteArray {
    val filePath = NSBundle.mainBundle.pathForResource(resourceName, ofType = null)
    
    val fileData = NSData.dataWithContentsOfFile(filePath!!)
            ?: throw Error("failed reading resource $resourceName")
    
    return fileData.bytes!!.readBytes(fileData.length.toInt())
}

 

다음 완전한 프로그램은 macOS에서 최상위 창을 렌더링합니다. 창 제목이 키릴 문자로 되어 있는 것은 상호 운용성 레이어에서 올바른 문자 집합 변환을 수행하는 것을 보여주기 위함입니다.

 

import kotlinx.cinterop.*
import platform.AppKit.*
import platform.Foundation.*
import platform.objc.*
import platform.osx.*

private fun runApp() {
    val app = NSApplication.sharedApplication()
    app.delegate = MyAppDelegate()
    app.setActivationPolicy(NSApplicationActivationPolicy.NSApplicationActivationPolicyRegular)
    app.activateIgnoringOtherApps(true)
    app.run()
}

private class MyAppDelegate() : NSObject(), NSApplicationDelegateProtocol {
    private val window: NSWindow
    init {
        val mainDisplayRect = NSScreen.mainScreen()!!.frame
        val windowRect = mainDisplayRect.useContents {
            NSMakeRect(
                    origin.x + size.width * 0.25, origin.y + size.height * 0.25,
                    size.width * 0.5, size.height * 0.5
            )
        }
        val windowStyle = NSWindowStyleMaskTitled or NSWindowStyleMaskMiniaturizable or
                NSWindowStyleMaskClosable or NSWindowStyleMaskResizable
        window = NSWindow(windowRect, windowStyle, NSBackingStoreBuffered, false).apply {
            title = "Окошко Konan"
            preferredBackingLocation = NSWindowBackingLocationVideoMemory
            backgroundColor = NSColor.whiteColor()
            releasedWhenClosed = false
            
            delegate = object : NSObject(), NSWindowDelegateProtocol {
                override fun windowShouldClose(sender: ObjCObject): Boolean {
                    NSApplication.sharedApplication().stop(this)
                    return true
                }
            }
        }
    }
    override fun applicationWillFinishLaunching(notification: NSNotification) {
        window.makeKeyAndOrderFront(this)
    }
}

fun main(args: Array<String>) {
    autoreleasepool {
        runApp()
    }
}

 

이 글은 Kotlin/Native을 사용한 풀스택 애플리케이션의 iOS 클라이언트 예제에 대한 내용입니다. 이 애플리케이션은 iOS용으로 완전한 애플리케이션 예제를 보여줍니다. Apple 또는 Android 기기를 소유하고 계시다면, App Store나 Google Play에서 이 애플리케이션을 직접 확인해볼 수 있습니다.


Object pinning


Kotlin 객체를 C API와 간편하게 사용하기 위해 ByteArray, IntArray, FloatArray 등의 타입 배열을 위한 새로운 API인 refTo(), pin(), unpin()이 제공됩니다. 이 API들을 사용하면 객체가 메모리에 고정되고 데이터가 안정적인 주소를 가지게 됩니다. 따라서 Kotlin 객체 데이터를 C API에서 직접 사용하거나 그 반대로 사용할 수 있습니다. 예를 들어 위의 readFileData() 함수에서는 ByteBuffer의 데이터를 포인터로 전달하여 fread() 호출을 수행합니다.


개선된 디버깅


릴리스 v0.4에서는 개선된 인스펙션을 통해 대부분의 변수를 런타임에서 검사할 수 있습니다. 예를 들어 파일을 첫 번째 섹션에서 읽는 프로그램을 가져와 디버깅 지원(-g 스위치)을 사용하여 컴파일하면 심볼릭 디버깅과 변수 검사를 수행할 수 있습니다.

 

WebAssembly


Kotlin/Native v0.4는 WebAssembly 지원을 실험적으로 제공합니다. WebAssembly 대상은 주로 기술을 쇼케이스하는 데 사용되며, 브라우저 지원 제한 (주로 더 무난한 DOM/HTML5 API 액세스 및 WASM 실행 가상 머신의 성능과 관련된 제한)으로 인해 아직 완전히 프로덕션 레디가 아닙니다. 그러나 사용자로부터 WASM 지원에 대한 피드백을 매우 기대하며, 관심이 얼마나 있는지 알고 싶습니다.


IDE 지원


마지막으로, Kotlin/Native을 지원하는 실험적인 CLion 플러그인이 최근에 발표되었습니다. 자세한 내용은 해당 게시물을 확인하십시오.


비트 가져오기


바이너리는 다음 위치에서 다운로드할 수 있습니다:

x86-64 Linux 호스트
x86-64 MacOS 호스트
x86-64 Windows 호스트


피드백


버그와 이슈는 Kotlin 버그 트래커에서 보고해주시기 바랍니다. 질문은 Slack의 #kotlin-native 채널에서 환영합니다.

 

원문

 

https://blog.jetbrains.com/kotlin/2017/11/kotlinnative-v0-4-released-objective-c-interop-webassembly-and-more/

반응형

댓글