It exists to make the code easier to read. In the past, there was no dyn keyword, but it was introduced to make it clear when you are talking about a trait, and when you are talking about a concrete type.
Is it used so the compiler knows that a Trait is meant, or for other people?
And as for the compiler: By using dyn one can have Types and Traits with the same name. Is that correct?
It helps avoid a bunch of confusion about whether a type is a trait. Without dyn, it looks like a trait is a type, but it's not. No-dyn will probably be made to stop working at some point.
This way Trait will always be a trait, and you can think of both dyn and impl as "operators" that turn a trait into a type. (It's not technically precise, but that's ok.)