Similarly, it is quite rare to compile programs directly to assembly. In general, you have some intermediate representations... which can closely resemble some bytecode. The reason is the same: compiling to a higher-level IR is simpler than going directly to assembly.