Kotlin/Native — ネイティブコードコンパイラの概要と特徴

著者: IT Sectr 公開日: 2026-06-05 読了時間: 8 分

Kotlin/Nativeは、Kotlinコードを仮想マシンなしで直接ネイティブマシンコードに変換するコンパイラです。JVM版とは異なり、Kotlin/NativeはLLVMバックエンドを使用して、iOS、Android NDK、macOS、Windows、Linux、WebAssembly向けの実行可能ファイルを生成します。この技術はKotlin Multiplatformの基盤であり、JVMが利用できないプラットフォームでの共有コード実行を可能にします。JetBrains、2025年によると、Kotlin/Nativeは13のターゲットプラットフォームをサポートし、KMMプロジェクトで最大90%のコードを再利用できます。

重要なポイント

  • Kotlin/Nativeは、JVMを使用せずにKotlinコードをネイティブマシンコードに変換するコンパイラです。
  • LLVMは、各ターゲットプラットフォーム向けにマシンコードを生成するコンパイラバックエンドです。
  • KMM — Kotlin Multiplatform Mobileは、iOSデバイスで共有コードを実行するためにKotlin/Nativeを使用します。
  • Memory Managerは、スレッドを停止せずに参照カウントに基づいて動作する自動ガベージコレクタです。
  • Interopは、ネイティブのObjective-C、Swift、Cライブラリとの双方向インタラクションのメカニズムです。

Kotlin/Nativeとは?

Kotlin/Nativeは、JetBrainsによって開発された、Kotlinコードをネイティブマシンコードにコンパイルする技術です。Kotlin/JVMとの主な違いは、仮想マシンが不要であることです。結果として得られる実行可能ファイルには、マシンコードと最小限のランタイムのみが含まれます。これにより、iPhone、Apple Watch、組み込みシステムなど、JVMがサポートされていないデバイスやシステムでKotlinアプリケーションを実行できます。

Kotlin/Nativeの歴史は、実験的なコンパイラプロジェクトとして始まり、2017年にKotlinのメインブランチに統合されました。2019年のKotlinConfで、ターゲットプラットフォームとしてのiOSサポートが発表され、モバイル開発の転換点となりました。Kotlin 1.9.20以降、Kotlin/Nativeコンパイラは安定性を達成し、デフォルトでKotlin Multiplatformに含まれています。

Kotlin/Nativeの重要な特徴は、共通の中間表現IRを使用することです。これは各プラットフォームごとに個別にマシンコードにコンパイルされます。これにより、すべてのKotlinバックエンド(JVM、JS、Native)に対して統一されたコンパイルフロントエンドが提供されます。

Kotlin/Nativeコンパイラの仕組み

Kotlin/Nativeのコンパイルは、複数の変換段階を経ます。Kotlinソースコードは最初に内部表現に変換され、次に最適化され、マシンコード生成のためにLLVMバックエンドに渡されます。最終段階は、ランタイムライブラリとのリンクと実行可能ファイルまたは動的ライブラリの作成です。

アーキテクチャには、フロントエンド(解析と型チェック)、IRジェネレータ(中間表現の構築)、LLVMバックエンド(マシンコード生成)の3つの主要コンポーネントが含まれます。このスキームは、C++およびRust用のClangコンパイラで使用されるアプローチと類似しています。

kotlin
// コマンドラインによるKotlin/Nativeコンパイル
kotlinc-native hello.kt -o hello -opt

// Kotlin MultiplatformによるiOS arm64向けビルド
./gradlew :shared:linkDebugFrameworkIosArm64

メモリ管理のために、Kotlin/Nativeはサイクル検出器付きの参照カウントに基づく独自のMemory Managerを使用します。Kotlin 1.7.20以降、新しいメモリマネージャーはデフォルトで動作し、@ThreadLocalや@SharedImmutableアノテーションを必要としません。ガベージコレクタはスレッドを停止せずに動作します。これは、メインスレッドの長時間ブロッキング時にシステムがアプリケーションを強制終了する可能性があるiOSにとって重要です。

Kotlin/Nativeコンパイルの段階

コンパイルプロセスは5つの段階に分かれています。解析(ソースコード分析)、意味解析(型チェックと名前解決)、IR生成(中間表現の構築)、最適化(簡略化とデッドコード削除)、LLVMによるコード生成です。各段階は異なるモジュールに対して並行して実行でき、大規模プロジェクトのビルドを高速化します。

段階所要時間結果
解析約10%ソースコードのASTツリー
意味解析約20%型付けされたAST
IR生成約15%Kotlin IR(中間表現)
最適化約25%最適化されたIR
LLVMコード生成約30%マシンコード+実行可能ファイル

サポートされているKotlin/Nativeプラットフォーム

Kotlin/Nativeは13のターゲットプラットフォームをサポートしており、カテゴリに分類されています。モバイル開発には、iOS(arm64)Android(arm32、arm64、x86_64)watchOSが利用可能です。デスクトッププラットフォームには、macOS(x64、arm64)、Windows(mingw x64)、Linux(x64、arm64、arm32)が含まれます。サーバーおよび組み込み開発には、WebAssemblyとOSなしのLLVM上のKotlin/Native(スタンドアロン)が利用可能です。各プラットフォームには、出力として個別のフレームワークまたはライブラリが必要です。

