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").
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
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:
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
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