BIWAK - Erlang
Michał Ptaszek
26.11.2008
O czym dzisiaj?
Czym jest Erlang?
Pierwsze kroki - składnia
Współbieżność/rozproszenie/fault tolerance...
Gdzie można spotkać?
… a to wszystko z przykładami :)
Erlang – a co to takiego?
 Agner Krarup Erlang –
matematyk duński, zajmował
się głównie teorią kolejek I
teorią ruchu
telekomunikacyjnego
 1986 – Ericsson OTP team
tworzy pierwszą wersję języka
Erlang
 1998 – otwarcie kodu
 5.11.2008 - R12B5 – najnowsza
wersja
init:start()
Erlang jest to funkcyjny język programowania, przeznaczony
głównie do budowy systemów współbieżnych i rozproszonych.
Spośród rzeszy innych języków programowania wyróżniają go
m.in. dynamiczna wymiana kodu (hot swapping), odporność na
błędy (fault tolerance) czy prostota w tworzeniu I zarządzaniu
procesami.
Pierwsze kroki – Hello World
-module(hello).
-export([hello_world/0]).
hello_world() ->
io:format("Hello World!~n").
Podstawy – struktura modułów
Pliki z kodem: .erl
– Dyrektywa export
– Dyrektywa import
Pliki nagłówkowe: .hrl
– Dyrektywa include
Kompilacja: .erl .beam→
Escript – interpretowane skrypty
Podstawy – kompilacja i uruchomienie
Kompilator: erlc
Shell: erl
Dwa tryby uruchomieniowe:
– Interactive mode
• Przydatny podczas debugowania, wczesnych faz rozwoju prac nad
systemem
– Embedded mode
• Przeznaczony dla zainstalowanych systemów
• Cały kod ładowany jest podczas startu systemu
Podstawy – składnia
Zmienne
Integer/Float
Atomy
Listy
Tuple
Binarki
Pid/porty
Funkcje
Podstawy – składnia - zmienne/atomy/tuple
Zmienne:
– Nazwy zaczynają się z wielkiej litery
– Pojedyncze przypisanie – raz przypisanej zmiennej nie można już
zmienić
Atomy:
– Nazwy zaczynają się z małej litery
– Idealne do przekazywania stałych wartości
– W VM reprezentowane przez integery
– list_to_atom, atom_to_list
 Tuple:
– Idealne do przekazywania zwracanych wartości
– Posiadają określoną długość
– Elementami mogą być dowolne typy
Podstawy – składnia - listy
Składają się z głowy i z ogona – też listy
– Znak oddzielający: |
– [pierwszy | [drugi | [trzeci | []]]] == [pierwszy, drugi, trzeci]
 Możliwe konwersje:
– List atom
– List tuple
– List binary
W Erlangu string == lista liter == lista intów
– „erlang” == [$e, $r, $l, $a, $n, $g] == [101, 114, 108, 97, 110, 103]
Pozwalają na bardzo wygodną iterację
Podstawy – konstrukcje językowe
Operatory
– Wszystkie podstawowe: >, <, >=, =<, ==, ...
BIF – Built In Functions
– Część języka
– Nie wymagają wyspecyfikowania modułu (autoimport)
– Pozwalają na:
• Konwersję pomiędzy typami (np. list_to_atom)
• Sprawdzanie typów (np. is_atom)
• Podstawowe operacje matematyczne (np. abs)
• Inne (np. spawn, apply, length)
Podstawy – konstrukcje językowe
If
– Testuje prawdziwość klauzul do chwili, gdy znajdzie pierwszą, która ewaluuje
do atomu true
– Dozwolone jedynie korzystanie z Build In Functions (BIF)
– Niedopasowanie do klauzul powoduje wyrzucenie wyjątku
– Najczęstsza ostatnia klauzula: true
if
is_list(Arg) ->
lists:sort(Arg);
is_tuple(Arg) ->
lists:sort(tuple_to_list(Arg));
true ->
{error, bad_arg}
end.
Podstawy – konstrukcje językowe
Case
– Testuje wartość zwracaną przez wyrażenie I próbuje dopasować ją do
kolejnych klauzul
– Niedopasowanie do klauzul powoduje wyrzucenie wyjątku
case dict:find(Key, Dict) of
{ok, Value} ->
Value;
error ->
io:format("Value for key ~p not found!~n", [Key]),
not_found
end.
Podstawy – konstrukcje językowe
 Pattern Matching
