How to Get Started with Erlang and Elixir

Are you ready to dive into the world of Erlang and Elixir? These two programming languages are becoming increasingly popular for their ability to handle concurrency and fault tolerance. Whether you're a seasoned programmer or just starting out, learning Erlang and Elixir can open up a whole new world of possibilities. In this article, we'll cover the basics of getting started with these two languages.

What is Erlang?

Erlang is a programming language that was developed by Ericsson in the late 1980s. It was designed to handle telecommunications applications, which require high levels of concurrency and fault tolerance. Erlang is a functional programming language, which means that it focuses on the evaluation of expressions rather than the execution of commands.

What is Elixir?

Elixir is a programming language that was developed in 2011 by José Valim. It is built on top of the Erlang virtual machine and is designed to be a more modern and approachable version of Erlang. Elixir is also a functional programming language, but it has a more familiar syntax that is similar to Ruby.

Installing Erlang and Elixir

Before you can start programming in Erlang and Elixir, you'll need to install them on your computer. The easiest way to do this is to use a package manager. If you're on a Mac, you can use Homebrew. If you're on Linux, you can use your distribution's package manager. If you're on Windows, you can use Chocolatey.

To install Erlang using Homebrew, open up a terminal and type:

brew install erlang

To install Elixir using Homebrew, type:

brew install elixir

Once you've installed Erlang and Elixir, you can check that they're working by opening up a terminal and typing:

erl

This will open up the Erlang shell. You can exit the shell by typing q().

To check that Elixir is working, open up a terminal and type:

iex

This will open up the Elixir shell. You can exit the shell by typing exit.

Basic Syntax

Now that you have Erlang and Elixir installed, let's take a look at some basic syntax.

Erlang

In Erlang, variables are denoted by a capital letter. For example:

X = 5.

This assigns the value 5 to the variable X.

Functions in Erlang are defined using the fun keyword. For example:

add(X, Y) ->
    X + Y.

This defines a function called add that takes two arguments, X and Y, and returns their sum.

Elixir

In Elixir, variables are denoted by a lowercase letter. For example:

x = 5

This assigns the value 5 to the variable x.

Functions in Elixir are defined using the def keyword. For example:

def add(x, y) do
    x + y
end

This defines a function called add that takes two arguments, x and y, and returns their sum.

Concurrency

One of the main reasons to use Erlang and Elixir is their ability to handle concurrency. In Erlang and Elixir, concurrency is achieved through the use of processes. A process is a lightweight thread of execution that runs independently of other processes.

Erlang

In Erlang, processes are created using the spawn function. For example:

spawn(fun() ->
    io:format("Hello, world!~n")
end).

This creates a new process that prints "Hello, world!" to the console.

Processes in Erlang communicate with each other using message passing. For example:

Pid = spawn(fun() ->
    receive
        {From, Message} ->
            From ! {self(), Message}
    end
end),
Pid ! {self(), "Hello, world!"},
receive
    {Pid, Message} ->
        io:format("Received message: ~p~n", [Message])
end.

This creates a new process that waits to receive a message. When it receives a message, it sends a response back to the sender.

Elixir

In Elixir, processes are created using the spawn function. For example:

spawn(fn ->
    IO.puts "Hello, world!"
end)

This creates a new process that prints "Hello, world!" to the console.

Processes in Elixir communicate with each other using message passing. For example:

pid = spawn(fn ->
    receive do
        {from, message} ->
            send(from, {self(), message})
    end
end)
send(pid, {self(), "Hello, world!"})
receive do
    {^pid, message} ->
        IO.puts "Received message: #{message}"
end

This creates a new process that waits to receive a message. When it receives a message, it sends a response back to the sender.

Fault Tolerance

Another reason to use Erlang and Elixir is their ability to handle faults. In Erlang and Elixir, faults are handled through the use of supervisors. A supervisor is a process that monitors other processes and restarts them if they fail.

Erlang

In Erlang, supervisors are defined using the supervisor module. For example:

-module(my_supervisor).
-behaviour(supervisor).

-export([start_link/0]).

start_link() ->
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).

init([]) ->
    {ok, {{one_for_one, 10, 10},
          [{my_worker, {my_worker, start_link, []},
            permanent, 5000, worker, [my_worker]}]}}.

This defines a supervisor that starts a worker process called my_worker. If my_worker fails, the supervisor will restart it.

Elixir

In Elixir, supervisors are defined using the Supervisor module. For example:

defmodule MySupervisor do
    use Supervisor

    def start_link do
        Supervisor.start_link(__MODULE__, [])
    end

    def init([]) do
        children = [
            worker(MyWorker, [])
        ]

        supervise(children, strategy: :one_for_one, max_restarts: 10, max_seconds: 10)
    end
end

This defines a supervisor that starts a worker process called MyWorker. If MyWorker fails, the supervisor will restart it.

Conclusion

Erlang and Elixir are powerful programming languages that are well-suited for handling concurrency and fault tolerance. In this article, we've covered the basics of getting started with these two languages. We've looked at installing Erlang and Elixir, basic syntax, concurrency, and fault tolerance. With these tools in hand, you're ready to start exploring the world of Erlang and Elixir. Happy coding!

Additional Resources

cryptomerchant.services - crypto merchants, with reviews and guides about integrating to their apis
learnpostgres.dev - learning postgresql database
datawarehouse.best - cloud data warehouses, cloud databases. Containing reviews, performance, best practice and ideas
flutter.solutions - A consulting site about mobile application development in flutter
coinexchange.dev - crypto exchanges, integration to their APIs
typescriptbook.dev - learning the typescript programming language
javascriptbook.dev - An javascript book online
learndbt.dev - learning dbt
realtimestreaming.dev - real time data streaming processing, time series databases, spark, beam, kafka, flink
mledu.dev - machine learning education
learngo.page - learning go
cheatsheet.fyi - technology, software frameworks and software cheat sheets
javafx.app - java fx desktop development
networking.place - professional business networking
costcalculator.dev - calculating total cloud costs, and software costs across different clouds, software, and hardware options
zerotrust.video - zero trust security in the cloud
devsecops.review - A site reviewing different devops features
changedatacapture.dev - data migration, data movement, database replication, onprem to cloud streaming
jimmyruska.com - Jimmy Ruska
lowcode.place - low code deployment and development


Written by AI researcher, Haskell Ruska, PhD (haskellr@mit.edu). Scientific Journal of AI 2023, Peer Reviewed