思い出した疑問
大学のゼミに入るとき、いろいろ研究室のガイダンスがあった。で、そのとき、聞きにいったときに説明されたのが、javaのアセンブラで最適化したライブラリを作るって話。スタックマシン用のアセンブラってどんなの?標準で付属しているのはjavapっていうディスアセンブルするやつだけだしなぁ。
すぐ出てきた
Jasmin - Java Assembler Interpreterこれだ!つか、GUIのIDEついてるし。
ほんとにアセンブラだね(当たり前か。なんかCASLIIを思い出す命令セットだな。アセンブラあまり書いたことないけど、高校の先生が、「CASLは基本命令しかないから、逆にプログラムを書くのが難しい」とかいってたっけ。
javapも使ってみた。
コードはこれ
class BenchThread { public static void main(String argv[]) throws Exception{ String url = argv[0]; int max = Integer.parseInt(argv[1]); int thread_max = Integer.parseInt(argv[2]); double sum = 0; FetchBenchMark benchmark = new FetchBenchMark(url,max,thread_max); Failure benchmarkfail = new Failure(1); int count = 0; while (count < 3) { double time = benchmark.do_benchmark(); if (benchmark.is_success()) { System.out.println(time); sum += time; count++; } else if (!benchmarkfail.can_retry()) { System.out.println("Could not bench mark"); return; } } System.out.println((double) sum / 3); } }
よくよく考えると、ベンチマーク成功とか、失敗とか、そんな概念あるのか?と思う。それも含めてベンチマークではないのか>自分
ディスアセンブルすると
Compiled from "BenchThread.java" class BenchThread extends java.lang.Object{ BenchThread(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]) throws java.lang.Exception; Code: 0: aload_0 1: iconst_0 2: aaload 3: astore_1 4: aload_0 5: iconst_1 6: aaload 7: invokestatic #2; //Method java/lang/Integer.parseInt:(Ljava/lang/String;)I 10: istore_2 11: aload_0 12: iconst_2 13: aaload 14: invokestatic #2; //Method java/lang/Integer.parseInt:(Ljava/lang/String;)I 17: istore_3 18: dconst_0 19: dstore 4 21: new #3; //class FetchBenchMark 24: dup 25: aload_1 26: iload_2 27: iload_3 28: invokespecial #4; //Method FetchBenchMark."<init>":(Ljava/lang/String;II)V 31: astore 6 33: new #5; //class Failure 36: dup 37: iconst_1 38: invokespecial #6; //Method Failure."<init>":(I)V 41: astore 7 43: iconst_0 44: istore 8 46: iload 8 48: iconst_3 49: if_icmpge 108 52: aload 6 54: invokevirtual #7; //Method FetchBenchMark.do_benchmark:()D 57: dstore 9 59: aload 6 61: invokevirtual #8; //Method FetchBenchMark.is_success:()Z 64: ifeq 88 67: getstatic #9; //Field java/lang/System.out:Ljava/io/PrintStream; 70: dload 9 72: invokevirtual #10; //Method java/io/PrintStream.println:(D)V 75: dload 4 77: dload 9 79: dadd 80: dstore 4 82: iinc 8, 1 85: goto 105 88: aload 7 90: invokevirtual #11; //Method Failure.can_retry:()Z 93: ifne 105 96: getstatic #9; //Field java/lang/System.out:Ljava/io/PrintStream; 99: ldc #12; //String Could not bench mark 101: invokevirtual #13; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 104: return 105: goto 46 108: getstatic #9; //Field java/lang/System.out:Ljava/io/PrintStream; 111: dload 4 113: ldc2_w #14; //double 3.0d 116: ddiv 117: invokevirtual #10; //Method java/io/PrintStream.println:(D)V 120: return }
- if*,goto 制御
- iconst_ 定数
- ddiv 割り算
- iinc インクリメント
- dadd 足し算
- dload スタックにつむ
75-80はdloadしてdloadしてスタックの上二つをdaddって読み方か。
Java SE Specificationsにオペコードの意味がのってる。スタックマシン面白いね。