JumalaSika ltd - Fotolia

Tip

A concurrent programming faceoff: Erlang vs. Elixir

Do you want the strong data integrity of Erlang, or the flexibility of Elixir? We explore the pros and cons of each in this head-to-head language matchup.

The rise of fault-tolerant, distributed systems has led to greater programming complexity. Both Erlang and Elixir offer unique benefits for developing always-available and highly concurrent systems. Concurrent programming can power web-based and mobile technologies as well as online collaborations between users, machines and smart devices.

For these real-time systems that require data integrity, Erlang is a mature and powerful tool. On the other hand, Elixir arguably provides more dynamic flexibility and ease of use. In this tutorial, we consider Erlang vs. Elixir in the context of each language's strengths and possible limitations, as well as whether one concurrent programming approach might be better.

Erlang: Fault-tolerance and concurrency

Erlang represents the gold standard for developing complex multithreaded systems designed for high availability. The language was designed in the 1980s to capitalize on the logic of the Open Telecom Platform (OTP). This platform acts as a single internal system where all call functions run small, self-contained processes that exclusively communicate with the other internal call functions. This creates the basis for concurrency that enables Erlang to contain a single software error and keep it from adversely affecting other processes.

Another key strength of Erlang is its ability to develop complex systems that quickly adapt to changing requirements. Because of its built-in support for concurrency, the language allows developers to focus on servicing enormous numbers of requests at the same time. Online messaging apps and financial systems that enable thousands of simultaneous interactions have benefited from its parallel processing approach.

The Erlang virtual machine, known as BEAM, is also fundamental to Multithreading. BEAM ensures that developers can use multiple concurrent nodes while keeping errors contained within those nodes. Moreover, through preemptive scheduling, BEAM assigns CPU cycles per task and pauses some in favor of others when necessary.

Erlang provides a high degree of fault tolerance and sophisticated messaging, and it is especially good at garbage collection, thanks to automatic memory management and minimized memory requirements. Since there is no memory sharing between Erlang processes, the language ensures code integrity and maintains self-healing mechanisms.

Elixir: Versatility and simplicity

Elixir is a dynamically typed language that shines when it comes to developing web-based or distributed services. Elixir is newer than Erlang, developed in the 2010s. It uses the Phoenix framework, and also bases its underlying structure in Erlang's BEAM. As a functional language that executes at runtime, Elixir emphasizes data immutability to simplify refactoring and ease debugging.

Elixir incorporates and builds on some of the key capabilities found in Erlang and statically typed language Kotlin. For example, it uses asynchronous messaging and eliminates shared memory to ensure concurrent handling for thousands of requests. These features of Elixir benefit microservice architectures, and enable Elixir applications to scale both vertically on multiple cores and horizontally across nodes.

Similar to Erlang, high fault tolerance also helps make Elixir immune to external networking problems and internal issues like bugs in logic and data. For example, if an application user makes a request with a bug in it, that specific process will crash, but other users will remain connected. In Elixir, the process scheduler will preemptively shift control to a different process to avoid downtimes. And since it's a compiled language, mistakes in code will prevent programs from running.

BEAM also provides Elixir a miniature OS that provides each process with its own memory space and prevents other processes from borrowing its resources. In addition, the Phoenix framework helps structure Elixir development projects for browser and mobile applications, including iPhones, Android handsets and smart devices.

Erlang vs. Elixir

Despite Erlang's advantages, its syntax can be challenging for beginners. Since the language was first developed in the 1980s and was designed to help run key telecom processes, it uses unfamiliar conventions, such as uppercase variable names and separating statements with commas.

Erlang lacked an effective package manager in the past, which might have created an obstacle for some developers to use the language. Prior to 2009, Erlang libraries were not well organized, making it difficult to install libraries from other programmers. The first version of rebar helped to improve the management process. Hex was introduced in 2013 and has emerged as the tool to ensure package health in both Erlang and Elixir.

Despite the longstanding status of Erlang, its community also remains relatively small. The number of available developer libraries is limited, even though dynamic library linking through OTP is well-established. However, Erlang programmers do have the ability to use libraries from Elixir.

In contrast to Erlang's complex syntax and structure, Elixir offers an easier learning curve that makes key functional programming methods more accessible. However, performing sequential mathematical calculations can be problematic in Elixir, since it's not a great choice when it comes to consumption of CPU power and processing speed. Moreover, the runtime applies multiple restrictions that can complicate the coding and learning process.

Since Elixir is a relatively new language, the community base is also small, which can make it challenging to find answers to coding questions.

As developers assess the strengths and weaknesses of these two languages, they need to consider the availability of the right framework, libraries, tools and services to support software projects. Both Erlang and Elixir offer concurrent programming advantages, and development speed, to grow and scale products quickly. Weigh how much your team values speed and accessibility versus performance power and stability.

Next Steps

Concurrent programming in Go with channels and goroutines

Dig Deeper on Application development and design