モバイル開発向けプラットフォーム

iOSの場合、Kotlin/NativeはXcodeプロジェクトに接続できるユニバーサルフレームワーク(.framework)を生成します。Android NDKの場合、JNIを介して呼び出せるネイティブ.soライブラリが作成されます。watchOSはKotlin 1.6.0から、tvOSはバージョン1.7.0からサポートされています。各アーキテクチャには個別のビルドが必要ですが、Kotlin MultiplatformはGradleプラグインを通じてこのプロセスを自動化します。

デスクトップおよびサーバープラットフォーム

macOSLinuxは、Compose Multiplatformフレームワークを使用したKotlinでのネイティブデスクトップアプリケーション開発に使用されます。Windows(MinGW)はKotlin 1.3.70からサポートされており、JVMをインストールせずにWindowsアプリケーションを作成できます。サーバー開発では、Kotlin/NativeはJVMが利用できない環境(scratchやAlpineをベースにした最小イメージのDockerコンテナなど)で使用できます。

カテゴリプラットフォームアーキテクチャ
モバイルiOSarm64、シミュレータ(x64、arm64)
モバイルAndroid NDKarm32、arm64、x86、x86_64
ウェアラブルwatchOSarm64、シミュレータ(x64)
デスクトップmacOSx64、arm64
デスクトップWindowsmingw x64
デスクトップLinuxx64、arm64、arm32

iOS開発のためのKotlin/Native

iOSは、KMMのコンテキストにおけるKotlin/Nativeの主要なターゲットプラットフォームです。コンパイラは、すべての共有コードを含むiOSフレームワークを作成し、それがXcodeプロジェクトに接続されます。フレームワークは静的リンクと動的リンクの両方をサポートしています。Kotlin/NativeはKotlinクラスと関数のObjective-Cラッパーを生成し、SwiftおよびObjective-Cコードとの直接統合を提供します。

iOSとの統合には、生成されたフレームワークを接続するためにXcodeを設定する必要があります。Kotlin Multiplatformは、Xcode Build Phasesから呼び出されるembedAndSignAppleFrameworkForXcodeタスクを使用してこのプロセスを自動化します。デバッグのために、Kotlin/NativeはiOSシミュレータでアプリケーションを実行する際に、共有モジュールコードのブレークポイントをサポートしています。

kotlin
// iOSフレームワークにコンパイルされたKotlinコード
package com.itsectr.shared

class GreetingProvider {
    fun createGreeting(): String {
        return "Hello from Kotlin/Native!"
    }

    fun formatVersion(major: Int, minor: Int): String {
        return "v$major.$minor"
    }
}

Objective-CおよびSwift Interop

iOSコードとのInteropは双方向に機能します。Kotlin/NativeはKotlinクラスのObjective-Cヘッダーを生成し、自動的にSwiftからアクセス可能になります。逆方向の通信は、指定されたObjective-C名でKotlin関数をエクスポートするための@ObjCNameアノテーションを使用して提供されます。Kotlinコレクションは自動的にNSArrayとNSDictionaryに変換され、KotlinコルーチンはSKIEライブラリを介してCombineパブリッシャーにラップされます。KotlinからiOSフレームワークを操作するには、Objective-CヘッダーへのKotlinバインディングを生成するツールであるcinteropが使用されます。

コード例:セットアップとコンパイル

Kotlin/Nativeを始めるには、Kotlin Multiplatformプラグインとターゲットプラットフォームを指定してbuild.gradle.ktsを設定する必要があります。iOSとAndroidをサポートするKMMプロジェクトの最小構成を見てみましょう。

kotlin
plugins {
    kotlin("multiplatform") version "2.0.21"
}

kotlin {
    iosArm64()
    iosSimulatorArm64()

    sourceSets {
        commonMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
        }
        iosMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
        }
    }
}

ビルド設定後、プラットフォーム固有のコードを追加できます。Kotlin/NativeはKotlinラッパーを通じてiOS関数へのアクセスを提供します。例えば、iOSでデバイスUUIDを取得するには、FoundationのNSUUIDを呼び出す必要があります。

kotlin
import platform.Foundation.NSUUID

fun getDeviceId(): String {
    return NSUUID().UUIDString()
}

fun currentTimestampMillis(): Long {
    return (platform.Foundation.NSDate().timeIntervalSince1970 * 1000).toLong()
}

iOSフレームワークのビルド

iOSフレームワークを生成するには、GradleタスクlinkDebugFrameworkIosArm64またはプロダクション用のlinkReleaseFrameworkIosArm64を使用します。ビルド後、フレームワークはbuild/bin/iosArm64/debugFramework/に配置されます。Xcodeプロジェクトへの接続は、Pods Podfileを介して、またはGeneral → Frameworks、Libraries and Embedded Contentにフレームワークを追加して行われます。

kotlin
// iOS arm64向けリリースフレームワークをビルド
./gradlew :shared:linkReleaseFrameworkIosArm64

