2014.12.04 - elixir @ erlang factory berlin · title: 2014.12.04 - elixir @ erlang factory berlin...

70
@elixirlang / elixir-lang.org

Upload: others

Post on 09-Oct-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

@elixirlang / elixir-lang.org

Page 2: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

It is not about the syntax!

Page 3: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Data (types) Modules

Processes

Tooling

Page 4: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

No custom data types

• Records aimed to add tagged tuplesbut the implementation backfired

• Maps are an improvement (imo)but do not officialise "tagging"

Page 5: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM
Page 6: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Collections

widgets.filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum()

Page 7: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Laziness in collections

widgets.stream() .filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum()

Page 8: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Elixir

Page 9: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

• Extensibility • Productivity • Compatibility

Goals

Page 10: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Extensibility

Page 11: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Data type polymorphism

Page 12: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Data (types) Modules

Processes

Page 13: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Processes Pid ! Message

“Any process that handles this message”

Page 14: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Modules Module:function()

“Any module that exports this function”

Page 15: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Data (types)

?????

“Any data type that does ????”

Page 16: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

-module(json).

encode(Item) when is_list(Item) -> % ... encode(Item) when is_binary(Item) -> % ... encode(Item) when is_number(Item) -> % ...

erlang

Page 17: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Luaerl (Robert)

erl2 (Joe)

JSON

fork fork

Page 18: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

-module(json).

encode(Item) when is_list(Item) -> % ... encode(Item) when is_binary(Item) -> % ... encode(Item) when is_number(Item) -> % ...

erlang

Page 19: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

The data type is the one that knows how to

convert itself to JSON

Page 20: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

defprotocol JSON do def encode(item) end

JSON.encode(item)

elixir

Page 21: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

defimpl JSON, for: List do def encode(item) # ... end

elixir

defimpl JSON, for: BitString do def encode(item) # ... end

defimpl JSON, for: Number do def encode(item) # ... end

Page 22: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

I can write a JSON library that is extensible to any data type

Page 23: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Data (types)

JSON.encode(data)

“Any data type that implements a protocol”

Page 24: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Enum.map [1,2,3], fn(x) -> x * 2end#=> [2,4,6]

elixirEnumerable Protocol

Page 25: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Enum.map 1..5, fn(x) -> x * 2end#=> [2,4,6,8,10]

elixirEnumerable Protocol

Page 26: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Enumerable Protocol

• Based on Haskell Iteratees • Works with in-memory collections

and resources (like I/O, File, etc)

Page 27: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Enumerable Protocol

# Uses raw & read_aheadfile = File.stream(path)Enum.take(file, 5)

Page 28: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

erlang

1> dict:from_list([{a,1}]).{dict,1,16,16,8,80,48, {[],[],[],[],[],[],[],[],[],[], [],[],[],[],[],[]}, {{[], [[a|1]], [],[],[],[],[],[],[],[],[],[], [],[],[],[]}}}

Inspect Protocol

Page 29: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

iex> HashDict.new(a: 1)#HashDict<[a: 1]>

elixirInspect Protocol

Page 30: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Productivity

Page 31: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Mix + Hex + Docs

Page 32: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

$ mix new foo$ cd foo$ mix test$ mix hex.publish$ mix hex.docs

Page 33: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Compatibility

Page 34: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

OTP & Elixir

• GenServer (plus Task and Agents) • GenRouter

Page 35: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

GenServer

Only Computation

Only State

GenServerTask Agent

Page 36: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Task

• Task.start_link/3 is similar to proc_lib:spawn_link/3

Page 37: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

async / awaitTop = self(),Ref = make_ref(),

Pid = spawn_link(fun -> Top ! {Ref, …}end),

receive {Ref, Value} -> Valueend

Page 38: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

async / await

task = Task.async(&calculate_x/0)# Do something elseTask.await(task)

Page 39: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Distributed Tasks

# In the remote nodeTask.Supervisor.start_link(name: :tasks_sup)

# In the clientTask.Supervisor.async( {:tasks_sup, :remote@local}, &calculate_x/0)

Page 40: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Agent

agent = Agent.start_link(&initial_state/0)Agent.update(agent, &increment/1)Agent.get(agent, &identity/1)

Page 41: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM
Page 42: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Agent.Lattices

• A set of agents/operations guaranteed to deterministic for parallelism?

Page 43: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM
Page 44: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Agent.CRDT

• A set of agents/operations guaranteed to replicatable across nodes?

Page 45: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Parallelism

Page 46: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Parallelism

• Laziness • Pipeline parallelism • Data parallelism

Page 47: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Collections

widgets|> Enum.filter(fn b -> b[:color] == RED end)|> Enum.map(fn b -> b[:weight] end)|> Enum.take(5)

Page 48: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Streams / Laziness

widgets|> Stream.filter(fn b -> b[:color] == RED end)|> Stream.map(fn b -> b[:weight] end)|> Stream.take(5)|> Enum.to_list()

Page 49: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Pipeline Parallelism

widgets|> Stream.filter(fn b -> b[:color] == RED end)|> Stream.map(fn b -> b[:weight] end)|> Stream.take(5)|> Stream.async()|> Enum.to_list()

Page 50: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Pipeline Parallelismdata|> …|> Stream.async()|> …|> Stream.async()|> …|> Stream.async()|> …|> Enum.to_list()

Page 51: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Pipeline Parallelism

? ? ?input output

Page 52: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Pipeline Parallelism

GenRouter GenRouter GenRouterinput output

Page 53: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

GenRouter• Specifies the message format for

connecting different processes • GenEvent replacement where we have

one process per handler • While allowing custom dispatch rules

Page 54: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

GenRouter

@spec init(args) @spec handle_up(pid, ref, state) @spec handle_down(reason, pid, ref, state) @spec handle_dispatch(event, state) @spec handle_info(message, state) @spec code_change(old_vsn, state, extra) @spec terminate(reason, state)

Page 55: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

GenRouter

@spec init(args) @spec handle_up(pid, ref, state) @spec handle_down(reason, pid, ref, state) @spec handle_dispatch(event, state) @spec handle_info(message, state) @spec code_change(old_vsn, state, extra) @spec terminate(reason, state)

Page 56: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

@spec handle_dispatch(event, state) :: {:ok, [pid], state} | {:error, reason, state} | {:stop, reason, state}

GenRouter

Page 57: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

GenRouter

router

Page 58: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

GenRouter (broadcast)

router

1,2,3

1,2,3

1,2,3

1,2,3

Page 59: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

GenRouter (round-robin)

router

1

2

3

4

Page 60: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

GenRouter (sharding)

router

1,3

2

4

Page 61: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

GenRouter (random)

router

2

1,3

4

Page 62: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Data Parallelism

• Stream.farm(data, …) • Stream.pmap(data, …) • Stream.chunked_pmap(data, …)

Page 63: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

VM + OTP

Page 64: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Many interesting challenges

• What is the most efficient way of doing polymorphic dispatch?

• The most effective technique for implementing inline caches?

Page 65: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

Many interesting challenges

• How to provide pipeline parallelism with back pressure efficiently?

• Which strategies are relevant for data parallelism?

Page 66: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

elixir-lang.org

Page 67: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM
Page 68: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

consulting and software engineering

Page 69: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

plataformatec.com.br/elixir-radar

Page 70: 2014.12.04 - Elixir @ Erlang Factory Berlin · Title: 2014.12.04 - Elixir @ Erlang Factory Berlin Created Date: 6/12/2015 10:40:42 AM

@elixirlang / elixir-lang.org