2. 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 :)
3. 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
4. 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.
5. Pierwsze kroki – Hello World
-module(hello).
-export([hello_world/0]).
hello_world() ->
io:format("Hello World!~n").
6. Podstawy – struktura modułów
Pliki z kodem: .erl
– Dyrektywa export
– Dyrektywa import
Pliki nagłówkowe: .hrl
– Dyrektywa include
Kompilacja: .erl .beam→
Escript – interpretowane skrypty
7. 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
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 – 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)
12. 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.
13. 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.
14. 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).
15. 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
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 – 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,
...
18. 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:
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
29. 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