// ユニバーサルフレームワークx86_64 + arm64をビルド
./gradlew :shared:linkReleaseFrameworkIosX64 \
    :shared:linkReleaseFrameworkIosArm64

// App Store用XCFrameworkを作成
./gradlew :shared:assembleReleaseXCFramework

Kotlin/Native vs Kotlin/JVM:比較

Kotlin/NativeとKotlin/JVMは、アーキテクチャ、パフォーマンス、適用範囲が異なります。Kotlin/JVMはコードをJVM上で実行されるバイトコードにコンパイルし、Javaライブラリの広大なエコシステムへのアクセスを提供しますが、インストールされた仮想マシンが必要です。Kotlin/Nativeは外部依存関係なしで実行可能ファイルを生成しますが、ライブラリエコシステムはより制限されています。

起動時間のパフォーマンスは、JVMのロードが不要なKotlin/Nativeの方が高いです。JetBrainsのベンチマークによると、Kotlin/NativeのHello Worldアプリケーションは0.003秒で起動しますが、Kotlin/JVMは仮想マシンのロードに0.5~1秒かかります。ただし、Kotlin/Nativeの実行可能ファイルサイズは、含まれるランタイムのために2~3倍大きくなる可能性があります。

特性Kotlin/NativeKotlin/JVM
ターゲットプラットフォームiOS、macOS、Windows、Linux、WebAssembly、組み込みサーバー、Android、デスクトップ(JVM)
依存関係ランタイム不要(自己完結型)JVMが必要(JDK/JRE)
起動時間約3ミリ秒約500~1000ミリ秒
エコシステム制限あり(Kotlin + Interop)完全(Kotlin + Java + Android SDK)
バイナリサイズ約1~5MB(ランタイム含む)約100~500KB(JAR)

Kotlin/NativeとKotlin/JVMの選択は、ターゲットプラットフォームによって異なります。プロジェクトがiOSをターゲットにしている場合、または最小限のリソース消費が必要な場合、Kotlin/Nativeが唯一の選択肢です。Android開発では、Kotlin/JVMが標準ですが、ネイティブパフォーマンスが必要なNDKコンポーネントにはKotlin/Nativeが使用されます。マルチプラットフォームプロジェクトでは、Kotlin Multiplatformが両方のアプローチを組み合わせています。共有コードはiOS向けにKotlin/Nativeを介して、Android向けにKotlin/JVMを介してコンパイルされます。

よくある質問

Kotlin/NativeとKotlin/JVMの違いは何ですか?

Kotlin/Nativeはコードを仮想マシンなしでネイティブマシンコードにコンパイルしますが、Kotlin/JVMはインストールされたJVMを必要とするバイトコードにコンパイルします。Kotlin/NativeはiOS、組み込みシステム、WebAssemblyに使用され、Kotlin/JVMはAndroidとサーバーに使用されます。

KMMなしでKotlin/Nativeを使用できますか?

はい。Kotlin/Nativeは、サポートされている任意のプラットフォーム向けにコンソールアプリケーション、ネイティブプラグイン、またはライブラリを作成するためのスタンドアロンコンパイラとして使用できます。KMMはマルチプラットフォームコードの整理を簡素化するだけです。

Kotlin/NativeはiOSでメモリをどのように管理しますか?

Kotlin/NativeのMemory Managerは、自動サイクル検出器付きの参照カウントを使用します。Kotlin 1.7.20以降、ガベージコレクタは@ThreadLocalアノテーションを必要とせず、iOSのメインスレッドを停止せずに動作します。

Kotlin/NativeからアクセスできるiOSライブラリは?

cinteropを介して、すべてのiOSフレームワーク(Foundation、UIKit、CoreData、CoreBluetooth、MapKitなど数百)にアクセスできます。JetBrainsはKotlin/Nativeの一部として標準iOSライブラリ用のバインディングを提供しています。

iOSでKotlin/Nativeコードをデバッグする方法は?

接続されたKotlin/NativeフレームワークとともにXcodeを使用してデバッグします。KotlinコードのブレークポイントはiOSシミュレータでの実行時に機能します。実機の場合は、DebugビルドとApple開発者プロファイルが必要です。

まとめ

  • Kotlin/NativeはKotlinをネイティブコードに変換するコンパイラであり、Kotlin Multiplatform Mobileの基盤です。
  • LLVMバックエンドは、iOS、Android NDK、macOS、Windowsを含む13のターゲットプラットフォーム向けのマシンコード生成を提供します。
  • Memory Managerは参照カウントによりスレッドを停止せずに動作し、モバイルプラットフォームにとって重要です。
  • iOSフレームワークは自動的に生成され、embedAndSignAppleFrameworkForXcodeを介してXcodeプロジェクトに接続されます。
  • Objective-CおよびSwift Interopは、cinteropと@ObjCNameを介してネイティブiOSコードとの双方向統合を提供します。
  • 起動パフォーマンスは、JVM版の0.5〜1秒に対して最大0.003秒と、Kotlin/Nativeの方が大幅に優れています。
  • JVMが利用できない、または望ましくないiOS、組み込みシステム、WebAssemblyにはKotlin/Nativeを使用してください。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください