cygwin で gcj 動かしてみよう

Java という言葉は、おおよそ二つの意味合いがある。C言語C++Pascalとかと同様の、(オブジェクト指向が云々、みたいな話の)言語としてのJava。そして環境としてのJavaである。JVMがアレでバイトコードのポータビリティがほげでJavaコンパイラがよよよとか語られる「Javaプラットフォーム」のこと。
Java の入門者に甘言を囁く人は、だいたい JavaバイトコードJVM があればどこでも動くのだよふふふ、みたいなことを言う。そんなことを言われると、たしかにそうなのかもなあと思いつつも、どこか釈然としない気持ちを抱く。その釈然としない気持ちがなんなのかというと、たいてい先の段落で述べたような、言語としての Java と、環境としての Java の違いを認識できてないゆえのものだ。Java 玄人の面々は、素人の我々を煙に撒くために、意図的に言語としての Java と環境としての Java をマゼコゼにして、OOPの利点とかも教えるのめんどくさいから、わかりやすい環境としての良さだけ語ってるのに違いない! 玄人は言語としての Java の素晴らしさを独占しているのだ!

という前置きで、あえて環境としての Java を無視して、gcjJava に触れてみようという思い付き。まずcygwinにインストール。setup.exeから gcj、libiconv あたりを入れる。

% cat hello.java
class HelloWorld{
  public static void main(String argv[]){
    System.out.println("Hello, World!");
  }
}
% gcj hello.java --main=HelloWorld -o hello
% ./hello.exe
Hello, World!

できたできた。--main を指定しないと

% gcj hello.java -o hello
/usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../libcygwin.a(libcmain.o):(.text+0xab): undefined reference to `_WinMain@16'
collect2: ld はステータス 1 で終了しました

こんなこと言われるので注意。でもちょっとびっくりするのが

% ll
合計 6213
-rwxr-xr-x 1 Gekko なし 6359834 Apr 12 08:04 hello.exe*
-rw-r--r-- 1 Gekko なし     107 Apr 12 08:04 hello.java
% strip -s hello.exe
% ll
合計 385
-rwxr-xr-x 1 Gekko なし 2157568 Apr 12 08:19 hello.exe*
-rw-r--r-- 1 Gekko なし     107 Apr 12 08:04 hello.java
% upx --best hello.exe
                       Ultimate Packer for eXecutables
    Copyright (C) 1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006
UPX 2.91 beta   Markus Oberhumer, Laszlo Molnar & John Reiser   Nov 29th 2006

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   2157568 ->    654848   30.35%    win32/pe     hello.exe

Packed 1 file.

すっげー。HelloWorldで6MB、strip で削って upx で縮めてやっとこ 600KB。やっとこ 600KB っていうか、削れすぎておもしろいけど。

つか、サイズよりも速度が。

% time javac hello.java
javac hello.java  0.15s user 0.14s system 15% cpu 1.811 total
% time java HelloWorld
Hello, World!
java HelloWorld  0.18s user 0.15s system 44% cpu 0.749 total
% time gcj hello.java --main=HelloWorld -o hello
gcj hello.java --main=HelloWorld -o hello  2.02s user 1.68s system 80% cpu 4.601 total
% time ./hello.exe
Hello, World!
./hello.exe  0.06s user 0.17s system 14% cpu 1.631 total

gcjコンパイル速度がダンチに遅い。cygwingcj ですしね。

んで、俺はこんなことするより、大学の Java の課題をやった方がいいだろ、と。

test