Czym jest Erlang i dlaczego warto go poznać
Erlang to funkcyjny język programowania stworzony do budowania systemów rozproszonych, współbieżnych i odpornych na awarie. Jeśli korzystacie z WhatsApp, Discorda, RabbitMQ albo jakiegokolwiek systemu telekomunikacyjnego — prawdopodobnie korzystacie z Erlanga, nawet o tym nie wiedząc.
Erlang nie jest „elegancki” w sensie, w jakim elegancji szukają fani Haskella czy Idris. Nie ma monad, nie ma typów zależnych, nie ma dowodów na poziomie systemu typów. Ale ma coś, czego większość języków nie ma: sprawdzone w boju mechanizmy do budowania systemów, które po prostu nie padają. Procesy Erlanga mogą padać i restartować się bez wpływu na resztę systemu. Hot code reload pozwala na deploy bez downtime’u. Supervisory trees automatycznie zarządzają cyklem życia komponentów.
W świecie, w którym „five nines” (99.999% uptime) to standard w telekomunikacji, Erlang udowodnił, że jego podejście działa. I to nie w laboratorium — w produkcji, pod obciążeniem, przez dekady.
Krótka historia i ewolucja
Erlang narodził się w 1986 roku w laboratorium Ericsson Computer Science Laboratory w Szwecji. Twórcami byli Joe Armstrong, Robert Virding i Mike Williams. Cel był prosty i ambitny jednocześnie: stworzyć język do programowania central telefonicznych, które muszą działać non-stop, obsługiwać miliony połączeń i nigdy, przenigdy się nie zawieszać.
Nazwa pochodzi od duńskiego matematyka i inżyniera Agnera Krarupa Erlanga, pioniera teorii kolejek — dziedziny matematyki fundamentalnej dla telekomunikacji. Pierwszy duży system napisany w Erlangu to AXD301, switch ATM Ericssona, który osiągnął legendarną dostępność rzędu 99.9999999% (tzw. „nine nines”).
W 1998 roku Ericsson otworzył Erlanga jako open source, co było punktem zwrotnym. W 2007 roku powstał projekt Elixir José Valima, który przyniósł maszynie wirtualnej Erlanga (BEAM) nowoczesną składnię i tooling, przyciągając nową generację programistów. Dziś Erlang i Elixir współdzielą ekosystem BEAM i wzajemnie się napędzają.
Kluczowe cechy i filozofia
Procesy to fundamentalna jednostka w Erlangu. Każdy proces jest lekki (kilkaset bajtów pamięci), izolowany i komunikuje się z innymi przez przesyłanie wiadomości (message passing). Nie ma współdzielonej pamięci, nie ma mutexów, nie ma race conditions w tradycyjnym sensie. Model ten, znany jako Actor Model, jest sercem Erlanga.
Let it crash to filozofia, która brzmi kontraintuicyjnie: zamiast pisać defensywny kod, który próbuje obsłużyć każdy błąd, pozwól procesom padać i pozwól supervisorom je restartować. To prowadzi do czystszego kodu i paradoksalnie bardziej niezawodnych systemów. Supervisory trees — hierarchiczne struktury nadzoru — to jeden z najpotężniejszych wzorców w Erlangu.
Pattern matching jest wszechobecny. Używa się go do destrukcji danych, do routowania wiadomości, do warunkowych wyrażeń. Składnia Erlanga jest tu minimalistyczna i konsekwentna.
Hot code loading pozwala na podmianę kodu w działającym systemie bez restartu. W telekomunikacji, gdzie downtime kosztuje miliony, to nie jest luksus — to konieczność. Erlang obsługuje to natywnie, z mechanizmem dwóch wersji kodu (old i current).
Typowanie w Erlangu jest dynamiczne, ale istnieje narzędzie Dialyzer — statyczny analizator oparty na typach sukcesu (success types), który potrafi wykryć pewne klasy błędów bez annotacji typów. Opcjonalnie można dodawać specyfikacje typów (-spec), które Dialyzer wykorzystuje do dokładniejszej analizy.
Gdzie Erlang sprawdza się najlepiej
Erlang dominuje w systemach wymagających wysokiej dostępności i współbieżności. Telekomunikacja to jego kolebka — Ericsson, Nokia i inni używają go do switchów i bram. Messaging to kolejny naturalny dom: WhatsApp obsługuje miliardy wiadomości na klastrze Erlanga, a RabbitMQ (broker wiadomości) jest napisany w Erlangu.
Gaming to rosnący sektor — backend do gier multiplayer, matchmaking, serwery czatu. Fintech też sięga po Erlanga do systemów transakcyjnych, gdzie niezawodność jest krytyczna. Discord, choć napisany głównie w Elixirze, działa na maszynie BEAM i korzysta z tych samych mechanizmów współbieżności.
IoT i embedded to nisza, w której Erlang (szczególnie przez framework Nerves) zyskuje popularność do zarządzania flotami urządzeń.
Jak wygląda kod w Erlang
Klasyczny serwer gen_server w Erlangu:
-module(counter).
-behaviour(gen_server).
-export([start_link/0, increment/0, get/0]).
-export([init/1, handle_call/3, handle_cast/2]).
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, 0, []).
increment() ->
gen_server:cast(?MODULE, increment).
get() ->
gen_server:call(?MODULE, get).
init(Initial) ->
{ok, Initial}.
handle_call(get, _From, State) ->
{reply, State, State}.
handle_cast(increment, State) ->
{noreply, State + 1}.
To jest wzorzec, który w Erlangu używa się nieustannie: gen_server z callbackami. Stan jest przechowywany w procesie, komunikacja odbywa się przez call (synchroniczna) i cast (asynchroniczna). Proste, przewidywalne, niezawodne.
A oto prostszy przykład — quicksort:
qsort([]) -> [];
qsort([Pivot|Rest]) ->
qsort([X || X <- Rest, X < Pivot])
++ [Pivot] ++
qsort([X || X <- Rest, X >= Pivot]).
List comprehension z filtrem — czytelne i eleganckie, mimo że nie jest to najwydajniejsza implementacja quicksort.
Ekosystem i narzędzia
OTP (Open Telecom Platform) to standardowa biblioteka i framework Erlanga — zawiera genserver, genstatem, supervisor, Mnesia (rozproszona baza danych), i wiele więcej. OTP to nie dodatek — to integralna część tego, czym jest Erlang.
Rebar3 to standardowy build tool i menedżer pakietów. Hex.pm to repozytorium pakietów współdzielone z ekosystemem Elixir. Observer to wbudowane GUI do monitorowania działających systemów Erlanga — procesy, pamięć, kolejki wiadomości, wszystko w czasie rzeczywistym.
Maszyna wirtualna BEAM jest sama w sobie arcydziełem inżynierii — preemptive scheduling dla procesów Erlanga, per-process garbage collection, efektywne zarządzanie pamięcią. BEAM jest współdzielona z Elixirem, co daje dostęp do rosnącego ekosystemu obu języków.
Dla IDE: IntelliJ ma plugin Erlang, VS Code ma Erlang LS (Language Server Protocol), a Emacs z erlang-mode to klasyk.
Mocne i słabe strony
Erlang jest bezkonkurencyjny w budowaniu współbieżnych, odpornych na awarie systemów rozproszonych. Model aktorów, supervisory trees i hot code reload to kombinacja, której żaden inny język nie oferuje w tak dojrzałej formie. BEAM to jedna z najlepszych maszyn wirtualnych na świecie.
Ale Erlang ma swoje wady. Składnia jest… specyficzna. Pochodzi z lat 80. i to widać — prologi, kropki na końcu wyrażeń, wielkie litery dla zmiennych. Dla programistów przyzwyczajonych do nowoczesnych języków, Erlang może wyglądać archaicznie. Brak łańcuchów znaków (strings to listy integerów, chyba że używacie binary strings z <<"...">>) to częsty ból.
Wydajność obliczeniowa (CPU-bound tasks) nie jest mocną stroną Erlanga. BEAM jest zoptymalizowana pod współbieżność i I/O, nie pod crunching liczb. Do obliczeń numerycznych używa się NIF-ów (Native Implemented Functions) w C, ale to komplikuje deployment.
Podsumowanie
Erlang to język dla tych, którzy budują systemy, które nie mogą paść. Jeśli pracujecie nad backendem, messagingiem, systemami rozproszonymi albo IoT — Erlang (lub Elixir na BEAM) powinien być w waszym toolboxie. Nie musi być waszym głównym językiem, ale jego filozofia „let it crash” i model aktorów zmienią sposób, w jaki myślicie o projektowaniu systemów.
Przyszłość Erlanga jest stabilna — BEAM nie znika, Elixir przyciąga nowych użytkowników, a zapotrzebowanie na niezawodne systemy rozproszone tylko rośnie. Erlang może nie jest sexy, ale jest solidny jak skała. I w sumie o to chodzi.

