Erlang — jezyk, ktory trzyma internet w garsci od 30 lat

Definicja pojęcia Erlang — jezyk, ktory trzyma internet w garsci od 30 lat

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.

Pozostałe definicje

Erlang to funkcyjny jezyk do budowy rozproszonych, wspolbieznych i odpornych na awarie systemow. WhatsApp, Discord i RabbitMQ polegaja na Erlangu.
Scroll to Top
Framework
Języki Programowania
Stanowisko
Co to jest