Piccola correzione: il compilatore Java non trasforma in codice macchina ma in un codice intermedio detto bytecode. Questo codice viene poi interpretato dalla Java Virtual Machine (e ricompilato a runtime, vedi il JIT)