Erlang

792 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
792
On SlideShare
0
From Embeds
0
Number of Embeds
244
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Erlang

  1. 1. BIWAK - Erlang Michał Ptaszek 26.11.2008
  2. 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. 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. 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. 5. Pierwsze kroki – Hello World -module(hello). -export([hello_world/0]). hello_world() -> io:format("Hello World!~n").
  6. 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. 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
  8. 8. Podstawy – składnia Zmienne Integer/Float Atomy Listy Tuple Binarki Pid/porty Funkcje
  9. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 19. Podstawy – gdzie jest for? Myślimy funkcyjnie: – lists:foreach – lists:map – lists:filter – lists:foldl – Rekurencja – Lists comprehensions BRAK!!!
  20. 20. Podstawy – biblioteka standardowa I/O: – Pliki – Sockety Struktury danych: – Drzewa – Słowniki – Zbiory – ETS/DETS  Aplikacje: – Mnesia – Inets
  21. 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. 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. 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. 24. Dynamiczne ładowanie kodu Pozwala na modyfikację działającego systemu bez potrzeby jego zatrzymywania Przykład?
  25. 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. 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. 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. 28. Skalowalność
  29. 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. 30. Erlang behaviours Najczęściej używane behaviours: – gen_event – gen_fsm – gen_server – supervisor – application  Można definiować własne
  31. 31. Gdzie można spotkać? ejabberd Wings 3D Yaws Tsung CouchDB Facebook Streamy Erlang Web
  32. 32. Co dalej? www.erlang.org www.trapexit.org www.planeterlang.com www.erlang.pl “Programming Erlang: Software for a Concurrent World” - Joe Armstrong ErlLounge
  33. 33. Pytania?
  34. 34. init:stop() Dziękuję za uwagę :) A już jutro - Haskell by Tomek Rydzyński!

×