elixir: the future of web development | elixir: Будущее веб-разработки

33
Yaroslav Smirnov | @stellarnode | facebook.com/yaroslav.smirnov

Upload: yaroslav-smirnov

Post on 12-Apr-2017

164 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Yaroslav Smirnov | @stellarnode | facebook.com/yaroslav.smirnov

Page 2: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Elixir is a dynamic, functional language designed for building scalable and maintainable applications.

Page 3: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

В начале был…

• Разработан компанией Ericsson в 1986 году• Fault-tolerant, concurrent, distributed, scalable, real-time

Page 4: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

• Немутабельные данные• Много легких процессов• Нет доступа к «общим» данным• Процессы общаются только через сообщения• «Горячая» замена кода• Принцип «пусть ломается» и 99,999999% uptime• Проверенная платформа – Erlang VM (BEAM)

Page 5: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

• Amazon• Yahoo!• T-Mobile• Motorola• Heroku• Call of Duty• League of Legends• Ericsson…

40%телекома

+

Page 6: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

• 2 млн подключений на одном сервере• 450 млн пользователей и 32 инженера• 19 миллиардов USD заплатил Facebook

Page 7: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Два разных мира

• Надежность• Миллионы пользователей• Проверка временем

• Удобство разработки• Простота изучения• Постоянное развитие

Распределенные системы Веб-приложения

Page 8: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Так появился Elixir…

Сила языка Erlang иэлегантность Ruby

• Создан в 2012 году• Автор Jose Valim• Бонусы:

• Скорость, многоядерность• Метапрограммирование• Инструменты mix, hex• Сообщество и документация• Все библиотеки Erlang

Page 9: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Install

Mac:$ brew update$ brew install elixir

Windows:https://repo.hex.pm/elixir-websetup.exe

Page 10: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

hello_world.ex

defmodule HelloWorld do def say_it do

IO.puts "Hello World”end

end

Page 11: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

$ iex

Interactive Elixir (1.3.2)

iex(1)> c("hello_world.ex")[HelloWorld]

iex(2)> HelloWorld.say_itHello World:ok

iex(3)>

Page 12: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Основные типыElixir поддерживает динамическое типизирование

123 # integer0x1F # integer123.34 # floattrue # boolean:atom # atom"elixir” # string[1, 2, 3] # list{1, 2, 3} # tuple%{a: 1, b: 2} # map~r/abc/ # sigil

Page 13: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Pattern matching

iex> x = 11

iex> 1 = x1

iex> 2 = x** (MatchError) no match of right hand side

value: 1

Page 14: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Pattern matching

iex> {a, b, c} = {:hello, "world", 42}{:hello, "world", 42}

iex> a:hello

iex> b"world"

Page 15: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Pattern matching

iex> {:ok, result} = {:ok, 13}{:ok, 13}

iex> result13

iex> {:ok, result} = {:error, :oops}** (MatchError) no match of right hand side

value: {:error, :oops}

Page 16: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Pattern matching

# flattens a list

def flatten([]), do: []

def flatten([head | tail]) when is_list(head), do: flatten(head) ++ flatten(tail)

def flatten([head | tail]), do: [head | flatten(tail)]

Page 17: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Factorial demo

Page 18: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

List comprehensions

iex> for n <- [1, 2, 3, 4], do: n * n[1, 4, 9, 16]

iex> values = [good: 1, good: 2, bad: 3, good: 4]iex> for {:good, n} <- values, do: n * n[1, 4, 16]

iex> for n <- 1..100, rem(n, 3) == 0, do: n[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39,

42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]

Page 19: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

List comprehensions

defmodule Comprehensions dodef list(x, y) do

for n <- x..y, do: nenddef primes(n) do

l = list(2, n)for x <- l, _is_prime(x), do: x

enddefp _is_prime(x) do

check = for y <- 2..x, rem(x, y) == 0, do: ylength(check) == 1

endend

Page 20: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Default arguments

defmodule Concat do

def join(a, b, sep \\ " ") do

a <> sep <> b

end

end

IO.puts Concat.join("Hello", "world") #=> Hello worldIO.puts Concat.join("Hello", "world", "_") #=> Hello_world

Page 21: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Function capturing

iex> fun = &(&1 + 1)#Function<6.71889879/1 in :erl_eval.expr/5>

iex> fun.(1)2

Page 22: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Pipe operator

defmodule Crunch dodef of(something) dosomething

|> filter|> sort|> group|> count

endend

Page 23: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Mix$ mix new project* creating README.md* creating .gitignore* creating mix.exs* creating config* creating config/config.exs* creating lib* creating lib/project.ex* creating test* creating test/test_helper.exs* creating test/project_test.exsYour Mix project was created successfully.You can use "mix" to compile it, test it, and more:

cd projectmix test

Run "mix help" for more commands.

Page 24: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Processes

iex> send self(), {:hello, "world"}{:hello, "world"}

iex> receive do...> {:hello, msg} -> msg...> {:world, msg} -> "won't match”...> end"world"

Page 25: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Processes

spawn(Module, :function, [params])spawn_link(Module, :function, [params])spawn_monitor(Module, :function, [params])

Page 26: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

SpawnOne demo

Page 27: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

OTP – Open Telecom Platform

Supervisor

Worker Supervisor

Worker Worker

Page 28: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Документация

Page 29: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Packages and libraries

Page 30: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки
Page 31: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Similar to Ruby on Rails and different

• MVC• Plugins• Migrations• Eex ~= Erb• Path helpers• Router• Schema• Generators

• No Active Record• Sockets• Channels• Views• 10-40x faster

Page 32: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

$ mix phoenix.new awesome

Page 33: Elixir: The Future of Web Development | Elixir: Будущее веб-разработки

Thank you