The contribution of this work is threefold: (i) we have designed a hybrid environment for Java, named Harissa, that permit mixing of interpretation with compiled bytecode, (ii) we have designed an aggressive bytecode to C compiler whose generated code is more efficient than other compilers, and (iii) we have measured the relative efficiency of code produced by off-line and JIT compilers.
The micro-benchmarks presented in section 5.1 clearly show that an optimized off-line compiler such as Harissa's is faster than a JIT compiler. The gap between JIT and off-line compilers is greater for the SPARC than for the Pentium. This is due to the fact that binary code for modern RISC processors is complex to optimize and requires analyses that are hard to run in the short time allocated to on the fly compilation.
However, the JIT and off-line strategies can be made complementary. As shown by Plezbert and Cytron [7], a compilation process can consist of running the unoptimized code while another process does aggressive compilation on the background. Once the optimized code is available, the unoptimized code is replaced with the optimized one. Since our system already mixes bytecode interpretation and binary execution, this continuous compilation scheme can be incorporated easily in Harissa.
While Harissa generated code is already fast, our micro-benchmarks show that there are still opportunities for improvement. In a near future, we plan to integrate an analysis for eliminating transient stack variables so as to be independent from Suif. Furthermore, we are studying the development of a transformation phase, based on control flow information, aimed at rebuilding loop constructs. As was shown earlier, structured programs are usually better compiled.
Finally, we also plan to eliminate some type and bound checks since close examination of the C code generated has demonstrated that most of could be evaluated statically by means of a simple intra-procedural analysis.