Dies ist ein Experiment mit javap (Reverse Assembler) und jad (Reverse Compiler) für Kotlin-Code.
hello.kt
fun main(args: Array<String>) {
println("Hello, World!")
}
Codequelle https://kotlinlang.org/docs/tutorials/command-line.html
Kotlin wird wie jede andere JVM-Sprache in eine Klassendatei kompiliert, die als Java ausgeführt werden kann. Ich habe versucht, dies zu überprüfen, da es möglich ist, die JVM-Mnemonik mit javap anzuzeigen und sie mit jad als Java-Quellcode rückwärts zu kompilieren.
kompilieren
kotlinc hello.kt -include-runtime -d hello.jar
Erweitern Sie jar und verwenden Sie javap, jad für hello.class
jar xf hello.jar
macOS High Sierra 10
Nicht erforderlich, da es von Anfang an im JDK enthalten ist
Befehl
javap -c HelloKt.class
Ergebnis
Compiled from "hello.kt"
public final class HelloKt {
public static final void main(java.lang.String[]);
Code:
0: aload_0
1: ldc #9 // String args
3: invokestatic #15 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
6: ldc #17 // String Hello, World!
8: astore_1
9: getstatic #23 // Field java/lang/System.out:Ljava/io/PrintStream;
12: aload_1
13: invokevirtual #29 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
16: return
}
So installieren Sie jad
brew tap caskroom/cask
brew install caskroom/cask/jad
Referenzierte Website http://inarizuuuushi.hatenablog.com/entry/2017/05/09/231600
Mit der Option -a können Sie Mnemonics als Kommentare anzeigen.
Befehl
$ jad -a HelloKt.class
$ cat HelloKt.jad
python
import java.io.PrintStream;
import kotlin.jvm.internal.Intrinsics;
public final class HelloKt
{
public static final void main(String args[])
{
Intrinsics.checkParameterIsNotNull(args, "args");
// 0 0:aload_0
// 1 1:ldc1 #9 <String "args">
// 2 3:invokestatic #15 <Method void Intrinsics.checkParameterIsNotNull(Object, String)>
String s = "Hello, World!";
// 3 6:ldc1 #17 <String "Hello, World!">
// 4 8:astore_1
System.out.println(s);
// 5 9:getstatic #23 <Field PrintStream System.out>
// 6 12:aload_1
// 7 13:invokevirtual #29 <Method void PrintStream.println(Object)>
// 8 16:return
}
}
Es war ziemlich einfach einzuführen und zu analysieren. In Zukunft möchte ich überprüfen, wie Kotlin-spezifische Funktionen als Java ausgedrückt und konvertiert werden.
Recommended Posts