概要
IntelliJ IDEA には、Kotlin のコードをバイトコードにコンパイルした結果を表示する機能、およびそのバイトコードをデコンパイルして Java で表示する機能があります。
インライン関数などコンパイラによって生成するバイトコードを見て意味ないとわかりにくい部分を理解するのに有用です。
方法
IntelliJ IDE で Kotlin のプロジェクトを作成し、コードを記述後に [ツール] メニュー – [Kotlin] – [Kotlin のバイトコードを表示] をクリックするだけです。
以下は、単に Hello World! を出力するプログラムのバイトコードを出力した例です。
fun main() {
println("Hello World!")
}

![IntelliJ IDEA - [ツール] メニュー - [Kotlin] - [Kotlin のバイトコードを表示]](https://iwannacreateapps.com/wp-content/uploads/2023/09/screenshot.2-530x380.png)
右側に [Kotlin Bytecode] のドックが表示されます。
![IntelliJ IDEA - [Kotlin Bytecode] ドック](https://iwannacreateapps.com/wp-content/uploads/2023/09/screenshot.3-530x380.png)
このケースでされたバイトコードは以下です。
// ================MainKt.class =================
// class version 52.0 (52)
// access flags 0x31
public final class MainKt {
// access flags 0x19
public final static main()V
L0
LINENUMBER 2 L0
LDC "Hello World!"
ASTORE 0
L1
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 0
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
L2
L3
LINENUMBER 3 L3
RETURN
L4
MAXSTACK = 2
MAXLOCALS = 1
// access flags 0x1009
public static synthetic main([Ljava/lang/String;)V
INVOKESTATIC MainKt.main ()V
RETURN
MAXSTACK = 0
MAXLOCALS = 1
@Lkotlin/Metadata;(mv={1, 9, 0}, k=2, d1={"\u0000\u0008\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001\u00a8\u0006\u0002"}, d2={"main", "", "HelloWorld"})
// compiled from: Main.kt
}
// ================META-INF/HelloWorld.kotlin_module =================
MainKt" *
Java にデコンパイル
さらにここから Java にデコンパイルできます。
[Kotlin Bytecode] のドックの左上 [デコンパイル] をクリックするだけです。
ここでは、Main.kt のバイトコードを表示し、デコンパイルしたので [Main.decompiled.java] というファイルが作成、表示されます。
![IntelliJ IDEA - [Kotlin Bytecode] - [デコンパイル]](https://iwannacreateapps.com/wp-content/uploads/2023/09/screenshot.4-530x380.png)
表示された Java のコードは以下です。
import kotlin.Metadata;
@Metadata(
mv = {1, 9, 0},
k = 2,
d1 = {"\u0000\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"},
d2 = {"main", "", "HelloWorld"}
)
public final class MainKt {
public static final void main() {
String var0 = "Hello World!";
System.out.println(var0);
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
}