Erlang - Concurrent Language for Concurrent World

  • 2,063 views
Uploaded on

Intro to Erlang talk from Erlang Factory Lite Tel-Aviv, October 23 2013

Intro to Erlang talk from Erlang Factory Lite Tel-Aviv, October 23 2013

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
2,063
On Slideshare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
36
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. $ whoami Name: Title: Company: E-mail: Zvi Avraham Founder & CEO ZADATA Ltd zvi@zadata.com
  • 2. Concurrent Language for Concurrent World
  • 3. The world is concurrent… I could not drive the car, if I did not understood concurrency … -- Joe Armstrong, father of Erlang
  • 4. Object-oriented Programming
  • 5. object object object object object object object object Object-oriented Programming object object object object object object object object object object
  • 6. Concurrency-oriented Programming
  • 7. process process process process process process process process Concurrency-oriented Programming process process process process process process process process process process
  • 8. Imagine a programming language which allows only 1000 objects -- Joe Armstrong, father of Erlang
  • 9. 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)
  • 10. 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
  • 11. Share Nothing! No mutable State!
  • 12. Software Isolation
  • 13. But, it will not help if the whole VM crashes
  • 14. 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!
  • 15. 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!
  • 16. Lenin – Lived Lenin – is Alive Lenin – will Live!
  • 17. Errors – Existed Errors – Exist Errors – will Exist!
  • 18. Lenin, read my dissertation: “Making reliable distributed systems in the presence of software errors”
  • 19. http://www.erlang.org/download/armstrong_thesis_2003.pdf
  • 20. Erlang Timeline CS Lab Experiments 1984 1986 AXD301 switch First fast implementation OTP 1991 1987 Early Erlang Prototypes 1996 1993 Distributed Erlang 2007 1998 Open Source
  • 21. Erlang/OTP Stack Distributed Erlang Concurrent Erlang Functional Sequential Erlang Erlang VM – BEAM / ERTS Erlang Programming Language OTP – Open Telecom Platform
  • 22. Functional Sequential Erlang • Data types: – Integers, floats, atoms, tuples/records, lists, binaries, funs • • • • • • single assignment pattern matching & guards closures (anonymous function data type) list comprehensions bit-syntax & binary comprehensions tail recursion & tail call optimization (TCO)
  • 23. Single Assignment 1> 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
  • 24. 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) ].
  • 25. Regular Recursion
  • 26. Tail Recursion
  • 27. 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)
  • 28. OOP vs FP
  • 29. 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)
  • 30. 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)
  • 31. MFA • Module:Function/Arity • Module:Function(Arguments) • M:F(A1,A2,..,An) = apply(M,F,[A1,A2,..,An])
  • 32. Concurrent Erlang • • • • Spawn processes Send messages to processes Selective receive Additional data types: – PIDs, references
  • 33. Spawn a process
  • 34. Send Message
  • 35. Receive Message
  • 36. Actors / Agents / Active Objects
  • 37. 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
  • 38. Distributed Erlang A B Erlang Run-Time System C Erlang Run-Time System network Node name: foo@domain.com Node name: bar@domain.com
  • 39. Distributed Erlang A B C B ! Msg Erlang Run-Time System Erlang Run-Time System network Node name: foo@domain.com Node name: bar@domain.com
  • 40. Distributed Erlang A B C B ! Msg C ! Msg Erlang Run-Time System Erlang Run-Time System network Node name: foo@domain.com Node name: bar@domain.com
  • 41. Erlang VM - SMP Schedulers
  • 42. zvi@host:~$ erl Erlang R16B02 (erts-5.10.3) [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] Eshell V5.10.3 1> (abort with ^G)
  • 43. 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
  • 44. 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
  • 45. Docs, Tutorials, Community, Conferences ERLANG RESOURCES
  • 46. Erlang books ErlangCentral.org
  • 47. http://www.erlang.org/download.html
  • 48. http://www.erlang.org/doc
  • 49. http://erlang.org/mailman/listinfo/erlang-questions
  • 50. http://LearnYouSomeErlang.com
  • 51. http://www.TryErlang.org
  • 52. https://ErlangCentral.org
  • 53. 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
  • 54. 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
  • 55. Thank You! Now Q&A All images are taken from Google Image search and various other places on the Internet © Copyright of corresponding owners
  • 56. BACKUP SLIDES
  • 57. 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
  • 58. 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), Rubyelectricity, etc. • Example: erlcall
  • 59. LANGUAGES FOR ERLANG VM ERLANG ON JVM
  • 60. Erjang – Erlang for JVM
  • 61. Elixir Books
  • 62. Concurrent Programming: Scala+Akka, node.js, Go COMPARISON
  • 63. Go-lang