$ whoami
Name: Zvi Avraham
Title: Founder & CEO
Company: ZADATA Ltd
E-mail: zvi@zadata.com
Concurrent Language for Concurrent World
The world is concurrent…
I could not drive the car, if I did
not understood concurrency …
-- Joe Armstrong, father of Erlang
Object-oriented
Programming
Object-oriented
Programming
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
Concurrency-oriented
Programming
Concurrency-oriented
Programming
process
process
process
process
process
process
process
process
process
process
process
process
process
process
process
process
process
process
Imagine a programming
language which allows only
1000 objects
-- Joe Armstrong, father of Erlang
COP vs OOP
Concurrency-oriented vs Object-oriented
• 15 years ago OOP became mainstream
• COP became popular only recently
• Process is active object
– i.e. object with it’s own process of control
– Objects in OOP are “passive objects”
• Processes as cheap as hashtables:
– ~ 300 words (1.2KB) per process by default
– max 134M processes per VM (limited by RAM)
Concurrency-oriented Programming
• Large number of processes (up to millions)
• Complete isolation of processes
• No shared memory
• Copy message data between processes
– instead of just passing pointer to message
• Avoid sequential bottlenecks
• Location transparency
Share Nothing!
No mutable State!
Software Isolation
But, it will not help
if the whole VM crashes
One Process per
Parallel Activity
• try to do only one thing per process
• If you need to do something
– just spawn a new process
• no thread pools!
Let it crash!
• all sequential languages get error handling
wrong!
• No defensive programming!
• If you don’t know how to recover from the
error – let it crash!
Lenin –
Lived
Lenin –
is Alive
Lenin –
will Live!
Errors –
Existed
Errors –
Exist
Errors –
will Exist!
Lenin, read my dissertation:
“Making reliable distributed
systems in the presence of
software errors”
http://www.erlang.org/download/armstrong_thesis_2003.pdf
Erlang Timeline
1984
1986
1987
1991
1993
OTP
1996
1998
2007
Open SourceDistributed
Erlang
Early
Erlang
Prototypes
First fast
implementation
CS Lab
Experiments
AXD301
switch
Erlang/OTP Stack
Erlang VM – BEAM / ERTS
Functional Sequential Erlang
Concurrent Erlang
OTP – Open Telecom Platform
Distributed Erlang
ErlangProgrammingLanguage
Functional Sequential Erlang
• Data types:
–Integers (incl. BigNums), floats, atoms
–tuples/records, lists/plists, binaries, funs
–Maps (added in R17)
• single assignment
• pattern matching & guards
• closures (anonymous function data type)
• list comprehensions
• bit-syntax & binary comprehensions
• tail recursion & tail call optimization (TCO)
Single Assignment1> X.
* 2: variable 'X' is unbound
2> X = 10.
10
3> X = X + 1.
** exception error: no match of right hand side
value 11
4> X = X.
10
5> X = 10.
10
6> X = 20.
** exception error: no match of right hand side
value 20
No Loops???
No Loops???
• Use instead:
–recursion and tail recursion
–list comprehensions
–binary comprehensions
–Higher-order Functions (HOFs):
• map/foldl/foldr/zip/filter/etc.
• For example:
[ io:format(“~b”,[I]) || I<-lists:seq(1,10) ].
RECURSION
RECURSION
Regular Recursion
Tail Recursion
zvi@host:~$ erl
Erlang R16B02 …
…
1> c(demo).
{ok,demo}
2> demo:fact(0).
1
3> demo:fact(5).
120
4> demo:fact(-10).
** exception error: no function clause
matching demo:fact(-10) (demo.erl, line 10)
OOP vs FP
Side-Effects
• Erlang is not pure-functional language
• “Controlled Side effects”:
– Messages - Pid ! Msg – send message to process Pid
– Signals - i.e. your linked process is dead
– Exceptions
– I/O
– Process Dictionary - similar to TLS (thread local storage)
– ETS / DETS - fast in-memory / persistent lookup tables
– Mnesia - distributed realtime database (sort of STM)
Erlang Source Code Structure
• OTP Release (self-contained tar.gz archive)
– OTP Application (directory structure)
• Module (file sources in *.erl, compiled in *.beam)
– Function
» Clause (syntactic sugar for case statement)
MFA
• Module:Function/Arity
• Module:Function(Arguments)
• M:F(A1,A2,..,An) = apply(M,F,[A1,A2,..,An])
Concurrent Erlang
• Spawn processes
• Send messages to processes
• Selective receive
• Additional data types:
– PIDs, references
Spawn a process
Send Message
Receive Message
Actors / Agents / Active Objects
Process
• Pid – Process ID
• optional: registered name
• initial call: MFA
• message queue (mailbox)
• stack
• heap
• Dictionary (like TLS – thread local storage)
• traping exits? (boolean flag)
• linked processes
• priority (low/normal/high)
• Reductions counter
Distributed Erlang
Erlang Run-Time System Erlang Run-Time System
network
A B C
Node name: foo@domain.com Node name: bar@domain.com
Distributed Erlang
Erlang Run-Time System Erlang Run-Time System
B ! Msg
network
A B C
Node name: foo@domain.com Node name: bar@domain.com
Distributed Erlang
Erlang Run-Time System Erlang Run-Time System
B ! Msg
network
C ! Msg
A B C
Node name: foo@domain.com Node name: bar@domain.com
Erlang VM - SMP Schedulers
zvi@host:~$ erl
Erlang R16B02 (erts-5.10.3)
[smp:4:4] [async-threads:10] [hipe]
[kernel-poll:false]
Eshell V5.10.3 (abort with ^G)
1>
Hot Code Reloading
• Module may have 2 version loaded in VM:
– old version
– current version
• When new version of module is loaded:
– it become a “current version”
– current version become the “old version”
• All new processes will use current version
• The old processes running old version
– In places in the code where module name is explicitly
specified - the process will switch to current version:
• my_function(Args) - no version switch
• my_module:my_function(Args) - switching version
Tools
• IDE:
– Emacs, Distel, Plugins for Eclipse and Netbeans
• Testing:
– e-unit, meck, proper, QuickCheck (paid), Quick Check mini - free
• Static code analyzer:
– Dialyzer
• Debug and trace
– Built-in in VM – dbg, redbug
• Build:
– emake, rebar, relx, erlang.mk
• Package Managers:
– rebar, mix
ERLANG RESOURCES
Docs, Tutorials, Community, Conferences
ErlangCentral.org
Erlangbooks
http://www.erlang.org/download.html
http://www.erlang.org/doc
http://erlang.org/mailman/listinfo/erlang-questions
http://LearnYouSomeErlang.com
http://www.TryErlang.org
https://ErlangCentral.org
Erlang/OTP is a good fit for:
• Irregular concurrency:
– Task-level
– Fine-grained parallelism
• Network servers
• Distributed systems
• Middleware:
– Parallel databases
– Message Queue servers
• Soft Realtime / Embedded applications
• Monitoring, control and testing tools
Not so good fit for:
• Concurrency for synchronized parallel execution
– Data Parallelism
• Floating-point intensive code (HPC)
• Text Processing / Unicode
– Unicode support now much better
• Traditional GUI (supports wxWidgets)
• Hard Realtime applications
• Extensive interop with other languages/VMs
– improvement here with NIFs and Erjang - Erlang on
JVM
Thank You! Now Q&A
All images are taken from Google Image search and various other places on the Internet
© Copyright of corresponding owners
BACKUP SLIDES
Communicating with External world:
• Part of the OTP:
– CORBA/IDL
– ODBC/SQL
– ASN.1
– SNMP
– HTTP/FTP
– SSH
• erlcall
– execute any Erlang function on remote Node from the
shell or script
• escript
– write scripts in Erlang – no need to compile
Communicating with External world
In-proc Out-of-proc
Custom Protocol Linked-in Drivers
• in-proc (.so, DLLs)
• Written in C
• custom protocols
• Can crash VM
Ports
• external executable
• like pipes
• custom protocols via
fd/stdio/sockets
• Dir = os:cmd(“ls –al”).
Generic Protocol NIF
• Native Implemented
Functions
• Written in C
• in-proc (like JNI in Java:
.so, DLLs)
• .so/DLLs can be hot code
reloaded at runtime
• can block a scheduler
• Can crash VM
C-Node
• out-of-proc (external executable,
interpreter or VM)
• Pretend to be a distributed
Erlang node (but implemented in
other lang.)
• JInterface (Java), OTP.NET,
PyInterface (Pyton), Ruby-
electricity, etc.
• Example: erlcall
OTHER ERLANG VM
IMPLEMENTATIONS
Erjang – Erlang for JVM
Erlang-on-Xen / ling VM
LuvvieScript - Erlang to JS compiler
LANGUAGES FOR ERLANG VM
Elixir Books
COMPARISON
Concurrent Programming: Scala+Akka, node.js, Go
Go-lang
Erlang / Elixir Clojure Scala Node.js Go-lang
Paradigm Functional COP Functional Functional
OOP
CBoP
OOP
ImperativeO
OP?
Type system dynamic dynamic static dynamic static
Target BEAM JVM JVM Chrome V8 native
Multithreading yes yes yes no Yes
Built-in
Asynch I/O
yes no no yes yes
Lightweight
processes
yes Partial* no no yes
Soft-RT GC yes no no no no
Pattern
Matching
yes no yes no no
OTP analogue? Yes - OTP Akka? Akka? no no
Tools Middle
Elixir - better
good middle good excellent
Problem Domain
usually used
Messaging,
Distributed
Systems
Unstruct.
data
Big Data:
Kafka, Spark
Web apps /
Realtime Web
DevOps

Erlang - Concurrent Language for Concurrent World