– Mechanizm mający na celu sprawdzenie, czy rozpatrzane dane pasują
do odpowiedniego wzorca
– Pozwala w elegancki sposób wyodrębnić poszczególne gałęzie
zachowań programu
– Używany w niemal każdej linijce programu – przypisanie zmiennej to
też pattern matching!
{ok, File} = file:open("test", [read]).
lister([]) ->
io:format("Reached end of the list~n");
lister([Head | Tail]) ->
io:format("Head is now: ~p~n", [Head]),
lister(Tail).
Podstawy – konstrukcje językowe
 Funkcje
– Realizują pewne określone funkcjonalności
– Jednoznacznie identyfikowane na podstawie modułu, nazwy i ilości
argumentów
– Zwracana zostaje wartość ostatniej instrukcji
– Dzięki mechanizmowi pattern matching możliwe jest posiadanie kilku
klauzul tej samej funkcji
 Binary
– Dane binarne odczytane np. z pliku/socketu
– Reference counting
– Zawartość wyspecyfikowana pomiędzy << i >>
– Dziecinnie prosty bit syntax
Podstawy – składnia – zmienne/atomy/tuple
GOOD IDEA
convert_time({week, Weeks}) ->
{day, Weeks*7};
convert_time({day, Days}) ->
{weeks, Days div 7};
convert_time(_Else) ->
{error, bad_type}.
BAD IDEA
convert_time(Type) ->
Result = case Type of
{week, Weeks} ->
Weeks * 7;
{day, Days} ->
Days div 7;
_Else ->
"error, bad type"
end,
Result.
Podstawy – konstrukcje językowe
 Bit syntax
– Pozwala w bardzo wygodny sposób manipulować danymi w postaci
binarnej
decode_header(<<IpVsn:4, HLen:4, SrvcType:8, TotLen:16,
ID:16, Flgs:3, FragOff:13,
TTL:8, Proto:8, HdrChkSum:16,
SrcIP:32,
DestIP:32, RestDgram/binary>>) ->
if
HLen >= 5, 4*HLen =< DgramSize ->
OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN),
<<Opts:OptsLen/binary,Data/binary>> = RestDgram,
...
Podstawy – konstrukcje językowe
 Lists comprehensions
– Matematyczny sposób na wyrażenie listy
– Używamy operatora (pobrany z)←
[{A,B,C} ||
A <- lists:seq(1,N),
B <- lists:seq(1,N),
C <- lists:seq(1,N),
A+B+C =< N,
A*A+B*B == C*C].
 Trójki pitagorejskie:
Podstawy – gdzie jest for?
Myślimy funkcyjnie:
– lists:foreach
– lists:map
– lists:filter
– lists:foldl
– Rekurencja
– Lists comprehensions
BRAK!!!
Podstawy – biblioteka standardowa
I/O:
– Pliki
– Sockety
Struktury danych:
– Drzewa
– Słowniki
– Zbiory
– ETS/DETS
 Aplikacje:
