Erlang 1) Er [icsson] lang [uage] 2) [A.K.] Erlang
Post on 22-Jan-2016
57 Views
Preview:
DESCRIPTION
Transcript
Erlang1) Er[icsson] lang[uage]2) [A.K.] Erlang
Helmer Aaviksoo
Karli Kirsimäe
Üldine
Loodud 1987 Avatud lähtekood aastast 1998 Versioon 11 Arendajaks Ericsson Litsents: MPL
Üldine [2]
Loodi toetamaks hajusaid, veakindlaid, mitte-rangeid reaalajalisi süsteeme
Ericsson kasutab Erlangi enda telekommunikatsiooni toodetele tarkvara loomiseks
Erlangi õpetatakse üle 80-s ülikoolis üle maailma
Üldine [3]
Funktsionaalne lõimesid toetav keel Dünaamiline ja tugev tüübikontroll Automatiseeritud mäluhaldus Range väärtustamine Ühekordne omistamine Interpreteeritav Kasutab virtuaalmasinat Toetab koodi muutmist töösolevas süsteemis
Üldine [4]
C, C++ & Java liidesed Erinevad disainimallid HTTP server SNMP agent Andmebaasi mootor Eclipse plugin
Ajalugu
1982-1985 Eksperimendid erinevates keeltes 1985-1986 Lisp, Prolog, Parlog – ei toeta
lõimesid või back-trackingut 1987 Erlangi sünd 1988 Erlangi kasutamise algus 1992 Esimesed kaks Erlangi tooteprojekti 1993 Toodete müük. Ericsson alustab
implementatsioonide haldamist ja toe pakkumist
Interpretaator
Deklaratsiooni lõpus “.” Ridade eraldamine “,” Funktsioonide väljakutsumiseks “:” Tõstutundlik (Test != TesT) > (42 + 77) * 66 / 3.
2618.00 > Test = 3.
3
Moodulid
Moodul (summa.erl)-module(summa).
-export([sum/2]).
% arvutab argumentide summa
sum(X, Y) -> X + Y.
> c(summa). {ok, summa}
> summa:sum(5,4). 9
Muutujad
Algab suure algustähega .. või alakriipsuga A..Z a..z 0..9 _ @ Näited
Nimi _nimi Eesnimi@Perenimi_123 _
Andmetüübid
Täisarvud Piiratud täpsusega ujukomaarvud (5 kohta) Sõned Aatomid Korteezid Kirjed Listid Anonüümsed funktsioonid (fun’id)
Täis- & ujukomaarvud
12 -12 2#01011. % kümnendsüsteemi 11 16#FF. % 16-süsteemi 255 $ . % tühiku ASCII väärtus 1.2 6.023e+23
Aatomid
Väärtuseta andmetüüp, väikese algustähega või ühekordsete ülakomade vahel
Näide (aatom.erl)-module(aatom).-export([convert/2]).convert(M, inch) -> M / 2.54;convert(M, centimeter) -> M * 2.54.
> aatom:convert(3, ‘inch’). 1.18110
> aatom:convert(aatom:convert(3, inch), centimeter). 3.00000
Korteezid
Võimalus andmete grupeerimiseks Ümbritsetud loogeliste sulgudega Sügavus ega laius ei ole piiratud Näide:
> {inch, 3}. {inch, 3}
> {3, {inch, 4}, {3, {1, 2, 3}}}. {3,{inch,4},{3,{1,2,3}}}
Korteezid [2] Näide (korteez.erl)
-module(korteez).-export([convert_length/1]).convert_length({inch, X}) -> {centimeter, X * 2.54};
convert_length({centimeter, X}) -> {inch, X / 2.54}.
> korteez:convert_length({centimeter, 5}). {inch,1.96850}
> element(1, {2, 3}). 2
> setelement(1, {2, 3}, 4). {4, 3}
> erlang:append_element({1, 2}, 3). {1, 2, 3}
Kirjed
Sarnaneb korteezidele, aga elemendid saab kätte aatomi, mitte indeksi järgi
Deklareerimine%moodulis
-record(person, {name = "", phone = [], address})
%emulaatoris
> rd(person, {name = "", phone = [], address}).
Initsialiseerimine> P1 = #person{name=“Mari”, phone=[1,2,3], _ = undefined}.
> P1#person.name
> P2 = P1#person{name=“Jyri”, address=“Tartu”}
Listid
Ümbritsetud kandiliste sulgudega Lihtne viis listi elementide jagamiseks Näited
A = [1, 2, 3, 4, 5]. [B | C] = [1, 2, 3]. % B=1, C=[2, 3] [D, E | F] = [1, 2, 3, 4]. % D=1, E=2, F=[3,4] G = [0 | A]. % G=[0,1,2,3,4,5] H = A ++ B % H=[1,2,3,4,5,1] I = H -- [1,1,2] % I=[3,4,5]
Sõned Täisarvude listid (ASCII koodid) Defineerimine
A = “Hello World.”. B = [72,101,108,108,111,32,119,111,114,108,100,46]. C = [$H, $e, $l, $l, $o, $ , $w, $o, $r, $l, $d, $.].
Sõned [2]
Näited > Test = “testfail.html”.
“testfail.html” > lists:subtract(Test, “xafile”).
“tst.html”. > lists:suffix(".txt", Test).
false > “abc” ++ “cde”.
“abccde”
Fun’id
Anonüümsed funktsioonid Algavad klausliga fun(?), lõpevad end’iga fun ja end vahel on tavaline funktsiooni deklaratsioon Näited
> Fun1 = fun() -> 10 end. > Fun2 = fun (X,Y) when X>Y -> X; (X,Y) -> Y end. > Fun1().
10 > Fun2(Fun2(3,2),4).
4
Fun’id [2]
Funktsioonidele saab fun’e parameetritena anda ja funktsioonid saavad fun’e tagastada.
Näide:-module(funmod).-export([funIn/1, funOut/0]).
funIn(X)-> X(5).funOut() -> fun(X) -> X*3 end.
> funmod:funIn(fun(X) -> X*2 end). 10
> FunOut = funmod:funOut(). > FunOut(5).
15
Operaatorid
+, -, *, /, div, rem and, or, xor, not, orelse, andalso band, bor, bxor, bnot, bsl, bsr ==, /=, =:=, =/=, =<, >=, <, >
Operaatorite prioriteedid
: # Unaarne +-, bnot, not /, *, div, rem, band, and +, -, bor, bxor, bsl, bsr, or, xor ++, -- ==, /=, =<, >=, >, <, =:=, =/= andalso orelse = catch
Tingimusdirektiivid
Ifif
X >= Y, X > 0 -> X;
Y < X, Y > 0 -> Y;
true -> X+Y
end
Casecase X of
1 when Y >= 0 -> true;
2 -> true;
_ -> false
end
Try & catch
Vigade püüdmiseks Kolme tüüpi erindeid
throw – kasutaja defineeritud error – käitusaegsed exit – protsessi lõpetamine
Süntaks:try
file:open(X)catch
error:Reason ->{‘EXIT’, {Reason,erlang:get_stacktrace()}}
after io:format("Done with this function!")
end.
Rekursioon
-module(faktoriaal).-export([fact/1]).
fact(X) when X < 0 ->io:format("Finding factorial error - negative number: ~w~n", [X]);
fact(0) -> 1;fact(1) -> 1;fact(X) -> X*fact(X-1).
Näide > faktoriaal:fact(-5).
Finding factorial error - negative number: -5
Lõimed
PID Sõnumid Aegumine Registreeritud protsessid Klient/server mudel
Lõimed [2]
spawn(moodul, funktsioon, argumendid) Tekitab uue protsessi, tagastab identifikaatori
self() Tagastab protsessi ID
PID ! Message Saadab protsessile PID sõnumi Message
receive ... end. sleep(ms), suspend(), alarm(ms, Action)
Lõimed [3]
-module(pingpong).-export([start/1, ping/2, pong/0]).
ping(0, Pong_PID) -> Pong_PID ! finished, io:format("Ping finished~n", []);
ping(N, Pong_PID) -> timer:sleep(1000), Pong_PID ! {ping, self()}, receive pong -> io:format("Ping received
pong~n", []) end, ping(N - 1, Pong_PID).
pong() -> receive finished -> io:format("Pong
finished~n", []); {ping, Ping_PID} -> io:format("Pong received
ping~n", []), timer:sleep(1000), Ping_PID ! pong, pong() end.
start(X) -> Pong_PID = spawn(pingpong, pong,
[]), spawn(pingpong, ping, [X,
Pong_PID]).
Viited
Erlang http://www.erlang.org
Erlang programming language @ TechTarget http://whatis.techtarget.com/definition/0,,sid9_gci212072,00.html
Concurrency in Erlang http://pragdave.pragprog.com/pragdave/2007/04/adding_concurre.html
An Introduction to Erlang http
://www.it.uu.se/edu/course/homepage/projektDV/ht06/07-erlang-intro.pdf
Küsimused?
Täname kuulamast!
top related