Erlang jest wszędzie
Erlang jest językiem programowania uznawanym współcześnie za rzadki - nie może równać się popularnością z C, C++, Javą, Pythonem, Perlem, czy nawet bashem. Dlatego też niektóre firmy unikają korzystania z tego języka, ponieważ obawiają się problemów kadrowych związanych z brakiem programistów Erlanga.
Jest to dla mnie bardzo dziwna praktyka, biorąc pod uwagę, ile współczesnego świata zależy od kodu napisanego właśnie w tym języku. Erlang słynie ze swojej niezawodności i zdolności do tworzenia systemów czasu rzeczywistego o bardzo wysokiej skalowalności oraz tolerancji na błędy. Ponad połowa światowego ruchu telefonii komórkowej przechodzi przez węzły programowane w Erlangu. Język ten łączy ludzi nie tylko głosowo; bardzo wiele ogólnoświatowych usług czatowych wykorzystuje Erlanga i język bazujący na nim - Elixira - do przekazywania i rozsyłania wiadomości i powiadomień. Te same języki wykorzystywane są w branży gier komputerowych do podobnych celów - wydajnego i stabilnego przekazywania informacji między wieloma systemami i użytkownikami.
Erlang od 1998 roku rozwijany jest jako wolne oprogramowanie i na ten rok przypada dwudziesta rocznica tego faktu. Mimo tego, że nie jest językiem widowiskowym, (stosowany jest głównie na backendzie i w zastosowaniach serwerowych) zdążył odcisnąć bardzo mocny ślad na całym świecie. Do tego stopnia, że zdecydowana większość z nas na co dzień korzysta z systemów, w których jest stosowany.
Joe Armstrong - twórca Erlanga o historii języka
Cechy języka
Erlang jest językiem wyjątkowym ze względu na swoją filozofię, łączącą programowanie funkcyjne w obrębie pojedynczych funkcji i modułów oraz oparcie współpracy między modułami na współbieżności. Ten sposób skonstruowania języka jest bezpośrednią przyczyną tego, że jest on w dzisiejszych czasach tak szeroko stosowany. Jeden z jego autorów, Joe Armstrong, zawarł filozofię Erlanga w serii zasad, które znajdują się w jego pracy doktorskiej. Tłumaczenie reguł z tej listy oraz ich wyjaśnienie, zamieszczam poniżej.
Wszystko jest procesem
Jest to parafraza pryncypium zorientowanego obiektowo, które mówi: wszystko jest obiektem. Tak rozumianym „obiektem” w Erlangu jest proces, czyli coś, co jest tworzone na podstawie funkcji, może wykonywać kod zawarty w tej funkcji, odbierać wiadomości ze skrzynki pocztowej przypisanej do siebie, oraz wysyłać wiadomości do skrzynek innych procesów.
Procesy są od siebie wyizolowane
Coś, co dzieje się na jednym, w żaden sposób nie wpływa na działanie pozostałych. Oznacza to w szczególności, że zakończenie, błąd lub zniszczenie jednego procesu w żaden sposób nie wpływa na pozostałe, pracujące na danej maszynie, bądź w danej sieci. Wyjątkami od tej reguły są oczywiście wysyłanie wiadomości oraz tzw. efekty uboczne, czyli interakcje, które proces może wykonać ze światem zewnętrznym. Przykładem może być zapisanie pliku na dysk czy ruch sieciowy z zewnętrznymi usługami.
Procesy nie współdzielą zasobów
Jak mówi programistyczne porzekadło: współdzielony mutowalny stan jest źródłem wszelkiego zła. Błędy wynikające ze źle zaprojektowanego programowania współbieżnego, jak choćby hazardy logiczne, kosztowały nas miliony dolarów, niezliczoną ilość czasu i nerwów, oraz, niestety, życia.
Erlang podchodzi do tego problemu w bardzo ostry sposób - współdzielenie stanu między dwoma różnymi procesami jest zabronione. Tak, jak w językach czysto funkcyjnych, wszystkie dane są w Erlangu niezmienialne.
Od tej zasady również są w Erlangu odstępstwa, ale ich stosowanie jest zalecane wyłącznie dla osób, które znają i praktykują tę zasadę na tyle długo, by być w stanie ją łamać.
Komunikacja między procesami odbywa się wyłącznie przez wiadomości
Z racji tego, że procesy nie współdzielą w żadnym momencie stanu, komunikacja między nimi musi przebiegać explicite. Głównym mechanizmem komunikacji są wiadomości, w których można przesyłać dane: symboliczne, liczbowe, binarne, tekst oraz kod do wykonania.
Warto dodać, że komunikacja w Erlangu nie musi obejmować procesów wyłącznie na jednej maszynie. Komputery mogą być połączone w sieć, a wiadomości mogą być przekazywane między procesami na różnych komputerach.
Procesy mają niepowtarzalne nazwy + Jeśli znasz jego, to możesz wysłać mu wiadomość
Dwa powyższe punkty są połączone. Każdy proces ma unikatowy dla siebie i niepowtarzalny w obrębie całej sieci erlangowej identyfikator. Służy on za adres, pod którym nasłuchuje on na wiadomości. Każdy, kto zna nazwę dowolnego procesu, może do tego procesu wysłać wiadomość.
Tworzenie i niszczenie procesów jest tanie
W odróżnieniu od procesów znanych ze współczesnych systemów operacyjnych, te erlangowe są lekkie. Tworzenie, niszczenie oraz przenoszenie się procesora między procesami nie zajmuje wiele czasu ani mocy obliczeniowej, wskutek czego w Erlangu wskazane jest tworzenie i niszczenie ich praktycznie bez ograniczeń, w miarę potrzeb programisty.
Obsługa błędów jest nielokalna + Proces albo robi dokładnie to, co powinien, albo umiera
Te dwa punkty filozofii Erlanga są nieoczywiste, jak i nieoczywiste są ich implikacje. Mówią one, że kod logiki pisanej w Erlangu powinien być pisany ofensywnie, bez zwracania większej uwagi na strategie obsługi błędów. Sama ich obsługa powinna być wydelegowana wyżej w hierarchii aplikacji.
W praktyce oznacza to, że procesy w Erlangu mają hierarchię. Każdy z nich ma swojego nadzorcę, który odpowiada za obsługę jego błędów. Jeśli proces zostanie zniszczony z powodu błędu, jego nadzorca może stworzyć go na nowo, zapisać komunikat błędu na dysk, wykonać dodatkowe działania, bądź (np. w wypadku ciągle powtarzającego się błędu) zatrzymać sam siebie wraz ze wszystkimi dziećmi, a następnie poinformować swojego własnego nadrządcę o błędzie.
W ten sposób odpowiedzialność za obsługę błędów w systemie delegowana jest wyżej, a cały system, oparty na hierarchii nadrządców restartujących swoje dzieci, jest odporny na zniszczenie praktycznie dowolnego procesu.
Krzyżówka języka funkcyjnego i obiektowego
Erlang jest bardzo specyficzną krzyżówką języka funkcyjnego i obiektowego. Jest zdecydowanie funkcyjny. Nie pozwala na mutowalny stan ani na współdzielenie zasobów między procesami. Jest też obiektowy, ponieważ pozwala procesom (obiektom), czyli instancjom klas (funkcji), na wymianę wiadomości (wołanie metod). Można powiedzieć, że, patrząc w skali mikroskopowej na pojedyncze funkcje, Erlang jest czysto funkcyjny. Natomiast oddalając się od pojedynczej funkcji i zaczynając patrzeć na moduły, czy też całe systemy, Erlang implementuje system obiektowy najlepiej ze wszystkich obecnych języków według oceny ojca pojęcia object-oriented programming - Alana Kay.
Takie skrzyżowanie paradygmatów, nazywane czasami message-oriented programming, w połączeniu z filozofią języka, oznacza, że Erlang nadaje się do modelowania systemów, w których mamy byty mogące wykonywać jakieś czynności i komunikuje się wyłącznie poprzez przyjmowanie i wysyłanie wiadomości do innych procesów. Każdy z tych bytów może też w dowolnej chwili napotkać błąd i zostać zniszczony, a na jego miejsce „proces-nadzorca” może stworzyć nowy, który praktycznie od razu rozpoczyna działanie. Jak zauważają twórcy języka, tego typu model jest dość dobrym odwzorowaniem mechanizmów rządzących światem rzeczywistym, co zostało potwierdzone licznymi zastosowaniami praktycznymi języka.
Zastosowania Erlanga
Przechodząc do zastosowań Erlanga, ich opisywanie wypadałoby zacząć od miejsca, w którym ten język powstał - czyli od firmy Ericsson. Sam język powstał w 1986 roku. Od początku swojego istnienia był wykorzystywany jako następca języka PLEX, przydatny do programowania central i switchy telefonicznych. Najsłynniejszym produktem Ericsson, w jakim był wykorzystany, to centrala AXD301, którą Ericsson reklamował jako osiągającą niezawodność rzędu 99,9999999% (co oznacza mniej niż sekundę niedostępności usługi w trakcie 20 lat). Jeden z autorów języka, Joe Armstrong, opisał ze szczegółami tę centralę w swojej pracy doktorskiej na temat Erlanga (studium przypadku AXD301 znajduje się tam od strony 167).
centrala AXD301, źródło: Carritech
Współcześnie Erlang jest w dalszym ciągu wykorzystywany w Ericsson. Programuje się w nim zarówno oprogramowanie sprzętu sieciowego (np. switche i routery do obsługi technologii 3G), jak i używa się go do testowania. Choćby zestawy testów do węzłów obsługujących technologię 4G są napisane w Erlangu.
Wykorzystywanie przez producentów sprzętu telekomunikacyjnego
Motorola używa Erlanga w swoich produktach telekomunikacyjnych przeznaczonych do stosowania w bezpieczeństwie publicznym. Nokia stworzyła bazujący na Erlangu framework Disco, służący do obliczeń rozproszonych na klastrach komputerowych. Firma Cisco używa Erlanga w programowaniu sieci intuicyjnych, które polegają na automatycznej rekonfiguracji urządzeń sieciowych, w zależności od tego, do czego są w danym momencie wykorzystywane. Corelatus wykorzystuje go w produkowanym przez siebie sprzęcie telefonicznym.
Wykorzystywanie przez operatorów telekomunikacyjnych
Brytyjski operator EE wykorzystuje go do zarządzania połączeniami. Usługi SMS oraz autentykacji u operatora T-Mobile są zaprogramowane w Erlangu. Firma 2600Hz używa go w swoich usługach VoIP, które bazują na stworzonym przez nich frameworku Kazoo. Mobile Arts używa go w technologii dostarczanej operatorom telekomunikacyjnym. Erlanga używają również IDT, Mitel, Telia, Vail Systems i Wavenet.
Wykorzystywanie w komunikacji internetowej
Przykładem jest serwer XMPP/Jabber, ejabberd, którego obsługę komercyjną zapewnia firma ProcessOne. Serwer ten został wykorzystany komercyjnie przez firmę WhatsApp do swoich czatów tekstowych i głosowych. Firma Yahoo skorzystała z Erlanga do napisania narzędzia Harvester, używanego wewnętrznie do automatycznego pobierania danych z wielu miejsc w sieci po wielu protokołach.
Wykorzystywanie do programowania serwerów gier
Gry z serii Call of Duty, licząc od czwartej części, wykorzystują Erlanga między innymi do utrzymywania dużej ilości równoczesnych połączeń i wywoływania modułów napisanych w innych językach. Do przekazywania wiadomości Erlanga używa Riot Games, producent znanej gry League of Legends, oraz Wooga, producent przeglądarkowych gier MMO. Gra Battlestar Galactica Online również korzysta z Erlanga na swoich serwerach.
Wykorzystywanie na innych polach
Z Erlanga korzysta Bluetab (usługodawca zarządzania danymi), Klarna (szwedzki bank i operator płatności elektronicznych), Lindenbaum (firma obsługująca tele- i wideokonferencje do tysiąca uczestników), wykorzystywany jest do marketingu cyfrowego oraz internetowych platform aukcyjnych, korzystając z niego Gambit Research i SMarkets (operatorzy realizujący sportowe zakłady wzajemne), Quviq (automatyczny generator testów), Heroku (platforma do budowania aplikacji w chmurze, która też wydała książkę o stosowaniu Erlanga w praktyce!), serwis randkowy Grindr, a nawet bank Goldman Sachs w swoim systemie handlowym wysokiej częstotliwości.
Na Erlangu bazują systemy do przekazywania wiadomości jak na przykład RabbitMQ, dokumentowe bazy danych, jak CouchDB, Riak, czy Amazon SimpleDB. Moduły klastrujące oraz dystrybuujące bazy danych CouchBase są również napisane w Erlangu.
Erlang jest językiem nacechowanym na bycie mało widzialnym dla końcowego użytkownika. Budowane na nim aplikacje są stabilne, a obliczenia rozpraszane na wiele połączonych w sieć węzłów. W takim układzie zaskakującym zastosowaniem języka jest Wings3D, czyli oprogramowanie desktopowe do modelowania obiektów trójwymiarowych.
Powyższa lista nie wyczerpuje oczywiście wszystkich firm i zastosowań Erlanga. Zainteresowanym większą ilością informacji polecam stronę Erlang Companies.
Niedogodności Erlanga a Elixir
Erlang, jak każdy język, ma swoje wady: bardzo specyficzną składnię, sięgającą korzeniami języka Prolog, stringi są w nim domyślnie reprezentowane jako listy liczb - kodów poszczególnych znaków i o ile błędy poszczególnych procesów są w Erlangu obsługiwane gładko, o tyle treść komunikatów o błędach i komfort ich debugowania pozostawiają nieco do życzenia.
Te niedogodności usiłuje naprawić język Elixir, będący czymś więcej, niż rozszerzeniem Erlanga. Jest to osobny język programowania, umiejący współpracować z modułami erlangowymi i wykonywany na tej samej maszynie wirtualnej BEAM. Elixir jest również wykorzystywany na wiele interesujących sposobów. Jednak o nim można mówić na tyle dużo, że warto poświęcić na to osobny artykuł.
Podsumowanie
Erlang przeszedł długą drogę od niszowego języka stosowanego w telekomunikacji do języka, na którym stoją fundamenty wielu usług i biznesów. Wiele ważnych i ciekawych projektów obecnie zależy od Erlanga i języków bazujących na nim. Stąd pochodzi mój wniosek, że inwestycja w jego naukę może się porządnie opłacić - zarówno, jeśli chodzi o jego użyteczność dla pracodawców, jak i o poszerzenie osobistych horyzontów i skorzystanie ze stabilności, wydajnego przekazywania wiadomości oraz odporności na błędy, jakie zapewnia filozofia Erlanga.
O autorze:
Michał Herda pracuje jako programista w Ericsson. Żywo interesuje się językami programowania, w tym różnymi sposobami na zastosowanie paradygmatów obiektowych, funkcyjnych, oraz rozproszonych.