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 の課題をやった方がいいだろ、と。