Kotlin/Native で Hello World するだけしてみる

Kotlin/Native で Hello World してみます。

Kotlin なので IDEA を使いましょう。

Plugin 最新化

Kotlin Plugin を最新化しておきます。

f:id:Naotsugu:20190405003226p:plain

Update ボタンで更新。プラグインのインストールが終わると再起動を求められる。

f:id:Naotsugu:20190405003253p:plain

Restart IntelliJ IDEA で再起動。


プロジェクトの作成

Create New ProjectKotlin/Native を選択。

f:id:Naotsugu:20190405003332p:plain

Next

f:id:Naotsugu:20190405003353p:plain

Java 11 だと Gradle のビルドでエラー(sun.misc.Unsafe が変更された影響がここにも)になるので、ここでは GradleJVM は 1.8 を選択。

f:id:Naotsugu:20190405003605p:plain

hello として Finish


プロジェクト構成

以下のような感じになる。

f:id:Naotsugu:20190405003651p:plain

Gradle タスクの runMainReleaseExecutableMacos を実行すると実行可能ファイルが作成される(初回はそれなりに時間がかかる)。

f:id:Naotsugu:20190405003708p:plain

ビルド成功すれば main.kexe ができてるのでそのまま実行できる。

$ ./build/bin/macos/mainReleaseExecutable/main.kexe 
Hello, Kotlin/Native!


サンプルソース

プラグインが生成するデフォルトのサンプルソースは以下のようになっている。

package sample

fun hello(): String = "Hello, Kotlin/Native!"

fun main() {
    println(hello())
}


テストコードは以下の感じ。

package sample

import kotlin.test.Test
import kotlin.test.assertTrue

class SampleTests {
    @Test
    fun testHello() {
        assertTrue("Kotlin/Native" in hello())
    }
}


build.gradle は以下。

plugins {
    id 'kotlin-multiplatform' version '1.3.21'
}
repositories {
    mavenCentral()
}
kotlin {
    // For ARM, should be changed to iosArm32 or iosArm64
    // For Linux, should be changed to e.g. linuxX64
    // For MacOS, should be changed to e.g. macosX64
    // For Windows, should be changed to e.g. mingwX64
    macosX64("macos") {
        compilations.main {
            // Comment to generate Kotlin/Native library (KLIB) instead of executable file:
            outputKinds("executable")
            // Change to specify fully qualified name of your application's entry point:
            entryPoint 'sample.main'
        }
    }
    sourceSets {
        // Note: To enable common source sets please comment out 'kotlin.import.noCommonSourceSets' property
        // in gradle.properties file and re-import your project in IDE.
        macosMain {
        }
        macosTest {
        }
    }
}

task runProgram {
    def buildType = 'RELEASE' // Change to 'DEBUG' to run application with debug symbols.
    dependsOn kotlin.targets.macos.compilations.main.linkTaskName('EXECUTABLE', buildType)
    doLast {
        def programFile = kotlin.targets.macos.compilations.main.getBinary('EXECUTABLE', buildType)
        exec {
            executable programFile
            args ''
        }
    }
}

まとめ

最近の流れ通り Kotlin コンパイラが LLVM のフロントエンドとなり、LLVM IR を生成し、LLVM によりターゲットプラットフォームの実行バイナリを吐く流れです。

プラグイン使えば超お手軽ですね。

ただ、既存の Java ライブラリの jar などをを含めたネイティブアプリケーションの作成は現時点ではサポートされないので、微妙なところではあります。