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