読者です 読者をやめる 読者になる 読者になる

思い出した疑問

大学のゼミに入るとき、いろいろ研究室のガイダンスがあった。で、そのとき、聞きにいったときに説明されたのが、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にオペコードの意味がのってる。スタックマシン面白いね。