Scott Tiger Tech Blog

Blog technologiczny firmy Scott Tiger S.A.

Elixir

Autor: Piotr Karpiuk o wtorek 3. Marzec 2020

Otwartoźródłowy język programowania Elixir można, mocno upraszczając, potraktować jak zestaw makr tworzących lukier syntaktyczny nad składnią Erlanga (uwaga: chodzi o makra w stylu Lispa działające na drzewie składni AST, a nie makra tekstowe jak w C). Program Elixira może korzystać z bibliotek Erlanga i jest kompilowany do bajtkodu wykonywanego na maszynie wirtualnej BEAM Erlanga. Wszystko co da się zrobić w Erlangu, można wykonać w Eliksirze i na odwrót. W pewnym sensie Elixir ma się do Erlanga tak jak Kotlin/Scala/Groovy/Clojure do Javy/JVM czy F# do C#/.NET.

Elixir czyni programowanie w Erlangu znacznie bardziej przystępnym dla przeciętnego programisty. W związku z tym pytanie dlaczego ktoś miałby chcieć programować w Eliksirze na dobrą sprawę sprowadza się do pytania dlaczego w dzisiejszych czasach ktoś mógłby chcieć używać technologii z lat 80-tych ubiegłego tysiąclecia, takiej jak Erlang.

Cóż, okazuje się że czasy Internetu, serwisów społecznościowych i chmur obliczeniowych bardzo sprzyjają rozpowszechnieniu Erlanga. W czasach gdy ten język powstawał, w powszechnym użyciu królowały aplikacje desktopowe z interfejsem użytkownika, takie jak MS Excel czy MS Word. Erlang jako język programowania współbieżnego będący w stanie elegancko wykorzystać wiele rdzeni procesora i klastry maszyn miał zastosowanie początkowo w zasadzie tylko w telekomunikacji (firma Ericsson). Dziś zapotrzebowanie na stabilne, wydajne i skalowalne usługi serwerowe będące w stanie obsługiwać miliony połączeń klienckich jednocześnie jest już powszechne. Stąd też znajdziemy Erlanga w serwerach WhatsAppa, rozproszonej bazie danych Riak, usłudze chmurowej Heroku, systemie automatyzacji Chef, kolejce komunikatów RabbitMQ czy w systemach finansowych i serwerach gier sieciowych, ale też w aplikacjach biurowych czy systemach wbudowanych.

Spełnianie wyśrubowanych wymogów standardów telekomunikacyjnych i długi czas dojrzewania technologii przekładają się na cechy funkcjonalne bardzo pożądane na dzisiejszym rynku:

  • Krótki czas reakcji niezależnie od liczby podłączonych klientów. Na jednej maszynie wirtualnej Erlanga działa zwykle jeden proces OS, w jego ramach zaś kilka wątków OS i potencjalnie nawet miliony tzw. procesów Erlanga (zwanych dalej eprocesami, można je przyrównać do gorutyn w języku Go). Eprocesy nie współdzielą pamięci RAM i porozumiewają się między sobą za pomocą asynchronicznych komunikatów. Dzięki temu sprzątanie pamięci po takich obiektach nie jest czasochłonne i nie wymaga wstrzymywania całego systemu (jeden rdzeń CPU może błyskawicznie przeprowadzić operację czyszczenia pamięci gdy tymczasem pozostałe są zajęte standardowym przetwarzaniem). Operacje I/O są wewnętrznie delegowane do osobnych wątków lub – jeżeli jest dostępna – do odpowiedniej usługi w systemie operacyjnym; w rezultacie żaden eproces oczekujący na zakończenie operacji I/O nie blokuje wykonania innych eprocesów.
  • Błąd w obsłudze jednego połączenia ma minimalny wpływ na cały system. Znowu, pomaga w tym architektura całkowitej niezależności eprocesów od siebie.
  • Aktualizacja w czasie rzeczywistym. Z założenia taki system nie powinien przestawać działać nigdy, nawet aktualizacja oprogramowania czy rozszerzanie klastra o dodatkowe maszyny nie powinna zrywać istniejących połączeń klienckich a tym bardziej wymuszać restart systemu
  • Skalowalność i rozproszenie. Ponieważ jedynym sposobem na komunikację międzyprocesową są komunikaty asynchroniczne, nie istnieją złożone mechanizmy takie jak blokady, czy semafory, co upraszcza programowanie. Co więcej, komunikacja między eprocesami zachodzi tak samo niezależnie od tego, czy eprocesy działają na tej samej instancji maszyny wirtualnej BEAM, czy na dwóch różnych maszynach. Bardzo ułatwia to rozpraszanie systemu w klastrze maszyn.

Erlang to nie tylko język programowania, ale rozbudowana platforma programistyczna, w skład której wchodzą

  • Język,
  • Maszyna wirtualna,
  • Framework OTP (Open Telecom Platform) – udostępnia abstrakcje na typowe zadania takie jak wzorce współbieżności i rozproszenia, wykrywanie i usuwanie błędów w systemach współbieżnych, pakowanie kodu do bibliotek, wdrażanie systemów czy aktualizacja w czasie rzeczywistym
  • Narzędzia, np. do kompilowania kodu, tworzenia paczek do wdrożeń, obsługi interaktywnej powłoki itp.

Zarówno Erlang, jak i Elixir są językami cały czas wspieranymi a kod źródłowy jest dostępny na GitHubie. Procesem produkcji Erlanga nadal zarządza firma Ericsson i wypuszcza regularnie nową wersję języka co roku.

Wady

Programy Erlanga są wykonywane na maszynie wirtualnej BEAM, przez co nie są w stanie osiągnąć prędkości języków kompilowanych maszynowo, takich jak C/C++. Celem platformy nie jest jednak wyciśnięcie jak największej liczby żądań na sekundę, ale utrzymanie wydajności na przewidywanym poziomie (np. system nie spowalnia wyraźnie po włączeniu się odśmiecania pamięci). Erlang idealnie nadaje się do tworzenia systemów odpornych na błędy, które mogą działać bardzo długo bez żadnych przestojów. Jest to zarazem duże wyzwanie i aspekt, na którym skupia się platforma Erlanga.

Kolejną wadą jest ilość bibliotek, których jest znacząco mniej niż w wielu współczesnych językach programowania. W GitHubie jest blisko 5 mln projektów Javy, ale ledwie 20 tys. projektów Erlanga i ok. 40 tys. Eliksira. Powoduje to, że możesz spędzić więcej czasu nad czymś, co w przypadku innych języków trwa kilka minut. Można się spotkać z żartobliwym powiedzeniem, że Erlang czyni rzeczy trudne prostymi i komplikuje rzeczy proste.

Literatura

Elixir w akcji, Saša Jurić, 2020

Share and Enjoy:
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • Śledzik
  • Blip
  • Blogger.com
  • Gadu-Gadu Live
  • LinkedIn
  • MySpace
  • Wykop

Zostaw komentarz

XHTML: Możesz użyć następujących tagów: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>