310 likes | 488 Views
Erlang 1) 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
E N D
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 • If if X >= Y, X > 0 -> X; Y < X, Y > 0 -> Y; true -> X+Y end • Case case 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] 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]). -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).
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