From Source to Machine Code: 5 Compiler Steps