  The model of asynchronous programming arises in many contexts, from low-level
systems software to high-level web programming. We take a language-theoretic
perspective and show general decidability and undecidability results for
asynchronous programs that capture all known results as well as show
decidability of new and important classes. As a main consequence, we show
decidability of safety, termination and boundedness verification for
higher-order asynchronous programs -- such as OCaml programs using Lwt -- and
undecidability of liveness verification already for order-2 asynchronous
programs. We show that under mild assumptions, surprisingly, safety and
termination verification of asynchronous programs with handlers from a language
class are decidable iff emptiness is decidable for the underlying language
class. Moreover, we show that configuration reachability and liveness (fair
termination) verification are equivalent, and decidability of these problems
implies decidability of the well-known "equal-letters" problem on languages.
Our results close the decidability frontier for asynchronous programs.