– Mnesia
– Inets
Współbieżność – lekkie procesy
Środowisko – maszyna wirtualna (+ SMP)
Wielkość – 1200 bajtów/proces
Prostota tworzenia
Architektura share nothing
Ilość – do 20 milionów jednocześnie
spawn(io, format, ["Hello World!~n"]).
Współbieżność – komunikacja
Asynchroniczna wymiana komunikatów
– Operator wysyłania wiadomości: !
– Wyrażenie odbioru wiadomości: receive … end
• Odbiór selektywny
• Pattern matching
• Wyrażenie blokujące
Transparentność lokalizacji
Brak potrzeby synchronizacji
Współbieżność – komunikacja
Prosty serwer:
printer() ->
receive
Msg ->
io:format("Received message: ~p~n", [Msg])
end,
printer().
Pid = spawn(my_module, printer, []),
Pid ! "Hello world!".
Dynamiczne ładowanie kodu
Pozwala na modyfikację działającego systemu bez potrzeby jego
zatrzymywania
Przykład?
Skalowalność i odporność na błędy
Skalowalność - jest to cecha systemów komputerowych,
polegająca na zdolności do dalszej rozbudowy, ale także
miniaturyzacji systemu.
System Fault Tolerant (z ang. odporny na problemy) jest
urządzeniem zaprojektowanym i zbudowanym tak, aby móc
pracować nawet w przypadku wystąpienia błędów lub zaistnienia
awarii jego elementów.
(wikipedia.pl)
Skalowalność i odporność na błędy
Dzięki mechanizmowi rozproszonych aplikacji system oparty na
Erlangu może w przypadku awarii węzła odpowiedzialnego za
konkretną aplikację natychmiast przekazać sterowanie do
jednego z węzłów zapasowych
Po usunięciu awarii sterowanie zostaje zwrócone
Zero zmian w kodzie
Trzy linijki w pliku konfiguracyjnym
Skalowalność i odporność na błędy
Architektura typu share nothing oraz transparentność lokalizacji
procesów powodują, iż programy napisane w Erlangu są
faktycznie skalowalne
Przykład: Yaws (Yet Another Web Server) vs. Apache
http://www.sics.se/~joe/apachevsyaws.html
Skalowalność
Erlang behaviours
Zestaw formalizmów mających na celu opisać popularne wzorce
projektowe
Oddzielają części generyczne kodu od części specyficznych
Części generyczne są już zaimplementowane
Programista dostarcza jedynie tzw. callback modules – modułów
odpowiedzialnych za realizację części specyficznych
Erlang behaviours
Najczęściej używane behaviours:
– gen_event
– gen_fsm
– gen_server
– supervisor
– application
 Można definiować własne
Gdzie można spotkać?
ejabberd
Wings 3D
Yaws
Tsung
CouchDB
Facebook
Streamy
Erlang Web
Co dalej?
www.erlang.org
www.trapexit.org
www.planeterlang.com
www.erlang.pl
“Programming Erlang: Software for a Concurrent World” - Joe
Armstrong
ErlLounge
Pytania?
init:stop()
Dziękuję za uwagę :)
A już jutro - Haskell by Tomek Rydzyński!

