Erlang - PowerPoint by pengtt



         Amir Salimi
          Moi Van
          Jon Paik
•   Introduction
•   History
•   Design and Purpose
•   Distribution
•   Projects
•   Clones
•   Features
•   Sample Code
•   Compilation
•   Tuples and Atoms
•   Lists
•   Concurrency
•   Processes
•   Message passing
•   Telephony
• The sequential subset is a Functional
• A concurrent programming language and
  runtime system (follows the actor model).
• Multi-Paradigm (provides a framework in
  which programmers can work in a variety of
  styles, freely intermixing constructs from
  different paradigms).
          Design and Purpose
• Initial Version was coded in Prolog (logic
• Designed to Improve the development of
  telephony applications.
• The Ericsson Erlang implementation primarily
  runs interpreted virtual machine code, but it
  also includes a native code compiler.
• Joe Armstrong designed the 1st
  version in 1986.
• Bjarne Däcker.
• Agner Krarup Erlang.
• "Ericsson Language."
• Ericsson released Erlang as open source
  – Independence from a single vendor.
  – Increase awareness about the language.
• Erlang, together with libraries and the real-
  time distributed database Mnesia, forms the
  Open Telecom Platform (OTP) collection of
• Nortel
• T-Mobile
                 Erlang Projects
• Yahoo! Delicious
• ejabberd - an XMPP instant messaging server
• Wings 3D - a 3D modeller
• the Yaws web server
• Twitterfall - a service to view trends and patterns from
• Nitrogen - an event-driven web framework with
  support for Web 2.0 features
• The Facebook Chat system
• Apache CouchDB - a distributed document-oriented
    Erlang Inspired Concurrency Facilities
•   C#: Retlang
•   Python: Candygram
•   JavaScript: Er.js
•   Lisp: Termite Scheme, erlang-in-lisp, CL-MUPROC,
•   PHP: PHP/Erlang
•   Ruby: Erlectricity
•   Scala
•   Reia
• Hot Swapping.
• Pattern matching allows for extremely
  compact and clear programs.
• Interfaces to other programming languages,
  such as C, C++ and Java, are provided.
• Erlang comes with design patterns or
  templates for client-server design, state
  machines, event distribution, and thread
• Erlang provides a framework that supports
  distribution of programs across a pool of
  servers, with automatic recovery and
  redistribution whenever a server fails.
• It also includes powerful components for a
  network systems including an HTTP server, a
  Simple Network Management Protocol
  (SNMP) agent, a Common Object Request
  Broker Architecture (CORBA) interface, an
  OAM subsystem, and a fully distributed
  database engine.
• Erlang's bytecode is identical on all platforms,
  and a network of Erlang nodes may consist of
  any mix of NT, UNIX, or other supported
• Erlang programs are able to handle much
  more load than any other languages out
  there, which is perfect for telephone company
                 Sample Code
-module(sample).             %module name
-export([double/1]).         %exported function

double(X) → 2 * X.           %function code

• The 1st line is the module name, which is the same
  as the file name (ex. modulename.erl).
• The 2nd line is exporting the function of the module.
• The 3rd line is the function code itself.
• X is a variable.
• Type in “c(module_name).“ in the shell.
• To compile top code “c(sample).”
• Should get “{ok,sample}”, if not then there's
  error in your code.
• To run program type in
• To run top program “sample:double(10).” This
  will return 20.
-module(fact).                    %module name
-export([fac/1, mult/2]).         %2 exported functions

fac(1) ->     1;                  %return 1 if fac(1)
fac(N) ->     N * fac(N – 1).     %recursive calls

mult(X, Y) ->     X * Y.          %return X * Y

•   Has 2 functions in it: fac and mult
•   fac(1) acts like an if statement in C and Java
•   ; means there is more to that function
•   mult/2 takes in 2 arguments, therefore X & Y.

fib(0) -> 0;
fib(1) -> 1;
fib(N) -> fib(N-1) + fib(N-2).

•   Return the fibonacci number
•   fib:fib(5) returns 5
•   fib:fib(6) returns 8
•   fib:fib(10) returns 55
               Tuples and Atoms

convert_length({centimeter, X}) ->   {inch, X / 2.54};
convert_length({inch, Y}) ->    {centimeter, Y * 2.54}.

• Atoms are centimeter and inch
   – Simply just names
   – Does not contains value
• Tuples are {centimeter, X} and {inch, Y}
   – Always enclosed in { }
   – Consider as one variable
                          Why Tuples?

convert(M, inch) ->    M / 2.54;
convert(N, centimeter) ->    N * 2.54.

• Running command con:convert(3, inch). will return 1.181102...
   – Is 3 in inches or centimeters?
   – confusing

• Running command tup:convert_length({inch, 5}). will return
   – 5 inches convert into 12.7 centimeters

• It is a way to group variables, so it's easier to understand.
• Lists in Erlang are surrounded by "[" and "]".
• Example:
      • [ 1, 2, 3, 4, 5 ] or [ { 1, blue }, { 2, red }, { 3, yellow } ]
• The | is used to separate the list.
• Example: [ First | TheRest ] = [ 1, 2, 3, 4 ]
   – First = 1
   – TheRest = [ 2, 3, 4 ]
                       List Code

list_length([]) ->    0;
list_length([First | Rest]) -> 1 + list_length(Rest).

• list:list_length([1,2,3,4]). will return 4

• List is comparable to array and link list in other
  programming language.
      Concurrency in Erlang

• Erlang’s main strength is its support for
• All concurrency is explicit in Erlang.
• Processes communicate using message
  passing instead of shared variables.
      Posix/Windows Processes
• Posix and Windows thread implementations
  are designed to support statically typed
  languages that have no garbage collection
  information, so they cannot move or resize
  stacks (they don’t know where the pointers
  are and can’t fix them.)
• The programmer has to say how big the stacks
  will be, and have to overestimate with a large
  safety factor or else the program will not run.
               Erlang Processes
• Erlang processes are neither operating system
  processes nor operating system threads
• Erlang processes do keep around enough garbage
  collection information to fix the necessary pointers
  whenever a stack has to be moved or resized
• The programmer never has to make a guess about
  how big to make a stack
• Stacks can start very small in size
             Process Switching
• Posix and Windows thread implementations need
  the help of the OS for several operations, such as
  context switches.
• Context switches are very bad for caches; a context
  switch can mess up a cache to the point where it
  takes thousands of instructions to recover
• Erlang processes are green threads – no kernel
  memory is needed for an Erlang process, and all
  process switching is done by the application.
              Erlang vs. Java
• Java is an imperative programming language;
  computation is done by accessing mutable
  shared objects
• Erlang requires no locking for routine
  calculations, ie, no mutex or any semaphores

Pid2 = spawn(Mod, Func, Args)

                        Pid2 = spawn(Mod, Func, Args)

Pid2 is process identifier of the new process - this is known only to process Pid1.
            Message Passing
• Processes are isolated, no process can access
  another process's data in any way, so there is
  no need for locking (semaphores, mutexes) for
  routine calculations. (Saves time)
• The only permissible way to exchange
  information is message passing.
• This simplifies writing thread “safe” code.
                       Message Passing

self() - returns the Process Identity (Pid) of the process executing this function.
From and Msg become bound when the message is received. Messages can carry data.
                         Message Passing

                Messages can carry data and be selectively unpacked.
          The variables A and D become bound when receiving the message.
If A is bound before receiving a message then only data from this process is accepted.
Selective Message Reception

 The message foo is received, then the message bar –
    irrespective of the order in which they were sent.
               Selection of Any Message

The first message to arrive at the process C will be processed – the variable Msg in the
process C will be bound to one of the atoms foo or bar depending on which arrives first.

ringing_a(A, B) ->
                     {A, on_hook} ->
                                        A ! {stop_tone, ring},
                                        B ! terminate,
                     {B, answered} ->
                                        A ! {stop_tone, ring},
                                        switch ! {connect, A, B},
                                        conversation_a(A, B)
Client Server Model

If the message foo is received from A within the time Time perform Actions1
                        otherwise perform Actions2.
                          Uses of Timeouts
sleep(T)- process suspends for T ms.

sleep(T) ->
                   T ->

suspend() - process suspends indefinitely.

suspend() ->
                   infinity ->
• Erlang is a concurrent functional language
  designed to improve the development of
  telephony applications.
• It runs fast and the code is compact and easy
  to read.
• It is becoming more popular due to the arising
  need for concurrent programming.

         Amir Salimi
          Moi Van
          Jon Paik

To top