Date: Tue, 2 Feb 99 23:32:33 JST From: SHUDO Kazuyuki Subject: [JavaHouse-Brewers:23295] Jikes and javac To: java-house-brewers at java-house.etl.go.jp (JavaHouse Brewers ML) Message-Id: <199902021431.XAA29341@cafe.muraoka.info.waseda.ac.jp> 首藤です。 Java コンパイラと言えば、ほとんどの皆さんは javac コマン ドをお使いだと思います。けれど、世の中には javac 以外の Java コンパイラもいくつかあります。今すぐに思い付くのは guavac, jikes くらいですが、他にもあると思います。 Java のプログラムの性能を評価する際に、評価に用いた環境として例えば Pentium with MMX technology/233MHz, Linux 2.2.1, JDK 1.1.7v1a, JIT コンパイラなし くらいは述べる必要があります。#場合によってはスレッドライブラリも。 さて、Java コンパイラの種類は述べる必要があるでしょうか。 コンパイラによって、生成するバイトコードはどれくらい変わるものでしょう。 jikes と javac について、いくつかの観点から調べました。 非常に面白い結果が得られました。 テストに用いたソースとディスアセンブル結果を、メイル末尾に付けます。 (tar, gzip, uuencode) 感想: javac と jikes が行う最適化の程度にはかなり差がある。 javac はある程度行う。 jikes は (ほとんど?) 行わない。 調べたポイント: * method inlining * メソッド呼び出しの省略 * `+' 演算子で結ばれた文字列定数 * 条件式のコンパイル時判定 * if, switch 直後の return * method inlining 例: class hoge { public void method() { System.out.println(inlined()); } private int inlined() { return 5; } } javac は、メソッド inlined() の呼び出しを省略し、 5 を push する iconst_5 命令を生成します。 jikes は、inlined() を呼び出すコードを生成します。 * メソッド呼び出しの省略 例: class hoge { public void method() { eliminated(); } private void eliminated(); {} } javac は eliminated() の呼び出しを省略します。 jikes は省略しません。 * `+' 演算子で結ばれた文字列定数 例: ... System.out.println("1" + "2" + "3"); javac は、コンパイル時に "1"+"2"+"3" を "123" と演算しま す。クラスファイル中に現れるのは "123" です。 jikes は、"1" + "2" + "3" を行うコードを生成します。 つまり StringBuffer buf = new StringBuffer(); buf.append("1"); buf.append("2"); buf.append("3"); 相当のコードを生成します。 * 条件式のコンパイル時判定 例: boolean b = true; if (b) true 時の処理 else false 時の処理 javac は、条件判断 (ifeq 命令他) のコードを省き、true 時 の処理のコードのみ生成します。 jikes は条件判断、true, false 双方の処理など、 すべてのコードを生成します。 * if, switch 直後の return 例: if (...) true 時の処理 else false 時の処理 return; javac は、true 時の処理の最後に return 命令を生成します。 (疑似) バイトコード命令で書くとこんな感じです。 if XX label1 true 時の処理 return label1: false 時の処理 return jikes は、return 命令はひとつだけ生成し、true 時の処理の 最後に return 命令にジャンプする命令を生成します。 ifXX label1 true 時の処理 goto label2 label1: false 時の処理 label2: return javac が、return 以外の一般の命令を true, false 各ブロッ クの外から中に移動するかどうかは知りません。 …とまあ、ずいぶん違うものだなあ、というのが感想です。 jikes は (まだ?) 全然最適化を行いません。 現状ではまだ、人に渡すようなクラスファイルは javac で生成した方がよいと思います。 しかし jikes の処理の速さは非常に魅力的です。 開発中は jikes、公開、納入する版は javac でコンパイル、 という選択が妥当でしょう。 また、仕様よりまず実装ありきの javac と違い、 jikes は Java 言語の仕様を基に実装しているせいか、 コードに対するチェックが厳しいように感じます。 javac が受け付けるソースコードを jikes が受け付けなかったりします。 この理由からも、開発中は jikes を使って厳しめにコードを チェックしておくとよいかもしれないです。 SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh at muraoka.info.waseda.ac.jp http://www.shudo.net/index-j.html ===== begin 644 comptest.tar.gz M'XL(`/V*MS8"`^U<:U?;R!GVU^@O[)<)$0W9+48STF@P@;0)2QIZEH4#W7YL M5K;'0<%(U)+9W;;Y[YV+;I9E2\*R3,C,.<"(N;W2Z'GOFH%_>Q?2(-SKK*\` MRR`8@PX`@-B6^`LM^3 MUH].@LZ3*X-X_T]'W<_.O;..-:!AV-%^%^X_@I;?AMV[B>N%8V]G*YQ,Z=:KUZ(''0=T2=>1P]IEWR_:%ZVCRN;P M?WGR]L>SD\XF\&^99LK_,6*MR+*)PG\;Y;-[0P/PG?Y.__#=SCO`1L7]ISV"OUV/_^=L>[X!8C7AQ[?W_6.T9JQP&[U_PS@S)W;WXG>H&UWRJ M[;UM=[OWTQO>SF?^E_X7_9Q?%/4]>GZXW=O^9?OYMKY]DX[YH/?T&T$B&S4[ M9W?H!DZP*RA?V,CO,II(U_\4DZ__J/\GD\NKH MI60#`C4OM?.+?UP=[9YKVM_?_O/MQ1%ON],NSXY>3F[![NBEI@D=PG-NZ=&O M?2>@O`9T"(0^^:M&!]<^V))Z!F\Z`'HR8$O31OX$1._>!+@>T!,RM*$O=`<] M:=8Y*9GA8@791]`&=@=@EVD7]TY(,]W`F^P8R1&22>7PR[-L%U%CRWM4^V;P MS_3_#"-M4_Y#PR*I_L]M`6B9!E+X;Z,<2Q@,P6CBWX+("-02JX#^'E)O&`B] MH#MVO$_=\_YG.@@C8V"QP1`9`*>C'5;[HFEGHK6PIR8<`.[8=X8?(;^`S,B@ M_V92@%]8X!,-V1Z%;)T7^^#PO4O'0TF/ZW'A]_O/KEXN02]-T0!#0$W^]I;4@*/";OPC[#.;`C1E`(+ON)/\8.`$%\&!) MF`_&X4``^DS%N7F=CD/+QJ%XG.AJ+NMJ%BXQI"-G.@Z7#8RZQ,._?&N\*\'_ MA72;KH,!E,I_F.(?,=64M1JVPG^+^(\V7S*`J%Y5^H]\7\G\)Z7_-QT'*,._ M;>!$_[<-CG_V&RO\M^__R1F!VIQU4#\>$`G6=([%;I[(`9'QE)`J3AQSSJ\. MD2E=.#CO)=FOX20!^WDG2?8FRITE]M?@*UF"_\;\P&7^7TQ(!O^8XQ]"J/"_ M>?P7^(&K,(.'^8-7XA35_+TF\.AOTM][+.XF#_QWT]&(3D1?&PRG=]))G`,V M[!4@.SM>XAL:D0]@+?,TX6HFD*R&Y$FEV)13? M4R]=2?):U/`]H3G>;9H+YP.A+RORR:.Y:*I9)YQJPM48OP6_'B]YD?^G:06P M3/]+\O^Y_\="0O]#*OZW\?UO2@&HM_^6V'^L\G\VLO_KR`$KT__L]/L/3$3^ M-T;05/N_`?TO90+:C&>XOMW'Y&NLT(DI%BMSO&=!9#]T^F,:>9O9E0_,@]BA M>X0M[9EX=0Z8K)=5=`!,(JNLHX6E&I#5$(T*&B(3_7/&I%!OF/*14RD@K*-2 MV&GJF$EJDV49@IE7`+&Q$BG83)\0MFJ3A:-4CDRV M1.S:%\V]E8BST9Q&&+W4Y=I@[U$K@POX?Z,Y8*7\G^`,_\>"_UO*_[]A_E]D M^Y<(@X?9_>N5%/N%DJ*72@HR+RFL.I+"+A<5M7*SF*@0B6.VS2]ZM0EC(F$N M<2P2%M9*A%FD-BTXEEOVG+1`*]'"N$3ZD'#]W;.CW>,);47RPEYM#VW[X?+" M1&T*C+GX[QH,@#+[#Q.4QG]-GO^%3S_3>._0`$L9095-,!H MCI'K,<`TPR^J1G_F-+;%'*.6O%^)913&2=KB&0G^)06GWMCUV%TUF@96>OZ+ MD>#?-K"4_T3%?]OA_P+7LYO_@!QPEP^EK$N4"9;)(Q/9HW%S-(-\G0%6:6./ M1OZ?C-U;QI%#>LJXTX"Q5=]KRA8HU?^MY/L/;!$N_XFM\+\)^5_T$F1L@8+F MAV>$S5@,-)XY:2Y8JU0CR,G@N9D+>Q4N5,%,?QI?PE7!_ZJV0!G^"'LBO.XKL5=L,MG'7PFZ7X;\@( M*/W^PT[S/RPD\C\L]?U7F_I_$99+C(`\`F=T_CDHB$%*TW_$\O]*N%*.?6_H M-HG]2O:_G9S_B*#`/V8F@<)_>_C/;7X9]I-#8<$1X.=EO*YV,BS]G0ZFC!UT M*QX/Z_DAR(U1+*0E_U^3844^9D[B+)2,@LP M#3XW(']_Y4I_"X&!$OPW$@:L#_P+3ORHS:-#J;Y1?5`T7 M9K!IS1GD:4K!#&UOLI^,I=%$:SE[@<8&V`M2YS\J_6^1_=>@`EB:_V&2U/XS M>?XO,93_9Q/\O\@)H!6;B"N`E"1&:QX$D`]3A'I1_')L$'H3ZB\0MD/!LSHT%@B MO_*OK1?VYM/(9CD,A*N='&M%)\=B^0%_70*3;_0S'P#,NM(6?*]?ZP19W``? 85`JH*JJHHHHJJJBB2NOE_YJZL!D`>``` ` end