Erlang

  • 1.
    BIWAK - Erlang MichałPtaszek 26.11.2008
  • 2.
    O czym dzisiaj? Czymjest Erlang? Pierwsze kroki - składnia Współbieżność/rozproszenie/fault tolerance... Gdzie można spotkać? … a to wszystko z przykładami :)
  • 3.
    Erlang – aco to takiego?  Agner Krarup Erlang – matematyk duński, zajmował się głównie teorią kolejek I teorią ruchu telekomunikacyjnego  1986 – Ericsson OTP team tworzy pierwszą wersję języka Erlang  1998 – otwarcie kodu  5.11.2008 - R12B5 – najnowsza wersja
  • 4.
    init:start() Erlang jest tofunkcyjny język programowania, przeznaczony głównie do budowy systemów współbieżnych i rozproszonych. Spośród rzeszy innych języków programowania wyróżniają go m.in. dynamiczna wymiana kodu (hot swapping), odporność na błędy (fault tolerance) czy prostota w tworzeniu I zarządzaniu procesami.
  • 5.
    Pierwsze kroki –Hello World -module(hello). -export([hello_world/0]). hello_world() -> io:format("Hello World!~n").
  • 6.
    Podstawy – strukturamodułów Pliki z kodem: .erl – Dyrektywa export – Dyrektywa import Pliki nagłówkowe: .hrl – Dyrektywa include Kompilacja: .erl .beam→ Escript – interpretowane skrypty
  • 7.
    Podstawy – kompilacjai uruchomienie Kompilator: erlc Shell: erl Dwa tryby uruchomieniowe: – Interactive mode • Przydatny podczas debugowania, wczesnych faz rozwoju prac nad systemem – Embedded mode • Przeznaczony dla zainstalowanych systemów • Cały kod ładowany jest podczas startu systemu
  • 8.
  • 9.
    Podstawy – składnia- zmienne/atomy/tuple Zmienne: – Nazwy zaczynają się z wielkiej litery – Pojedyncze przypisanie – raz przypisanej zmiennej nie można już zmienić Atomy: – Nazwy zaczynają się z małej litery – Idealne do przekazywania stałych wartości – W VM reprezentowane przez integery – list_to_atom, atom_to_list  Tuple: – Idealne do przekazywania zwracanych wartości – Posiadają określoną długość – Elementami mogą być dowolne typy
  • 10.
    Podstawy – składnia- listy Składają się z głowy i z ogona – też listy – Znak oddzielający: | – [pierwszy | [drugi | [trzeci | []]]] == [pierwszy, drugi, trzeci]  Możliwe konwersje: – List atom – List tuple – List binary W Erlangu string == lista liter == lista intów – „erlang” == [$e, $r, $l, $a, $n, $g] == [101, 114, 108, 97, 110, 103] Pozwalają na bardzo wygodną iterację
  • 11.
    Podstawy – konstrukcjejęzykowe Operatory – Wszystkie podstawowe: >, <, >=, =<, ==, ... BIF – Built In Functions – Część języka – Nie wymagają wyspecyfikowania modułu (autoimport) – Pozwalają na: • Konwersję pomiędzy typami (np. list_to_atom) • Sprawdzanie typów (np. is_atom) • Podstawowe operacje matematyczne (np. abs) • Inne (np. spawn, apply, length)
  • 12.
    Podstawy – konstrukcjejęzykowe If – Testuje prawdziwość klauzul do chwili, gdy znajdzie pierwszą, która ewaluuje do atomu true – Dozwolone jedynie korzystanie z Build In Functions (BIF) – Niedopasowanie do klauzul powoduje wyrzucenie wyjątku – Najczęstsza ostatnia klauzula: true if is_list(Arg) -> lists:sort(Arg); is_tuple(Arg) -> lists:sort(tuple_to_list(Arg)); true -> {error, bad_arg} end.
  • 13.
    Podstawy – konstrukcjejęzykowe Case – Testuje wartość zwracaną przez wyrażenie I próbuje dopasować ją do kolejnych klauzul – Niedopasowanie do klauzul powoduje wyrzucenie wyjątku case dict:find(Key, Dict) of {ok, Value} -> Value; error -> io:format("Value for key ~p not found!~n", [Key]), not_found end.
  • 14.
    Podstawy – konstrukcjejęzykowe  Pattern Matching – Mechanizm mający na celu sprawdzenie, czy rozpatrzane dane pasują do odpowiedniego wzorca – Pozwala w elegancki sposób wyodrębnić poszczególne gałęzie zachowań programu – Używany w niemal każdej linijce programu – przypisanie zmiennej to też pattern matching! {ok, File} = file:open("test", [read]). lister([]) -> io:format("Reached end of the list~n"); lister([Head | Tail]) -> io:format("Head is now: ~p~n", [Head]), lister(Tail).
  • 15.
    Podstawy – konstrukcjejęzykowe  Funkcje – Realizują pewne określone funkcjonalności – Jednoznacznie identyfikowane na podstawie modułu, nazwy i ilości argumentów – Zwracana zostaje wartość ostatniej instrukcji – Dzięki mechanizmowi pattern matching możliwe jest posiadanie kilku klauzul tej samej funkcji  Binary – Dane binarne odczytane np. z pliku/socketu – Reference counting – Zawartość wyspecyfikowana pomiędzy << i >> – Dziecinnie prosty bit syntax
  • 16.
    Podstawy – składnia– zmienne/atomy/tuple GOOD IDEA convert_time({week, Weeks}) -> {day, Weeks*7}; convert_time({day, Days}) -> {weeks, Days div 7}; convert_time(_Else) -> {error, bad_type}. BAD IDEA convert_time(Type) -> Result = case Type of {week, Weeks} -> Weeks * 7; {day, Days} -> Days div 7; _Else -> "error, bad type" end, Result.
  • 17.
    Podstawy – konstrukcjejęzykowe  Bit syntax – Pozwala w bardzo wygodny sposób manipulować danymi w postaci binarnej decode_header(<<IpVsn:4, HLen:4, SrvcType:8, TotLen:16, ID:16, Flgs:3, FragOff:13, TTL:8, Proto:8, HdrChkSum:16, SrcIP:32, DestIP:32, RestDgram/binary>>) -> if HLen >= 5, 4*HLen =< DgramSize -> OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN), <<Opts:OptsLen/binary,Data/binary>> = RestDgram, ...
  • 18.
    Podstawy – konstrukcjejęzykowe  Lists comprehensions – Matematyczny sposób na wyrażenie listy – Używamy operatora (pobrany z)← [{A,B,C} || A <- lists:seq(1,N), B <- lists:seq(1,N), C <- lists:seq(1,N), A+B+C =< N, A*A+B*B == C*C].  Trójki pitagorejskie:
  • 19.
    Podstawy – gdziejest for? Myślimy funkcyjnie: – lists:foreach – lists:map – lists:filter – lists:foldl – Rekurencja – Lists comprehensions BRAK!!!
  • 20.
    Podstawy – bibliotekastandardowa I/O: – Pliki – Sockety Struktury danych: – Drzewa – Słowniki – Zbiory – ETS/DETS  Aplikacje: – Mnesia – Inets
  • 21.
    Współbieżność – lekkieprocesy Środowisko – maszyna wirtualna (+ SMP) Wielkość – 1200 bajtów/proces Prostota tworzenia Architektura share nothing Ilość – do 20 milionów jednocześnie spawn(io, format, ["Hello World!~n"]).
  • 22.
    Współbieżność – komunikacja Asynchronicznawymiana komunikatów – Operator wysyłania wiadomości: ! – Wyrażenie odbioru wiadomości: receive … end • Odbiór selektywny • Pattern matching • Wyrażenie blokujące Transparentność lokalizacji Brak potrzeby synchronizacji
  • 23.
    Współbieżność – komunikacja Prostyserwer: printer() -> receive Msg -> io:format("Received message: ~p~n", [Msg]) end, printer(). Pid = spawn(my_module, printer, []), Pid ! "Hello world!".
  • 24.
    Dynamiczne ładowanie kodu Pozwalana modyfikację działającego systemu bez potrzeby jego zatrzymywania Przykład?
  • 25.
    Skalowalność i odpornośćna błędy Skalowalność - jest to cecha systemów komputerowych, polegająca na zdolności do dalszej rozbudowy, ale także miniaturyzacji systemu. System Fault Tolerant (z ang. odporny na problemy) jest urządzeniem zaprojektowanym i zbudowanym tak, aby móc pracować nawet w przypadku wystąpienia błędów lub zaistnienia awarii jego elementów. (wikipedia.pl)
  • 26.
    Skalowalność i odpornośćna błędy Dzięki mechanizmowi rozproszonych aplikacji system oparty na Erlangu może w przypadku awarii węzła odpowiedzialnego za konkretną aplikację natychmiast przekazać sterowanie do jednego z węzłów zapasowych Po usunięciu awarii sterowanie zostaje zwrócone Zero zmian w kodzie Trzy linijki w pliku konfiguracyjnym
  • 27.
    Skalowalność i odpornośćna błędy Architektura typu share nothing oraz transparentność lokalizacji procesów powodują, iż programy napisane w Erlangu są faktycznie skalowalne Przykład: Yaws (Yet Another Web Server) vs. Apache http://www.sics.se/~joe/apachevsyaws.html
  • 28.
  • 29.
    Erlang behaviours Zestaw formalizmówmających na celu opisać popularne wzorce projektowe Oddzielają części generyczne kodu od części specyficznych Części generyczne są już zaimplementowane Programista dostarcza jedynie tzw. callback modules – modułów odpowiedzialnych za realizację części specyficznych
  • 30.
    Erlang behaviours Najczęściej używanebehaviours: – gen_event – gen_fsm – gen_server – supervisor – application  Można definiować własne
  • 31.
    Gdzie można spotkać? ejabberd Wings3D Yaws Tsung CouchDB Facebook Streamy Erlang Web
  • 32.
  • 33.
  • 34.
    init:stop() Dziękuję za uwagę:) A już jutro - Haskell by Tomek Rydzyński!