  We present Choral, the first choreographic programming language based on
mainstream abstractions. The key idea in Choral is a new notion of data type,
which allows for expressing that data is distributed over different roles. We
use this idea to reconstruct the paradigm of choreographic programming through
object-oriented abstractions. Choreographies are classes, and instances of
choreographies are objects with states and behaviours implemented
collaboratively by roles.
  Choral comes with a compiler that, given a choreography, generates an
implementation for each of its roles. These implementations are libraries in
pure Java, whose types are under the control of the Choral programmer.
Developers can then modularly compose these libraries in their own programs, in
order to participate correctly in choreographies. Choral is the first
incarnation of choreographic programming offering such modularity, which
finally connects more than a decade of research on the paradigm to practical
software development.
  The integration of choreographic and object-oriented programming yields other
powerful advantages, where the features of one paradigm benefit the other in
ways that go beyond the sum of the parts. The high-level abstractions and
static checks from the world of choreographies can be used to write concurrent
and distributed object-oriented software more concisely and correctly. We
obtain a much more expressive choreographic language from object-oriented
abstractions than in previous work. For example, object passing makes Choral
the first higher-order choreographic programming language, whereby
choreographies can be parameterised over other choreographies without any need
for central coordination. Together with subtyping and generics, this allows
Choral to elegantly support user-defined communication mechanisms and
middleware.
