マシン x86 用 JVM Main.java class Main { void main() { int i = 0; i += 2; } } Windows Main.class javac class Main { main()V { iconst_0 istore_1 iload_1 iconst_2 iadd istore_1 } } 【バイト・コード】 JVM 専用の命令たち java arm マシン arm 用 JVM Linux SPARC マシン sparc 用 JVM SunOS
マシン x86 用 JVM Windows Main.class 共通のバイナリを… 異なる CPU / 異なる OS で実行できる! class Main { main()V { iconst_0 istore_1 iload_1 iconst_2 iadd istore_1 } } java arm マシン arm 用 JVM SPARC マシン sparc 用 JVM JVM 専用の命令たち Linux SunOS
void main() { int i = 0; i += 2; } } Main.kt class Main { fun main() { var i = 0 i += 2 } } Main.clj JVM class file / bytecode Main.java javac class Main { main()V { iconst_0 istore_1 iload_1 iconst_2 iadd istore_1 kotlinc } } JVM Clojure scalac (ns main (:gen-class)) (defn -main [& args] (let [i 0 i (+ i 2)])) Main.scala object Main { def main(): Unit = { var i = 0 i += 2 } }
と b を取る • a と b の和を計算する • 和を2倍して返す $ javac Calc.java $ java Calc public class Calc { public static int calc(int a, int b) { return (a + b) * 2; } static void main() { IO.println(calc(0, 1)); IO.println(calc(1, 2)); IO.println(calc(3, 4)); IO.println(calc(4, 5)); } }
コマンドを使います public class Calc { public static int calc(int a, int b) { return (a + b) * 2; } $ javap -v Calc static void main() { IO.println(calc(0, 1)); IO.println(calc(1, 2)); IO.println(calc(3, 4)); IO.println(calc(4, 5)); } }
→ 引数・戻り値なし • (Ljava/lang/String;)I → String を受け取って int へ • ([IDZ)[[Ljava/lang/String; → int 配列,double, boolean を String の2次元配列へ 型 I int C char S short B byte J long F float D double Z boolean V void L…; 参照型 [… 配列