I have heard that Java must use a JIT to be fast. This makes perfect sense when comparing to interpretation, but why can't someone make an ahead-of-time compiler that generates fast Java code? I know about gcj
, but I don't think its output is typically faster than Hotspot for example.
Are there things about the language that make this difficult? I think it comes down to just these things:
What am I missing? If I avoid these features, would it be possible to compile Java code once to native machine code and be done?
A JIT compiler can be faster because the machine code is being generated on the exact machine that it will also execute on. This means that the JIT has the best possible information available to it to emit optimized code.
If you pre-compile bytecode into machine code, the compiler cannot optimize for the target machine(s), only the build machine.