Today I evaluated IBM's Jikes compiler. It is a replacement
for javac written from scratch in C++. It currently
lives at http://www.alphaWorks.ibm.com/. They just released
a Linux version, and since I develop entirely in Linux, I
thought I'd give it a whirl. Currently it is free for
any use, but considered alpha (or beta or whatever). They
may charge in the future, apparently. Source code was not
available :-(

The compiler is apparently a strict implementation to the 
JVM specification and Java Language Specification. The 
release notes are pretty adamant about that. Kudos for that.

I use a custom build system that compiles and jars the
source while enforcing explicit dependency instructions
between packages. It typically compiles one or more packages
at once, then collects them into a single jar, then
does the same for some more sets of packages. Once it has
compiled a few, depending on the ruleset, it may collect
some subjars to make larger ones. This is all just so
you know that the jar tool gets called a fair amount -
jikes and javac aren't the only things being run.

To test, I compiled two code bases twice for each tool.
The only change I made to the build scripts was replacing
"/usr/local/jdk/bin/javac" with "/usr/local/bin/jikes +E"
(+E gives emacs-friendly error messages). 

Useability-wise, jikes is very nice. It has options for different
output formats; the +E allows emacs and such to parse the output so
you can click to go to the correct line of source in the correct file.
It seems to give better error messages than javac. 

Note that I know the error message format - this is because I got
several I had never seen before. Jikes is pickier. I had to append
"L" to a few long literals. I had to remove the "$" from some
identifiers in a 3rd-party tool (these are disallowed in 1.1, but
were valid under 1.0 - javac accepts them; jikes will too with a
switch that allows 1.0 code). It also didn't like
one instance where I used an import like "this.that.*" - it 
wasn't able to find the .java files to compile; putting in
class-specific import statements fixed that. After I got it
to compile in jikes without error, I did the timing runs;
none of the changes broke javac compilation.

Also, my build
system enforces dependencies by limiting the classpath to
those jars that a given package is supposed to depend on - jikes
complained in instances where javac didn't. This was where
a class wasn't directly referenced (i.e., no variables were
declared of that type, casts made, etc.) but was accessed
in some fashion, or was part of a method signature that the 
code called, even though it wasn't used (e.g. null was passed
rather than a variable of the type).

Some of these things might be peculiar to my build system;
your mileage may vary. I'm not really annoyed by it - in
each case, Jikes seems to be correct, just less lenient
than javac. Since my code is the only area of my life I'm
anal-retentive about, this is OK by me.

Jikes is supposed to do incremental compiling, but this is
apparently disabled at present. The design for it is
very nice, and well-suited for use by other tools.

The main thing I was impressed by was its speed. Below are
the timing runs. Keep in mind that I'm not using a JIT,
and since javac is AFAIK 100% java, it's having to run
interpreted. Also keep in mind that a fair amount of
"jarring" going on - this should skew the results back into
javac's favor, since it is only directly competing
for a portion of the total run time.

Atlanta Java Consortium reuseables (172 classes)

Javac run 1:
real    2m16.450s
user    1m40.940s
sys     0m8.920s

Javac run 2:
real    2m2.959s
user    1m40.360s
sys     0m7.700s

Jikes run 1:
real    0m32.548s
user    0m16.870s
sys     0m5.110s

Jikes run 2:
real    0m38.575s
user    0m17.080s
sys     0m5.250s

Partner Software stable (631 classes)

Javac run 1:
real    5m1.667s
user    3m58.320s
sys     0m12.580s

Javac run 2:
real    4m34.586s
user    3m56.400s
sys     0m11.330s

Jikes run 1:
real    1m16.133s
user    0m40.160s
sys     0m7.230s

Jikes run 2:
real    1m7.439s
user    0m40.590s
sys     0m7.720s

As far as I can tell in this short a time, the code is working
correctly. 
I ran the reuseables test suite without error, and have done
some basic testing of our product software. I'll probably
use jikes full-time for awhile and see how it does as
far as correctness, but initial indications are very good.

Note the long list of addressees, including the Jikes authors; you might
want to reduce this in any replies. Thanks.

-- 

Paul Reavis                                      [EMAIL PROTECTED]
Design Lead
Partner Software, Inc.                        http://www.partnersoft.com

Reply via email to