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は、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ソースコードは最初に内部表現に変換され、次に最適化され、マシンコード生成のためにLLVMバックエンドに渡されます。最終段階は、ランタイムライブラリとのリンクと実行可能ファイルまたは動的ライブラリの作成です。
アーキテクチャには、フロントエンド(解析と型チェック)、IRジェネレータ(中間表現の構築)、LLVMバックエンド(マシンコード生成)の3つの主要コンポーネントが含まれます。このスキームは、C++およびRust用のClangコンパイラで使用されるアプローチと類似しています。
// コマンドラインによる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にとって重要です。
コンパイルプロセスは5つの段階に分かれています。解析(ソースコード分析)、意味解析(型チェックと名前解決)、IR生成(中間表現の構築)、最適化(簡略化とデッドコード削除)、LLVMによるコード生成です。各段階は異なるモジュールに対して並行して実行でき、大規模プロジェクトのビルドを高速化します。
| 段階 | 所要時間 | 結果 |
|---|---|---|
| 解析 | 約10% | ソースコードのASTツリー |
| 意味解析 | 約20% | 型付けされたAST |
| IR生成 | 約15% | Kotlin IR(中間表現) |
| 最適化 | 約25% | 最適化されたIR |
| LLVMコード生成 | 約30% | マシンコード+実行可能ファイル |
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プラグインを通じてこのプロセスを自動化します。
macOSとLinuxは、Compose Multiplatformフレームワークを使用したKotlinでのネイティブデスクトップアプリケーション開発に使用されます。Windows(MinGW)はKotlin 1.3.70からサポートされており、JVMをインストールせずにWindowsアプリケーションを作成できます。サーバー開発では、Kotlin/NativeはJVMが利用できない環境(scratchやAlpineをベースにした最小イメージのDockerコンテナなど)で使用できます。
| カテゴリ | プラットフォーム | アーキテクチャ |
|---|---|---|
| モバイル | iOS | arm64、シミュレータ(x64、arm64) |
| モバイル | Android NDK | arm32、arm64、x86、x86_64 |
| ウェアラブル | watchOS | arm64、シミュレータ(x64) |
| デスクトップ | macOS | x64、arm64 |
| デスクトップ | Windows | mingw x64 |
| デスクトップ | Linux | x64、arm64、arm32 |
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シミュレータでアプリケーションを実行する際に、共有モジュールコードのブレークポイントをサポートしています。
// 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"
}
}
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プロジェクトの最小構成を見てみましょう。
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を呼び出す必要があります。
import platform.Foundation.NSUUID
fun getDeviceId(): String {
return NSUUID().UUIDString()
}
fun currentTimestampMillis(): Long {
return (platform.Foundation.NSDate().timeIntervalSince1970 * 1000).toLong()
}
iOSフレームワークを生成するには、GradleタスクlinkDebugFrameworkIosArm64またはプロダクション用のlinkReleaseFrameworkIosArm64を使用します。ビルド後、フレームワークはbuild/bin/iosArm64/debugFramework/に配置されます。Xcodeプロジェクトへの接続は、Pods Podfileを介して、またはGeneral → Frameworks、Libraries and Embedded Contentにフレームワークを追加して行われます。
// iOS arm64向けリリースフレームワークをビルド
./gradlew :shared:linkReleaseFrameworkIosArm64
// ユニバーサルフレームワークx86_64 + arm64をビルド
./gradlew :shared:linkReleaseFrameworkIosX64 \
:shared:linkReleaseFrameworkIosArm64
// App Store用XCFrameworkを作成
./gradlew :shared:assembleReleaseXCFramework
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/Native | Kotlin/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はインストールされたJVMを必要とするバイトコードにコンパイルします。Kotlin/NativeはiOS、組み込みシステム、WebAssemblyに使用され、Kotlin/JVMはAndroidとサーバーに使用されます。
はい。Kotlin/Nativeは、サポートされている任意のプラットフォーム向けにコンソールアプリケーション、ネイティブプラグイン、またはライブラリを作成するためのスタンドアロンコンパイラとして使用できます。KMMはマルチプラットフォームコードの整理を簡素化するだけです。
Kotlin/NativeのMemory Managerは、自動サイクル検出器付きの参照カウントを使用します。Kotlin 1.7.20以降、ガベージコレクタは@ThreadLocalアノテーションを必要とせず、iOSのメインスレッドを停止せずに動作します。
cinteropを介して、すべてのiOSフレームワーク(Foundation、UIKit、CoreData、CoreBluetooth、MapKitなど数百)にアクセスできます。JetBrainsはKotlin/Nativeの一部として標準iOSライブラリ用のバインディングを提供しています。
接続されたKotlin/NativeフレームワークとともにXcodeを使用してデバッグします。KotlinコードのブレークポイントはiOSシミュレータでの実行時に機能します。実機の場合は、DebugビルドとApple開発者プロファイルが必要です。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。