JVM Golf

Java かわいいよとみずしまさんがおっしゃってたのでとりあえず Hello world を書いてみました。 267Byte 。

http://shinh.skr.jp/binary/Code.class

普通にやると 409Byte くらい。

i@u ~/test/java> cat c.java
public class c{
    public static void main(String[] a){
        System.out.println("Hello, world!");
    }
}
i@u ~/test/java> javac c.java
i@u ~/test/java> java c
Hello, world!
i@u ~/test/java> ls -l c.class
-rw-r--r-- 1 i i 409 2006-12-20 06:45 c.class

javap してみるとコンストラクタが無かったり何故か PrintStream を継承してたりするわけですね。

i@u ~/wrk/binspect> javap Code                                                  public class Code extends java.io.PrintStream{
    public static void main(java.lang.String[]);
}

i@u ~/wrk/binspect> ls -l Code.class
-rw-r--r-- 1 i i 267 2006-12-20 06:47 Code.class
i@u ~/wrk/binspect> java Code
Hello, world!

やったこと。

  • コードには全く手を入れていない
  • コンストラクタ消した
  • いらなさそうなものは全部消した
  • クラスが Code という名前になってるのは、 Code という文字列はメソッドの内容示すために絶対必要みたいだったから
  • PrintStream を継承しているのは Object の型名をクラスファイルに入れないため

手でいじるのは大変だったので、いじるためにちょっとしたツールを作ってみたんだけど、まぁそれはまた今度。

あと参考文献。

http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h