Język programowania Erlang

Przegląd

Erlang to język programowania funkcyjnego zaprojektowany do budowy skalowalnych i odpornych na błędy systemów, szczególnie w dziedzinie aplikacji współbieżnych i rozproszonych. Został pierwotnie opracowany przez firmę Ericsson pod koniec lat 80. XX wieku w celu stworzenia solidnych systemów telekomunikacyjnych. Unikalne cechy Erlanga obejmują wsparcie dla lekkich procesów, współbieżność opartą na przesyłaniu wiadomości, gorące przełączanie kodu oraz silny nacisk na niezawodność. Dziś jest szeroko stosowany w branżach wymagających wysokiej dostępności i systemów rozproszonych, takich jak telekomunikacja, aplikacje do przesyłania wiadomości i systemy baz danych.

Aspekty historyczne

Tworzenie i początkowy rozwój

Erlang został stworzony pod koniec lat 80. XX wieku przez Joe Armstronga, Roberta Virdinga i Mike'a Williamsa w firmie Ericsson, głównie w celu zaspokojenia potrzeb przemysłu telekomunikacyjnego. Język został opracowany, aby ułatwić budowę dużych, odpornych na błędy systemów, które mogłyby jednocześnie zarządzać wieloma połączeniami i rozmowami.

Ewolucja w kierunku open source

Na początku lat 90. XX wieku firma Ericsson dostrzegła potencjał Erlanga poza telekomunikacją. W 1998 roku Erlang został wydany jako open source, co pozwoliło szerszej społeczności programistów przyczynić się do jego rozwoju. Ruch open-source doprowadził do opracowania maszyny wirtualnej BEAM, która wykonuje kod Erlanga i od tego czasu ewoluowała, aby wspierać inne języki.

Stan obecny

Erlang jest obecnie utrzymywany przez zespół Erlang/OTP i ma dedykowaną społeczność. Cykl wydania Erlanga stał się bardziej regularny, z regularnymi aktualizacjami i ulepszeniami skoncentrowanymi na wydajności, nowych funkcjach i ulepszonej dokumentacji. Język zainspirował również rozwój Elixira, nowoczesnego języka programowania, który działa na maszynie wirtualnej Erlanga i wprowadza wiele jego zasad, jednocześnie oferując dodatkowe funkcje.

Cechy składniowe

Paradygmat programowania funkcyjnego

Erlang jest przede wszystkim językiem funkcyjnym, co oznacza, że funkcje są obywatelami pierwszej klasy i mogą być przekazywane jak zmienne.

double(X) -> X * 2.

Lekkie procesy

Lekkie procesy Erlanga umożliwiają tworzenie tysięcy współbieżnych procesów bez znaczącego narzutu.

spawn(fun() -> io:format("Witaj z procesu!~n") end).

Przesyłanie wiadomości

Procesy w Erlangu komunikują się za pomocą przesyłania wiadomości, co pozwala na bezpieczną komunikację bez współdzielonego stanu.

Pid = spawn(fun() -> receive
                      {msg, Content} -> io:format("Odebrano: ~s~n", [Content])
                  end end),
Pid ! {msg, "Cześć!"}.

Dopasowywanie wzorców

Erlang wykorzystuje dopasowywanie wzorców, potężną cechę, która pozwala na jasny i zwięzły kod.

match(X) when X > 0 -> io:format("Liczba dodatnia: ~B~n", [X]);
match(X) -> io:format("Liczba niedodatnia: ~B~n", [X]).

Odporność na błędy

Erlang wspiera odporność na błędy poprzez swoją filozofię "niech się zawali", pozwalając procesom na awarię i ponowne uruchomienie bez wpływu na system.

start_process() ->
    spawn(fun() -> crash() end).

Gorące przełączanie kodu

Erlang pozwala programistom na zmianę kodu w działających systemach bez ich zatrzymywania.

%% Stara wersja
-module(example).
-export([hello/0]).
hello() -> io:format("Stara wersja~n").

%% Nowa wersja
-module(example).
-export([hello/0]).
hello() -> io:format("Nowa wersja~n").

Niemutowalność

Dane w Erlangu są niemutowalne, co prowadzi do mniejszej liczby błędów i łatwiejszego rozumienia kodu.

List = [1, 2, 3],
NewList = [4 | List].

Wbudowane wsparcie dla rozproszenia

Erlang ma funkcje, które umożliwiają łatwe rozprzestrzenianie procesów na różnych węzłach.

net_adm:start() -> 
  net_adm:ping('other_node@hostname').

Typy rekordów

Erlang wspiera typy rekordów do tworzenia złożonych typów danych.

-record(person, {name, age}).
Person = #person{name="Alice", age=30}.

Zrozumienia list

Erlang pozwala na zrozumienia list, aby generować i manipulować listami w sposób zwięzły.

Squares = [X*X || X <- [1,2,3]].

Narzędzia dla programistów, środowiska uruchomieniowe i IDE

Środowiska uruchomieniowe

Erlang jest wykonywany na maszynie wirtualnej BEAM, która jest zaprojektowana do uruchamiania aplikacji współbieżnych i odpornych na błędy. BEAM optymalizuje wydajność i pozwala na funkcje takie jak gorące przełączanie kodu.

Popularne IDE

Istnieje kilka środowisk programistycznych dla Erlanga, z Emacsem i IntelliJ IDEA (z wtyczką Erlang) wśród najpopularniejszych. Inne godne uwagi narzędzia to edytory specyficzne dla Erlanga, takie jak Erlide.

Tworzenie projektu

Aby stworzyć projekt Erlang, tradycyjnie używa się narzędzia rebar3, które zarządza zależnościami i kompilacjami. Na przykład, aby stworzyć nowy projekt, należy wykonać:

rebar3 new app myapp

Następnie można zbudować projekt za pomocą:

rebar3 compile

Zastosowania Erlanga

Erlang jest szeroko stosowany w telekomunikacji, systemach przesyłania wiadomości i aplikacjach czasu rzeczywistego. Do znanych aplikacji należą:

Porównanie z podobnymi językami

Główne mocne strony Erlanga leżą w jego modelu współbieżności i odporności na błędy, co odróżnia go od języków takich jak:

Wskazówki dotyczące tłumaczenia kodu źródłowego

Tłumaczenie kodu do i z Erlanga może być skomplikowane z powodu jego unikalnych paradygmatów. Istnieją narzędzia takie jak erl2cpp do niektórych tłumaczeń, ale nie ma powszechnie dostępnego zautomatyzowanego narzędzia dla wszystkich języków. Ręczne tłumaczenie może obejmować: