> things have to happen in a certain order. At compile-time, your ordering is checked against certain rules, and certain classes of deadlocks and hangs can be avoided. The order of actions is then enforced at runtime.
This is how imperitive languages work. One line executes before the one below it as a default.
Choreographic languages are often hosted in a functional language like Haskell and OCaml though so the analogy isn’t quite right
I would instead say that choreographic languages enforce global visibility of communication. The global behavior of the system is available syntactically. It doesn’t necessarily or even typically involve mutation, explicit loops, side effects etc at least in the literature.