  Prototyping and implementing distributed algorithms, particularly those that
address challenges related with fault-tolerance and dependability, is a time
consuming task. This is, in part, due to the need of addressing low level
aspects such as management of communication channels, controlling timeouts or
periodic tasks, and dealing with concurrency issues. This has a significant
impact for researchers that want to build prototypes for conducting
experimental evaluation; practitioners that want to compare different design
alternatives/solutions; and even for practical teaching activities on
distributed algorithms courses.
  In this paper we present Babel, a novel framework to develop, implement, and
execute distributed protocols and systems. Babel promotes an event driven
programming and execution model that simplifies the task of translating typical
specifications or descriptions of algorithms into performant prototypes, while
allowing the programmer to focus on the relevant challenges of these algorithms
by transparently handling time consuming low level aspects. Furthermore, Babel
provides, and allows the definition of, networking components that can capture
different network capabilities (e.g., P2P, Client/Server, phi-accrual Failure
Detector), making the code mostly independent from the underlying communication
aspects. Babel was built to be generic and can be used to implement a wide
variety of different classes of distributed protocols.
  We conduct our experimental work with two relevant case studies, a
Peer-to-Peer application and a State Machine Replication application, that show
the generality and ease of use of Babel and present competitive performance
when compared with significantly more complex implementations.
