Mixing Metaphors: Actors as Channels and Channels as Actors Simon Fowler, Sam Lindley, and Philip Wadler University of Edinburgh, Edinburgh, United Kingdom
[email protected],
[email protected],
[email protected] Abstract Channel- and actor-based programming languages are both used in practice, but the two are often confused. Languages such as Go provide anonymous processes which communicate using buffers or rendezvous points—known as channels—while languages such as Erlang provide addressable processes—known as actors—each with a single incoming message queue. The lack of a common representation makes it difficult to reason about translations that exist in the folklore. We define a calculus λch for typed asynchronous channels, and a calculus λact for typed actors. We define translations from λact into λch and λch into λact and prove that both are type- and semantics- preserving. We show that our approach accounts for synchronisation and selective receive in actor systems and discuss future extensions to support guarded choice and behavioural types. 1998 ACM Subject Classification D.1.3 Concurrent Programming Keywords and phrases Actors, Channels, Communication-centric Programming Languages Digital Object Identifier 10.4230/LIPIcs.ECOOP.2017.90 1 Introduction When comparing channels (as used by Go) and actors (as used by Erlang), one runs into an immediate mixing of metaphors. The words themselves do not refer to comparable entities! In languages such as Go, anonymous processes pass messages via named channels, whereas in languages such as Erlang, named processes accept messages from an associated mailbox. A channel is either a named rendezvous point or buffer, whereas an actor is a process.