Java wird nicht in maschinencode übersetzt, sondern in sogenannten "Bytecode", der dann bei der Ausführung in Echtzeit vom Interpreter in den jeweiligen maschinencode übersetzt wird. Das hat den Vorteil, dass der Bytecode OS-unabhängig ist (man braucht bloß einen zum Betriebssystem passenden Interpreter), aber es hat den Nachteil, dass es eben langsamer ist.