SlideShare a Scribd company logo
1 of 34
Download to read offline
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!

More Related Content

Similar to Erlang

Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Cloudskraqa
 
Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)adamhmetal
 
Zwiększanie produktywności programisty php
Zwiększanie produktywności programisty phpZwiększanie produktywności programisty php
Zwiększanie produktywności programisty phpadamhmetal
 
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Codesushi.co (CODESUSHI LLC)
 
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz
 
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogoKamil Monticolo
 
Integracja systemow od strony praktycznej
Integracja systemow od strony praktycznejIntegracja systemow od strony praktycznej
Integracja systemow od strony praktycznejMarek Horbań
 
Techniki kompilacji
Techniki kompilacjiTechniki kompilacji
Techniki kompilacjiPiotr B
 
Secure Coding w praktyce.
Secure Coding w praktyce.Secure Coding w praktyce.
Secure Coding w praktyce.Semihalf
 
PSR czyli dobre praktyki programistyczne
PSR czyli dobre praktyki programistycznePSR czyli dobre praktyki programistyczne
PSR czyli dobre praktyki programistyczneAurora Creation
 
TorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachTorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachmarekgoldmann
 
Nie tylko C# - Ekosystem Microsoft dla programistów
Nie tylko C# - Ekosystem Microsoft dla programistówNie tylko C# - Ekosystem Microsoft dla programistów
Nie tylko C# - Ekosystem Microsoft dla programistówintive
 
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETProgramowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETMikołaj Olszewski
 

Similar to Erlang (20)

Python io
Python ioPython io
Python io
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)Zwiększanie produktywności programisty php (v2)
Zwiększanie produktywności programisty php (v2)
 
Zwiększanie produktywności programisty php
Zwiększanie produktywności programisty phpZwiększanie produktywności programisty php
Zwiększanie produktywności programisty php
 
Python IO
Python IOPython IO
Python IO
 
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
Warsztaty: Podstawy PHP - część 2 - omówienie składni języka PHP (wersja 7)
 
DSL - DYI
DSL - DYIDSL - DYI
DSL - DYI
 
Programowanie
ProgramowanieProgramowanie
Programowanie
 
Programowanie
ProgramowanieProgramowanie
Programowanie
 
Scala
ScalaScala
Scala
 
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
 
ansible kmonticolo bezlogo
ansible kmonticolo bezlogoansible kmonticolo bezlogo
ansible kmonticolo bezlogo
 
Integracja systemow od strony praktycznej
Integracja systemow od strony praktycznejIntegracja systemow od strony praktycznej
Integracja systemow od strony praktycznej
 
Techniki kompilacji
Techniki kompilacjiTechniki kompilacji
Techniki kompilacji
 
Secure Coding w praktyce.
Secure Coding w praktyce.Secure Coding w praktyce.
Secure Coding w praktyce.
 
PSR czyli dobre praktyki programistyczne
PSR czyli dobre praktyki programistycznePSR czyli dobre praktyki programistyczne
PSR czyli dobre praktyki programistyczne
 
TorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydachTorqueBox - Ruby na sterydach
TorqueBox - Ruby na sterydach
 
Nie tylko C# - Ekosystem Microsoft dla programistów
Nie tylko C# - Ekosystem Microsoft dla programistówNie tylko C# - Ekosystem Microsoft dla programistów
Nie tylko C# - Ekosystem Microsoft dla programistów
 
Skrypty powłoki
Skrypty powłokiSkrypty powłoki
Skrypty powłoki
 
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NETProgramowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
Programowanie Komponentowe: #5 Wprowadzenie do środowiska .NET
 

More from konryd

Za co nie lubi Cię Twój hoster
Za co nie lubi Cię Twój hosterZa co nie lubi Cię Twój hoster
Za co nie lubi Cię Twój hosterkonryd
 
Concurrency in Python
Concurrency in PythonConcurrency in Python
Concurrency in Pythonkonryd
 
Objective C
Objective CObjective C
Objective Ckonryd
 
Bazaar Mercurial
Bazaar MercurialBazaar Mercurial
Bazaar Mercurialkonryd
 
Wstęp do Subversion
Wstęp do SubversionWstęp do Subversion
Wstęp do Subversionkonryd
 
Haskell
HaskellHaskell
Haskellkonryd
 
Wstęp do Ruby\'ego
Wstęp do Ruby\'egoWstęp do Ruby\'ego
Wstęp do Ruby\'egokonryd
 
Wprowadzenie do Pythona
Wprowadzenie do PythonaWprowadzenie do Pythona
Wprowadzenie do Pythonakonryd
 

More from konryd (9)

Za co nie lubi Cię Twój hoster
Za co nie lubi Cię Twój hosterZa co nie lubi Cię Twój hoster
Za co nie lubi Cię Twój hoster
 
Concurrency in Python
Concurrency in PythonConcurrency in Python
Concurrency in Python
 
Objective C
Objective CObjective C
Objective C
 
Bazaar Mercurial
Bazaar MercurialBazaar Mercurial
Bazaar Mercurial
 
Wstęp do Subversion
Wstęp do SubversionWstęp do Subversion
Wstęp do Subversion
 
Scala
ScalaScala
Scala
 
Haskell
HaskellHaskell
Haskell
 
Wstęp do Ruby\'ego
Wstęp do Ruby\'egoWstęp do Ruby\'ego
Wstęp do Ruby\'ego
 
Wprowadzenie do Pythona
Wprowadzenie do PythonaWprowadzenie do Pythona
Wprowadzenie do Pythona
 

Erlang

  • 1. BIWAK - Erlang Michał Ptaszek 26.11.2008
  • 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:
  • 19. Podstawy – gdzie jest for? Myślimy funkcyjnie: – lists:foreach – lists:map – lists:filter – lists:foldl – Rekurencja – Lists comprehensions BRAK!!!
  • 20. Podstawy – biblioteka standardowa I/O: – Pliki – Sockety Struktury danych: – Drzewa – Słowniki – Zbiory – ETS/DETS  Aplikacje: – Mnesia – Inets
  • 21. 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"]).
  • 22. 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
  • 23. 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!".
  • 24. Dynamiczne ładowanie kodu Pozwala na 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
  • 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
  • 30. Erlang behaviours Najczęściej używane behaviours: – gen_event – gen_fsm – gen_server – supervisor – application  Można definiować własne
  • 31. Gdzie można spotkać? ejabberd Wings 3D Yaws Tsung CouchDB Facebook Streamy Erlang Web
  • 34. init:stop() Dziękuję za uwagę :) A już jutro - Haskell by Tomek Rydzyński!