From Java

To Erlang

About Me

Developer Freelance in Paris

@rolios

o.gonthier@gmail.com

Gonthier Olivier

Context

Context

Team switch

Client side

Java

Android

IntelliJ

Server side

Erlang

MongooseIM

Vim

Erlang learning

And also:

-Functional principles by learning Haskell

-Scrum-mastering, continuous integration

Online training

Read books

Watch talks

Read code

Android team

Oh, you want to use a dead language?

Java is better

Erlang team

Oh, you was doing ugly fat Java! Beh
Erlang is better

 

Erlang in a nutshell

Disclaimer

Erlang: what's that?

VM-based, Functional, impure, 

Typed dynamically, Concurrent, Distributed,

Opinionated

Erlang is a general-purpose, concurrent, garbage-collected programming language and runtime system. (Wikipédia)

Created by Sony Ericsson in 1987
Open-Source since 1998

Erlang: usage

  • Created for Telecom needs
  • Ericson platform: 99.9999999% uptime
  • Used for xmpp servers: ejabberd, MongooseIM
  • RabbitMQ, CouchDB
  • WhatsApp backend

Facebook started his chat in erlang, dropped it for c++ in 2009, and then... Bought whatsapp, using erlang, 5 years later

What it looks like!

Syntax

-module(my_module).
-export([my_func/1, my_other_func/2, another_one/0]).

% A comment

%% A function returning its parameter
my_func(X) -> X.

%% A function using pattern matching
my_other_func(true, _) -> ok;
my_other_func(_, _) -> error.

%% A function with multiple clauses
another_one() -> 
    X = my_func(0),
    Y = other_module:other_func(),
    X+Y.
    
%% A function not exported
private_function() -> ok.

Java analogy

module = class; function = method; export = public

Pattern matching

% Matching on function definition
invert(true) -> false;
invert(false) -> true.

% Values passed in parameter are bound
add_one(X) -> X+1.

% Pattern matching using case syntax
case write_file("helloworld") of
    {ok, File} -> File;
    {error, Error} -> log_error(Error)
end.

% Matching bind variables
> X = 1.

% Binding can be done even with data structures
> {Y, [Z, B]} = {2, [3, true]}

% Bounded variable can't match other values
> X = 2.
** exception error: no match of right hand side value 2

% No problems if trying to bind the same value
> {X, Y} = {1, 2}.

Data types

Boolean: true, false

Numbers: 1, 0.5, 2.0e3, $A, 2#101001

Atoms: hello, this_is_an_atom, ok

Tuples: {1, 2}, {temp, {celsius, 21}}

List: [1,2], [true, 1, ok, {beer, blond}]

Strings: "hello", [96,97,98]

 

​Also: Binaries, PID, Fun, Map

Atoms

Atoms are a kind of simple "tags"

In use, it can be similar to Java enums or static values.

public static final int DECEMBER = 12;

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY 
}

selectDay(25, SUNDAY, DECEMBER);
select_day(25, sunday, december).

They are often used to give context to values

{prices, [{beer, 2}, {vodka, 10}], euro}.

Strings

Beh.

> [104, 101, 108, 108, 111]
"hello"

> [X, Y] = "ab".
> X.
97

> [X, Y, 0].
[97, 98, 0]

Excuse me?

Alternative: bit strings

> <<"Hello world">>.

> <<A, B>> = <<"ab">>.
> A.
97

Concurrency

Lightweight processes, and Message Passing

-module(echo).
-export([go/0, loop/0]).
 
go() ->
	Pid2 = spawn(echo, loop, []),
	Pid2 ! {self(), hello},
	receive 
		{Pid2, Msg} ->
			io:format("P1 ~w~n",[Msg])
	end,
	Pid2 ! stop.

loop() ->
	receive
		{From, Msg} -> 
			From ! {self(), Msg},
			loop();
		stop ->
			true
	end.
Pid ! {MyPid, Msg} % Send message to Pid

Distributed system

-At the heart of the language-

Erlang VMs visible on network and sharing a specific cookie, are interconnected!

And you can send messages to other nodes transparently!

You can connect/disconnect nodes whenever you want

OTP

-Open Telecom Platform-

Abstract things we need often,

like server/client pattern

Supervision tree made easy

-behaviour(supervisor).
-behaviour(gen_server).
-behaviour(gen_event).
-behaviour(gen_fsm).

Erlang         philosophy

Let it crash!

But recover from it

No need of defensive programming

Kill yourself if you can't recover.

Think in terms of protocols

Message passing
Share nothing

Kill people not respecting the protocol.

Golden trinity

Tools

Eshell

REPL

Debug Console

$> erl
% Compile a module
c(my_module).

% Unbind var
f(X).

Hot reload

Good News: Hot reloading is available in Erlang!

Thoughts 

you don't need to reboot your app

static typing would have been complicated with this

Nothing to do, just compile and use your new .beam

Eunit

Or Junit with a 'E' instead of 'J'

-module(fibo).

-ifdef(EUNIT).
-include_lib("eunit/include/eunit.hrl").
-endif.

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

fib_test_() ->
       [?_assert(fib(0) =:= 1),
	?_assert(fib(1) =:= 1),
	?_assert(fib(2) =:= 2),
	?_assert(fib(3) =:= 3),
	?_assert(fib(4) =:= 5),
	?_assert(fib(5) =:= 8),
	?_assertException(error, function_clause, fib(-1)),
	?_assert(fib(31) =:= 2178309)
       ].

Rebar

Maven/Gradle equivalent

$ rebar create-app appid=myapp
$ rebar get-deps
$ rebar compile
$ rebar eunit
$ rebar generate

Muptiple commands to compile/test/package etc.

{deps, [
    {em, ".*", {git, "https://github.com/sheyll/erlymock.git"}},
    {nano_trace, ".*", {git, "https://github.com/sheyll/nano_trace.git", {branch, "feature/rebar-migration"}}},
    {mochiweb, "2.3.2", {git, "https://github.com/mochi/mochiweb.git", {tag, "v2.3.2"}}},
    % Or specify a revision to refer a particular commit, useful if the project has only the master branch
    % {mochiweb, "2.3.2", {git, "https://github.com/mochi/mochiweb.git", "15bc558d8222b011e2588efbd86c01d68ad73e60"},

    % An example of a "raw" dependency:
    {rebar, ".*", {git, "git://github.com/rebar/rebar.git", {branch, "master"}}, [raw]}
   ]}.

Configuration is done in a rebar.config file

Dependencies are git repositories :(

Observer

A very useful debug console

> observer:start().

Supervision tree, tracing, systems statistics, consumption...

Other

Dialyzer: let you do a static analysis
Reltool: tool to make erlang releases
(used by rebar)

Erlang.mk: Alternative to rebar based on a makefile

WombatOAM: commercial product for system supervision

Gimme more Erlang!

Erlang: the movie

Erlang : The movie II - The sequel

If you want to hear about a new name for Erlang...

Good resources

Awesome book!

A good list of resources
 https://gist.github.com/macintux/6349828

Gonthier Olivier
@rolios
o.gonthier@gmail.com

From Java To Erlang

By Gonthier Olivier

From Java To Erlang

  • 2,938