The Erlang Programming Language Dennis Byrne - ThoughtWorks [email_address] http://notdennisbyrne.blogspot.com/ © ThoughtWorks 2008
Introduction Not a “shiny new object (or function)” Open sourced by Ericsson Functional Programming Concurrency Reliability ThoughtWorks ! Erlang © ThoughtWorks 2008 Erlang is a functional programming language, with native constructs for concurrency and reliability.
A Totally “Unbiased” Comparison In Erlang: List = [1,2,3,4,5]. Doubled = lists:map( fun(I) -> I * 2 end, List). In Java: List<Integer> list = new LinkedList<Integer>() {{ add(1); add(2); add(3); add(4); add(5); }}; List<Integer> doubled = new ArrayList<Integer>(); for(Integer integer : list) { doubled.add(integer.intValue() * 2); } © ThoughtWorks 2008
Single Assignment & Unification I = 4.  % assignment I = 4.  % unification I = I.  % unification 4 = I.  % unification I = 5.  % throws error :( © ThoughtWorks 2008
Pattern Matching 1>  MyList = [ “ A ” ]. % declaring a list 2>  [Var] = MyList. % implicit declaration  3>  io:format(Var). % prints  “ A ” 1>  MyList = [ “ A ” ,  “ B ” ]. % declaring a list 2>  [_, Var] = MyList.  % _ is ignored 3>  io:format(Var).  % prints B © ThoughtWorks 2008
Functions as First Class Citizens 1>  Msg = &quot;I am scoped&quot;. 2>  F = fun()-> io:format(Msg) end. 3>  F(). % prints  “ I am scoped ” © ThoughtWorks 2008
Tail Recursion Tail recursion is to ‘recursion’ as optimistic locking is to ‘locking’. loop()  -> io:format( “ in constant space ” ),   loop() . Automatic byte code manipulation Last call optimization © ThoughtWorks 2008
Pop Quiz: Evaluation Strategies f( a(), b() ) Order of evaluation Lazy or strict? Left, right, both, neither? © ThoughtWorks 2008
State Erlang avoids complex solutions in favor of simple ways to avoid the problem State is immutable w/ single assignment State is private, passed by value Changing Perspectives Contention vs. Scale Side Effects vs. Scale © ThoughtWorks 2008
Erlang Process An Erlang process combines the best of An operating system process An operating system thread A “green thread” Controlled in user space by the ERTS Costs less than 300 bytes Private heap Private stack All processes are created equal Incremental garbage collection © ThoughtWorks 2008
The Actor Model Asynchronous Message passing Messages passed by value, not reference One to one relationship An Actor A mailbox A Process A Process ID, or pid © ThoughtWorks 2008
Concurrency Primitives: spawn A built in function used to create a process. Pid = spawn(Node, Module, Function, Args) © ThoughtWorks 2008
Another “Unbiased” Comparison In Erlang: Pid = spawn(fun() -> io:format(“hello world”) end). In Java: Thread thread = new Thread() { public void run() { System.out.println(&quot;Hello World&quot;); } }.start(); © ThoughtWorks 2008
Concurrency Primitives: send ! © ThoughtWorks 2008
Concurrency Primitives: send The send operator passes a message to a process.  It is “fire and forget”. Pid ! Msg © ThoughtWorks 2008
Concurrency Primitives: receive receive Pattern1 [ when Guard1 ] -> dosomething(). Pattern2 [ when Guard2 ] -> dosomethingelse(). end © ThoughtWorks 2008
Reliability catch try Monitor monitor_node(Node, Bool) Unidirectional Link Pid = spawn_link(Node, Module, Fun, Args) Bi-directional © ThoughtWorks 2008
The Opposite of Ruby © ThoughtWorks 2008 Erlang Ruby Orientation Functional Object Syntax Ugly Beautiful Concurrent Good Bad Track Record Back end Front end Execution Model Compiled Interpreted
Erlang Servers and Frameworks Mnesia – distributed database YAWS – “yet another web server” ErlyWeb – MVC web framework EUnit Jungerl – third party libraries Perferl ( http://code.google.com/p/perferl ) © ThoughtWorks 2008
The Erlang Programming Language Dennis Byrne - ThoughtWorks [email_address] http://notdennisbyrne.blogspot.com/ © ThoughtWorks 2008

The Erlang Programming Language

  • 1.
    The Erlang ProgrammingLanguage Dennis Byrne - ThoughtWorks [email_address] http://notdennisbyrne.blogspot.com/ © ThoughtWorks 2008
  • 2.
    Introduction Not a“shiny new object (or function)” Open sourced by Ericsson Functional Programming Concurrency Reliability ThoughtWorks ! Erlang © ThoughtWorks 2008 Erlang is a functional programming language, with native constructs for concurrency and reliability.
  • 3.
    A Totally “Unbiased”Comparison In Erlang: List = [1,2,3,4,5]. Doubled = lists:map( fun(I) -> I * 2 end, List). In Java: List<Integer> list = new LinkedList<Integer>() {{ add(1); add(2); add(3); add(4); add(5); }}; List<Integer> doubled = new ArrayList<Integer>(); for(Integer integer : list) { doubled.add(integer.intValue() * 2); } © ThoughtWorks 2008
  • 4.
    Single Assignment &Unification I = 4. % assignment I = 4. % unification I = I. % unification 4 = I. % unification I = 5. % throws error :( © ThoughtWorks 2008
  • 5.
    Pattern Matching 1> MyList = [ “ A ” ]. % declaring a list 2> [Var] = MyList. % implicit declaration 3> io:format(Var). % prints “ A ” 1> MyList = [ “ A ” , “ B ” ]. % declaring a list 2> [_, Var] = MyList. % _ is ignored 3> io:format(Var). % prints B © ThoughtWorks 2008
  • 6.
    Functions as FirstClass Citizens 1> Msg = &quot;I am scoped&quot;. 2> F = fun()-> io:format(Msg) end. 3> F(). % prints “ I am scoped ” © ThoughtWorks 2008
  • 7.
    Tail Recursion Tailrecursion is to ‘recursion’ as optimistic locking is to ‘locking’. loop() -> io:format( “ in constant space ” ), loop() . Automatic byte code manipulation Last call optimization © ThoughtWorks 2008
  • 8.
    Pop Quiz: EvaluationStrategies f( a(), b() ) Order of evaluation Lazy or strict? Left, right, both, neither? © ThoughtWorks 2008
  • 9.
    State Erlang avoidscomplex solutions in favor of simple ways to avoid the problem State is immutable w/ single assignment State is private, passed by value Changing Perspectives Contention vs. Scale Side Effects vs. Scale © ThoughtWorks 2008
  • 10.
    Erlang Process AnErlang process combines the best of An operating system process An operating system thread A “green thread” Controlled in user space by the ERTS Costs less than 300 bytes Private heap Private stack All processes are created equal Incremental garbage collection © ThoughtWorks 2008
  • 11.
    The Actor ModelAsynchronous Message passing Messages passed by value, not reference One to one relationship An Actor A mailbox A Process A Process ID, or pid © ThoughtWorks 2008
  • 12.
    Concurrency Primitives: spawnA built in function used to create a process. Pid = spawn(Node, Module, Function, Args) © ThoughtWorks 2008
  • 13.
    Another “Unbiased” ComparisonIn Erlang: Pid = spawn(fun() -> io:format(“hello world”) end). In Java: Thread thread = new Thread() { public void run() { System.out.println(&quot;Hello World&quot;); } }.start(); © ThoughtWorks 2008
  • 14.
    Concurrency Primitives: send! © ThoughtWorks 2008
  • 15.
    Concurrency Primitives: sendThe send operator passes a message to a process. It is “fire and forget”. Pid ! Msg © ThoughtWorks 2008
  • 16.
    Concurrency Primitives: receivereceive Pattern1 [ when Guard1 ] -> dosomething(). Pattern2 [ when Guard2 ] -> dosomethingelse(). end © ThoughtWorks 2008
  • 17.
    Reliability catch tryMonitor monitor_node(Node, Bool) Unidirectional Link Pid = spawn_link(Node, Module, Fun, Args) Bi-directional © ThoughtWorks 2008
  • 18.
    The Opposite ofRuby © ThoughtWorks 2008 Erlang Ruby Orientation Functional Object Syntax Ugly Beautiful Concurrent Good Bad Track Record Back end Front end Execution Model Compiled Interpreted
  • 19.
    Erlang Servers andFrameworks Mnesia – distributed database YAWS – “yet another web server” ErlyWeb – MVC web framework EUnit Jungerl – third party libraries Perferl ( http://code.google.com/p/perferl ) © ThoughtWorks 2008
  • 20.
    The Erlang ProgrammingLanguage Dennis Byrne - ThoughtWorks [email_address] http://notdennisbyrne.blogspot.com/ © ThoughtWorks 2008