Erlang 1) Er [icsson] lang [uage] 2) [A.K.] Erlang

Preview:

DESCRIPTION

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 - PowerPoint PPT Presentation

Citation preview

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!