Programming languages evolve to replace the all-powerful “low-level” constructs with more limited constructs that reduce to the low-level ones. It’s why you get things like interfaces over inheritance.
The corollary of this is that if you use a powerful construct, it should be because the limited one can’t do what you want. Don’t force an infinite for-loop!
High-level features are more limited constructs that compile down to the low-level ones.