Just a thought: What makes compilers (essentially the whole toolchain) so complicated and scary is the fact that they have memory. They have a state. And the outcome very much depends on that state.
Furthermore, the state is pretty complex. So if a single entity of that state is wrong, you really have to know the guts inside out to find out why.
*) From a user perspective
**) The state is on the harddrive. E.g. make fails, next make may produce something utterly incomprehensible simply because of the state of the already compiled files on disk.