@kitten for context: front-end does parsing and typechecking and such, middle end runs most optimizations, and backend emits machine code.
It's split like that so that you can have different frontends (different programming languages like C/Rust) and different backends (different CPU architectures like x86/ARM) all sharing the same optimizations in the middle.
No idea how common knowledge this is, I'm like the geologist in the "average familiarity" XKCD comic. So added to be sure.