Kotlin/Native

0aac627116c6e2a87b9ae179500801df?s=47 stormcat24
October 19, 2017

 Kotlin/Native

2017/10/19 CA.kt #3

0aac627116c6e2a87b9ae179500801df?s=128

stormcat24

October 19, 2017
Tweet

Transcript

  1. Kotlin/Native CA.kt #3 @stormcat24

  2. stormcat24 ‣ CyberAgent, Inc. ‣ FRESH! https://freshlive.tv ‣ https://blog.stormcat.io ‣

    Docker Comedian
  3. Ice Break?

  4. Written by @ngsw_taro Congratulations!

  5. I reviewed 2nd, 3rd parts. ‣SparkFramework with Kotlin ‣Spring Boot

    with Kotlin
  6. Kotlin/Native

  7. What?

  8. None
  9. “Kotlin/Native that compiles Kotlin directly to machine.”

  10. “without any virtual machine.” (standalone executables)

  11. Kotlin/Native is ‣Compiles directly to native code via LLVM ‣Call

    native libraries ‣Cross Platform ‣Windows/Linux/macOS/iOS/Android/Raspberry Pi ‣Version 0.3
  12. Setup $ git clone git@github.com:JetBrains/kotlin-native.git $ cd kotlin-native (kotlin-native)$ git

    checkout v0.3.4 Get Kotlin/Native Build (kotlin-native)$ ./gradlew dependencies:update (kotlin-native)$ ./gradlew dist (kotlin-native)$ ./gradlew cross_dist Path $ export PATH=$PATH:path-to-path/kotlin-native/dist/bin
  13. Try Quickly fun main(args: Array<String>) { // Not System.out.println() println(“Hello!

    Kotlin/Native“) } hello.kt compile $ kotlinc hello.kt -o hello KtFile: hello.kt Execute $ ./hello.kexe Hello! Kotlin/Native
  14. build.gradle buildscript { repositories { mavenCentral() maven { url "https://dl.bintray.com/jetbrains/kotlin-native-dependencies"

    } } dependencies { classpath "org.jetbrains.kotlin:kotlin-native-gradle-plugin:0.3.3" } } apply plugin: 'konan' konanArtifacts { KonanExample { } }
  15. Native Library

  16. Today’s Example HTTP GET Request By using libcurl

  17. Create *.def file ‣Library definition file ‣Link Kotlin/Native to Native

    libraries ‣Generate interoperability stubs ‣Define in build.gradle
  18. Define *.def file headers = curl/curl.h compilerOpts=-I/usr/local/include linkerOpts.osx = -L/opt/local/lib

    -L/usr/local/opt/curl/lib -lcurl src/main/c_interop/libcurl.def build.gradle apply plugin: 'konan' konanInterop { Libcurl { includeDirs '/usr/local/opt/curl/include', '.' } } konanArtifacts { KonanExample { useInterop 'libcurl' } }
  19. Implementation curl.kt import kotlinx.cinterop.* import libcurl.* fun main(args: Array<String>): Unit

    { if (args.size == 0) { return } val url = args.first() val curl = curl_easy_init() curl_easy_setopt(curl, CURLOPT_URL, url) val res = curl_easy_perform(curl) when (res) { CURLE_OK -> println("HTTP Request OK") else -> println("HTTP Request NG") } }
  20. Call Library In C #include <curl/curl.h> CURLcode curl_easy_perform(CURL * easy_handle);

    fun curl_easy_perform(curl: COpaquePointer?): CURLcode { return kniBridge40(curl.rawValue) } typealias CURLcode = kotlin.Int val CURLE_OK: CURLcode = 0 val CURLE_UNSUPPORTED_PROTOCOL: CURLcode = 1 val CURLE_FAILED_INIT: CURLcode = 2 … Stub in Kotlin/Native
  21. Execute Build Execute $ ./gradlew build $ ls build/konan/bin Curl.kexe

    Curl.kt.bc $ build/konan/bin/Curl.kexe https://blog.stormcat.io <!DOCTYPE html> <html lang="ja-jp"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> (...) HTTP Request OK
  22. Interoperability

  23. Interop types ‣Int => kotlin.Int ‣T* => CPointer<T> ‣void* =>

    COpaquePointer? ‣
  24. Memory Management ‣Automated memory management by Cycle Collector ‣https://github.com/JetBrains/kotlin-native/blob/master/ runtime/src/main/cpp/Memory.cpp

    ‣When using Native Library…?
  25. Memory allocation Allocate memory val buffer = nativeHeap.allocArray<ByteVar>(size) ... nativeHeap.free(buffer)

    memScoped val fileSize = memScoped { val statBuf = alloc<statStruct>() val error = stat("/", statBuf.ptr) statBuf.st_size }
  26. Use IDEA

  27. <- Uncheck Java

  28. Code Completion

  29. Impressions

  30. Impressions ‣Very experimental and challenging ‣Interoperability is difficult ‣Lack of

    Ecosystem, fundamental libraries ‣Not enough code completion ‣If gRPC support Kotlin/Native?
  31. Thanks✋