Fajita compiles bytecode methods directly into native code for two
families of processor: the ARM family (including StrongARM and Xscale)
and Hitachi's SuperH processors. During optimisation, it favours code
size over speed, and thus drastically reduces the size of the native
code.
Fajita is split into 3 parts: a processor and JVM-independent
front-end, a processor-dependent, JVM-independent backend and a
processor-independent JVM-dependent installer in order to maximize
code reuse for all processors and targeted JVMs.
Fajita can compile full classes before execution, i.e. in AOT mode.
The appliance's JVM sees native code only, and can run the
application at full speed.
Fajita can also be used in dynamic compilation mode with JCod.
An integrated profiling tool helps to determine, dynamically, the classes
that are worth compiling.
As for the Turbo compiler, Fajita preserves the original Java/JVM semantics, including
its most intimate details such as introspection, serialization, dynamic
loading, etc. It is also designed to work in mixed mode, where interpreted
bytecode and native code cooperate and call each other transparently.
Both compilers offload actual
compilation from the device.