11. 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)
12. 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
16. 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!
17.
18. 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!
26. 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)
27. 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
40. 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)
41.
42. 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)
57. 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
58. 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
72. 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
73. 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
76. 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
77. 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
93. 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