Introduction To Erlang Final

Post on 25-Jan-2015

3,833 views 8 download

description

 

transcript

Introduc)on to Erlang           Abd El‐Fa3ah Hussein Mahran 

Agenda

  History of Erlang   Erlang Features   Erlang/OTP and design patterns   Tools applications   Applications written in Erlang   Erlang IDEs   Erlang syntax   How to get Erlang   Demo   Conclusion   Q&A

History of Erlang

  Erlang is a programming language

  Ericsson wanted programming language for developing telecommunication switching systems.

  The language must be a very high level symbolic language in order to achieve productivity gains

  The language must contain primitives for concurrency and error recovery

1984: Ericsson Computer Science Lab formed

1984-86: Experiments programming POTS with several languages

1998: Open Source Erlang

1987: Early Erlang Prototype projects

1991: First fast implementation

1993: Distributed Erlang

1995: Several new projects

1996: Open Telecom Platform (research on verification...)‏

No language well suited for telecom systems

development

History of Erlang

Erlang is Concurrent functional programming language

It was designed by Ericsson to support distributed, fault-tolerant, soft-real-time, and non-stop applications

Erlang Features

  Concurrency   Fault tolerance   Soft Real-Time   Distribution   Hot Code Loading   External Interfaces   Platform Independent

Erlang/OTP and design patterns

  Gen_Server Behaviour   Gen_Fsm Behaviour   Gen_Event Behaviour   Supervisor Behaviour   Releases   Target systems

Tools applications   Dialyzer   Eunit   Edoc   Common_test   Test_server   Jinterface   Erl_interface   wx   Ssh   Ssl   xmerl

Depending on C++ WXwidgets

Applications written in Erlang

Applications written in Erlang   Ericsson Company

  Bluetail/Alteon/Nortel (distributed, fault tolerant email system, SSL accelerator)

  Cellpoint (Location-based Mobile Services)

  Corelatus (SS7 monitoring).

  dqdp.net (in Latvian) (Web Services).

  Facebook (Facebook chat backend)

  Finnish Meteorological Institute (Data acquisition and real-time monitoring)

  IDT corp. (Real-time least-cost routing expert systems)

  Kreditor (Electronic payment systems)

  Mobilearts (GSM and UMTS services)

  Netkit Solutions (Network Equipment Monitoring and Operations Support Systems)

  Process-one (Jabber Messaging)

  Schlund + Partner (Messaging and Interactive Voice Response services)

  Quviq (Software Test Tool)

  RabbitMQ (AMQP Enterprise Messaging)

  T-Mobile (previously one2one) (advanced call control services)

  Telia (a telecomms operator)

  Vail Systems (Interactive Voice Response systems)

  Wavenet (SS7 and IVR applications)

Erlang IDEs

  Eclipse (ErlIDE plugin)   NetBeans (ErlyBird)   Emacs   VIM   Any other editor (Gedit, Notepad++)

Erlang syntax

  Data types   If statement   Case statement   Functions   Modules   Hello World program   How Erlang works

Data types   Number

  Integer 12, 43   Float 34.3

  Atoms create, remove   Binaries <<“hello”>>   Reference   Fun   Port Identifier   Pid <0,36,0>   Tuple {1, 2, 3}   List [1, 2, 3, 4]   String “hello”   Record -record(person, {name, age, phone}).

Erlang don’t have boolean as data

type, instead Erlang has true and false

If statement

if GuardSeq1 -> Body1; ...; GuardSeqN -> BodyN end.

Case Statement

case Expr of Pattern1 [when GuardSeq1]-> Body1; ...; PatternN [when GuardSeqN] -> BodyN end.

Functions

Name(Pattern11,...,Pattern1N) [when GuardSeq1] -> Body1;

...; Name(PatternK1,...,PatternKN) [when GuardSeqK] -> ….., BodyK.

Function name Parameters

Body

Conditions

Clause 1

Clause 2

Modules -module(moduleName).

-export([func/0, func/1]).

func() -> foo(5), … .

func(A) -> foo(A), … .

foo(N) -> …, …, ...

Hello world Program

-module(hello_world).

-export([print/0]).

print() -> io:format(“Hello World…!~n”).

$ erl Eshell V 5.7.1 (abort with ^G) 1> c(hello_world). {ok, hello_world} 2> hello_world:print(). Hello World…! 3>

Save the file as “hello_world.erl”, After compilation output will be “hello_world.beam”

How Erlang works   Pattern matching technique

  Var = 3.   [Var1, Var2] = [3, 4].   {Var3, _Var4, Var5} = {4, 5, a}.   [H | T] = [iti, erlang, course, book].

1 = 1. {ok, Var} = {ok, “Connected to DB”}.

1 = 2. {ok, var} = {ok, “Connected to DB”}.

X

Recursion and Tail Recursion

fact(0) -> 1; fact(N) when N>0 -> N * fact(N -1).

fact(N) -> fact_help(N, 1).

fact_help(0, Acc) -> Acc; fact_help(N, Acc) when N>0 -> NewAcc = N * Acc, fact_help(N-1, NewAcc).

Quick Sort

quicksort([]) -> % If the list [] is empty, return an empty list (nothing to sort)

[]; quicksort([Pivot|Rest]) -> quicksort([Front || Front <- Rest, Front < Pivot]) ++ [Pivot] ++ quicksort([Back || Back <- Rest, Back >= Pivot]).

How to get Erlang

  Erlang.org   Download   Documentation   Trapexit.org   Erlang Factory   Erlang-Consulting

Demo

  Hot Code swapping   Concurrency   Fault tolerance   Distributed application

Hot Code swapping

-module(changing_code).

-export([start/0, loop/0]).

start() -> spawn(changing_code, loop, []).

loop() -> receive switch ->

changing_code:loop(); hello ->

io:format(“CAT Hackers ----1~n”), loop();

Msg -> io:format(“~p~n”, [Msg]), loop(),

end.

% Forces the use of loop/0 from

the latest version of changing_code

Concurrency

portscan(Ip, From, To) when From < To -> io:format("Ports open for: ~p:~n", [Ip]), pforeach(fun(Port) -> scan(Ip,Port) end,lists:seq(From, To)).

scan(Ip, Port) -> case gen_tcp:connect(Ip,Port,[{active, false}, binary]) of {ok,P} ->

gen_tcp:close(P), io:format("~p is open~n", [Port]); _ -> ok

end.

pforeach(F, [H|T]) -> spawn(fun() -> F(H) end), pforeach(F, T);

pforeach(_ , []) -> ok.

Fault tolerance

init([]) -> AChild= {main_module,{main_module, start_link, []}, permanent,

2000, worker, [main_module]}, {ok,{{one_for_one, 1, 60}, [AChild]}}.

Distributed application

[{kernel, [{distributed, [{dist_app, 5000, [‘node1@ricsson.com’, {‘node2@ricsson.com’, ‘node3@ricsson.com’}]}]}, {sync_nodes_mandatory, [‘node2@ricsson.com’, ‘node3@ricsson.com’]}, {sync_nodes_timeout, 5000} ] } ].

Timeout to wait until restart application on

other node

Nodes

Specifies how many milliseconds to wait for

the other nodes to start

Conclusion   Erlang is concurrent functional programming

language.   Its main goal is error recovery, fault tolerant,

distributed applications, and non-stop applications.   It released to Open source since 1998.   Companies that are using Erlang.   How Erlang works.   How to get and use Erlang.

References

  Erlang.org   Trapexit.org   Programming Erlang, Joe Armstong   Wikipedia.com

Q&A

Thanks