To install harissa:
bin/ include/ lib/ libjdk/ lib/mmwithgc/ lib/mmwithout/ doc/
Harissa offers two commands:
hi is a Java interpreter. Its syntax can be obtained by executing it with no parameters:
hi version alpha3.01 copyright (C) Irisa/Inria 1996,1997 syntax: hi [-p] class args... -p : generate profiling information 'class' is a class containing a 'main' method which will be launched. Its signature must be 'public static void main(String[])'. 'args' are the arguments given to the 'main' method.
The profiling information is written into the files vm.prof and call.prof.
hac is a Java to C translator. A C source file is generated for each Java class used by the compiled application. The syntax can be obtained by executing hac with no parameters:
Hac version alpha3.02 copyright (C) Irisa/Inria 1996,1997 syntax: hac [-h] [-V] [-o output] [-d path] [-l lib] [-P] [-R] [-J] [-n] [-O] [-C] [-i size] [-I n] [-M nClass] [-B] [-T] [-g] [-s] [-t] [-S] [-N (+|-)Method] command classes... 'command' : one of header,stub,src,code,prog 'classes' : the Java classes to handle -h : print this help -V : verbose (more progress indication) -o object : name of executable binary (default='./gen') -d dir : directory of generated C sources (default='a.out') -l x : don't generate classes provided by the 'libx' library -P : print bytecode within each method -R : Generate a dummy return after index bound exceptions (default for the SPARC) -J : Generate a jump to a common label for index bound exceptions (default for i386) -O : turn on optimizations (equivalent to -C -i100 -I1 -g) -C : Class Hierarchy Analysis -i size : allow method inlining when bytecode size <= size -I n : perform at most n iterations of inlining (default: 0) -M nClass : perform at most n iterations of inlining of classes matching Class -B : no bound checks -T : no type checks -g : include source file information (name of variables, name of fields) -s : assume that no class will be loaded dynamically -t : Analyse thread creation (implies -C and -s) -S : Force generation of single-threaded code -N +Method : Specify that native methods matching Method may create threads (for -t) -N -Method : Specify that native methods matching Method do not create threads (for -t)
When you compile a Java program into C, the C source files are written by default within the directory ./gen. A Makefile is also created. To compile the C sources you only need to go in the gen directory and type make.
Behavior of commands:
Behavior of options:
-J and -R options are mutually exclusive. We found that puting either a jump or a return gave more control-flow information to gcc especially for array accesses embeded in loops. Caching of intermediate results in registers is more effective and the binary code is more efficient.
The purpose of the -B and -T options is to estimate the effective cost of checks in an application. It is not recommended to use them since the generated program does not follow Java semantics and the application is less reliable.
The makefile provided in the directory libjdk permits to generate a library containing JDK java classes. Before typing make, edit #define that are OS dependent. Basically, the makefile lists classes of the JDK archive and for each class calls:
hac code classThen, C files are compiled and put together in a libjdk.so library. Then, the library has to be be used with -l jdk option.
The first step is to create a gen directory.
The following command can then be used to create an optimized binary (assuming the JDK library has been compiled seperately):
hac -ljdk -t -O -o cjavac prog sun.tools.javac.Mainto create the C files (this compilation process consumes about 40Mb of memory).
The C code can be compiled using the make command:
cd gen; make
On a PC/Pentium 90 Mhz, C code generation (without optimizations) takes about 1 mn. C code compilation by gcc 2.7.2 with the -O2 option takes about 8 minutes.
To limit the memory consumption (and compile more quickly) one might use:
hac -ljdk -o cjavac prog sun.tools.javac.Mainwhich consumes about 15M of memory and thus should work fine on most systems. To compile the jdk library into the binary, use:
hac -o cjavac prog sun.tools.javac.Main
To compile a highly optimized binary, assuming that enough RAM is available (about 100Mb), one might use the command:
hac -o cjavac -O -I5 -M1java. prog sun.tools.javac.Main
On SunOS, the make process sometime crashes, read the FAQ for solution.
Graphic applications relying on Biss must be linked with the jdk, awt and biss libraries. Therefore, one should give the -ljdk -lawt -lbiss options to hac. For instance, the LibBrowser application distributed with Biss can be compiled with the following command:
hac -ljdk -lawt -lbiss -C -g prog biss.jde.LibBrowserCHA requires a lot of memory, for large applications !! 240 Mb of virtual address space are required to compile LibBrowser with CHA.
Harissa is provided in two different configurations with and without Garbage Collection. The GC version is based on the Boehm-Demers-Weiser conservative garbage collector. The non GC version is based on the system malloc primitive. Since objects are never deallocated, it leads to an increase of the heap segment and a slow down of the application due to disk swapping.
The choice between the two versions is done by linking the application either with lib/mmwithgc/libmem.so or lib/mmwithout/libmem.so. To switch between versions, you have to change the LD_LIBRARY_PATH and HARISSA_LIB_MEM variables. On SunOS, the libmem.so library is statically linked with the program and the link phase has to be redone. To to so the application binary must be removed and the make restarted.
Harissa's garbage collector, the Boehm-Demers-Weiser conservative garbage collector, internally provides specific memory allocation primitives for data that is known to not contain pointers. These primitives are used for array and string allocation, and in a few other places (as appropriate). However, the garbage collector is conservative and does assume that any value not allocated in this fashion may be a pointer. This can lead to memory leaks, as is probably the case with hac at the moment, but for most applications it works fine.