Erlang

73
Erlang — просто еще один способ прострелить себе ногу

description

Introduction into Erlang language; reasons to use Erlang, main Erlang features and syntax

Transcript of Erlang

Page 1: Erlang

Erlang — просто еще один способ прострелить себе

ногу

Page 2: Erlang

Зачем нужно учить еще один язык программирования?

Почему бы сразу не пойти на курсы MBA?

Page 3: Erlang

Расширение сознания

Page 4: Erlang

От написания кода до дурдома не так далеко

Page 5: Erlang

Хорошего кода должно быть мало!

— его меньше писать

— его легче читать

— его просто изменять

Идеальный код - код, которого не существует!

Page 6: Erlang

Папа, ты можешь потратить свою жизнь на меня, а не на борьбу со сторонними эффектами

Page 7: Erlang

Еще один инструмент в копилку

Page 8: Erlang
Page 9: Erlang
Page 10: Erlang
Page 11: Erlang

Изобретениеи

переизобретения велосипедов

Page 12: Erlang

Велосипедов есть много и разных

Page 13: Erlang

Изобретение велосипеда — это не самый плохой

поступок

но не для ленивых...

Page 14: Erlang

Да и зачем изобретать, когда это уже есть

с выдержкой в продакшене на 25 лет, например

Page 15: Erlang

Выпендриваться при приеме на работу

А чего они как эти?

Page 16: Erlang

«Хорошие программисты думают перед тем, как писать программу, особенно если в коде используются указатели. Например, если нужно перевернуть связный список, хороший кандидат непременно нарисует сбоку, откуда и куда идут указатели. Он просто вынужден это сделать, ибо человек не в силах написать код, переворачивающий связный список, не нарисовав маленькие квадратики со стрелочками между ними. Плохой программист начнет писать сразу.»

Джоель Спольскигуру интервьюриования

Page 17: Erlang

И не забудем любимый вопрос «Почему канализационные люки круглые ?»

Page 18: Erlang

«Ну а правда, что может сделать честный человек в возрасте, близком к 33 годам, если его вдруг спросят на собеседовании про наследование квадрата от прямоугольника, объектную декомпозицию автомобиля, форму канализационного люка, остров лжецов или три лампочки в туалете? Ну или какой-нибудь вопрос про толкования какого-нибудь паттерна GoF ? Мне кажется, бить надо наверняка, ну, смотреть по обстановке - можно резко придвинуть стол, заблокировав собеседника и аргументировать локтями сверху, или воспользоваться стулом, если он достаточно крепкий и массивный...»

@dmzразработчик компиляторовфункциональщикзнаток множества страшных слов

Page 19: Erlang

— Напишите, пожалуйста, обращение списка.— На каком языке?— Да все равно...* * - но на самом деле не все равно. :-) 

Page 20: Erlang

Полный дзен«Сейчас мы придумаем специализированный язык, опишем его грамматику и в его терминах решим предложенную задачу.»

Первый вариантreverse([]) -> [];reverse([X]) -> [X];reverse([X|T]) -> reverse(T) ++ [X].

Второй вариантlists:reverse([1,2,3]).

Page 21: Erlang

Ну и еще это просто весело!

ну и деньги, девушки, все такое...

Page 22: Erlang

Что такое Erlang и на кой он нужен?

 И почему его адепты ненавидят node.js?

Page 23: Erlang

История

Page 24: Erlang

Агнер Краруп Эрланг (англ. Agner Krarup Erlang; 1 января 1878, Лонборг, Дания — 3 февраля, 1929) — датский математик, статистик и инженер, основатель научного направления по изучению трафика в телекоммуникационных системах и теории массового обслуживания.

Эрлангом была получена формула для расчета доли вызовов, получающих обслуживание на сельской телефонной станции и кому придется ожидать пока делаются внешние вызовы.

Page 25: Erlang

Robert Virding

Joe Armstrong

...и еще с десяток человек.

Mike Williams

Page 26: Erlang

Что написано?

Page 27: Erlang
Page 28: Erlang

Кто использует?

Page 29: Erlang
Page 30: Erlang

Основные свойства

Page 31: Erlang

Декларативность

Неизменяемость данных и автоматическая сборка мусора

Легкие процессы, обмен сообщениями никакой общей памяти

Несколько ортогональных инструментов обработки ошибок  hot code reload, try/catch, linked processes, supervisors

Page 32: Erlang

Горячее обновление кода, работа 24/7/365 без остановки для апгрейда

Сопоставление с образцом, замыкания, функции высшего порядка, лямбда-функции

Let it fail

Page 33: Erlang

Для чего можно применять...

Page 34: Erlang

Высоконагруженные web-приложения и сетевые сервисы (СМО) 

Управление распределенными инфраструктурами и системами

Взаимодействие с встраиваемыми устройствами

Интеграция разнородных информационных систем с различными протоколами общения

Page 35: Erlang

...и для чего применять не стоит

Page 36: Erlang

Толстые клиенты и GUI-приложения

Каждодневные задачкиу нас для этого есть Python и bash

Математические вычисления

Page 37: Erlang

Научить языку за 30 минут? Издеваешься?

У наших менеджеров это не пройдет!

Page 38: Erlang

Сначала поставим Эрланг

wget http://www.erlang.org/download/otp_src_R14B04.tar.gztar xf otp_src_R14B04.tar.gzcd otp*./configuremakesudo make install

в Windows: просто скачиваем инсталятор с сайта

Page 39: Erlang

У нас есть волшебный rebar! mkdir myappcd myappwget http://bitbucket.org/basho/rebar/downloads/rebarchmod u+x rebar./rebar create-app appid=myapp ./rebar compile ./rebar clean

Page 40: Erlang

Структура каталога

./deps

./priv

./include

./ebin:myapp.app  myapp_app.beam  myapp_sup.beam

./src:myapp_app.erlmyapp.app.srcmyapp_sup.erl

rebar

.app - конфигурация

.beam - байт-код

.erl - исходный код

.hrl - заголовочный файл

 Запускаем:erl -pa ebin

Eshell V5.8.4  (abort with ^G)1> application:start(myapp).

Page 41: Erlang

erlErlang R14B03 (erts-5.8.4) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.4  (abort with ^G)1>

Ctrl + GUser switch command --> ?  c [nn]            - connect to job  i [nn]            - interrupt job  k [nn]            - kill job  j                 - list all jobs  s [shell]         - start local shell  r [node [shell]]  - start remote shell  q        - quit erlang  ? | h             - this message

Crtl + CBREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded       (v)ersion (k)ill (D)b-tables (d)istribution

Page 42: Erlang

Типы • числа — 2, 42, 10.9E-2, 8.48• атомы — ok, true, error, whatever• кортежи — {1, ok, {error, 404}, Root, 33}

• списки — [1,2,3] [1,[2,3]] [{param, 40}] [H|T]

• строки — "root" , [114,111,111,116]

Page 43: Erlang

• записи — record(user {login = undefine, password = undefine}), User#user{ login = "root"} 

• бинарные данные — <<A, B, C:16>>, <<A/binary, "--", B/binary>>

• идентификаторы процессов — <0.58.0>• булева логика — true, false • функции — #Fun<erl_eval.6.39074546>

Page 44: Erlang

Переменные — неизменяемые! 1> K = 1.12> K = 2.** exception error: no match of right hand side value 2 

Переменные • пишутся с большой буквы• область видимости — в пределах правила плюс

замыкания

Page 45: Erlang

Операции

Сравнение==, /=, =<, <, >=, >, =:=, =/=

Арифметика+, -, *, /, bnot, div, rem, band, bor,

bxor, bsl, bsr Логика

not, and, or, xor

Списки++, --

Page 46: Erlang

Хвостовая рекурсия loop(N) ->    io:format("~w~n", [N]),    loop(N+1).  BIF (встроенные функции)

1> tuple_size({a,b,c}).32> atom_to_list('Erlang')."Erlang"

Page 47: Erlang

Соответствие образцу (pattern matching)

f({connect,From,To,Number,Options}, To) ->    Signal = {connect,From,To,Number,Options},    ...;f(Signal, To) ->    ignore.

f({connect,_,To,_,_} = Signal, To) ->    ...;f(Signal, To) ->    ignore.

1> {A, B} = {answer, 42}.{answer,42}2> A.answer3> {C, D} = [1, 2].** exception error: no match of right hand side value [1,2]

Page 48: Erlang

Функцииfib(0) -> 0 ; fib(1) -> 1 ; fib(N) when N > 0 -> fib(N-1) + fib(N-2).

Вызывать будем так> fib(15). 610

Ну а можно делать такCallback = fun(A) -> io:format("~p~n", [A]) end. > Callback("abc")."abc"ok

Page 49: Erlang

Но вообще за такие реализации могут и побить

Правильно:

fib(N) -> fib(N-1,1,1).fib(0,_,B) -> B;fib(N,A,B) -> fib(N-1,B,A+B).

Page 50: Erlang

Ха, а что нам мешает делать анонимные функции и использовать в функциях высшего порядка?

> lists:map(fun(A) -> A * 2 end, [1,2,3]).[2,4,6]

Высшего порядка - map(), filter(), reduce(), foldl(), foldr().

Но вот конкретно этот случай можно написать еще красивее:> [X*2 || X <- [1,2,3]].[2,4,6]

Это List Comprehensions  ([выражение || генераторы])

> [X*Y|| X <- [1,2,3], Y <-[2,3,4]].[2,3,4,4,6,8,6,9,12]

Page 51: Erlang

Ветвления

case Expr of    Pattern1 [when GuardSeq1] ->        Body1;    ...;    PatternN [when GuardSeqN] ->        BodyNend

есть и if, но это по сути тот же case

Page 52: Erlang

Исключения  try Exprs of    Pattern1 [when GuardSeq1] -> Body1;    ...;    PatternN [when GuardSeqN] -> BodyNcatch    ExceptionPattern1  -> ExceptionBody1;    ...;    ExceptionPatternN -> ExceptionBodyNafter    AfterBodyend

Page 53: Erlang

За бортом• бинарные операции• преобразование типов• пограничные условия• препроцессор

ДОМАШНЕЕ ЗАДАНИЕ!

Page 54: Erlang

Процессы

— легковесные

— изолированные

— неблокирующие

— без общей памяти

Больше процессов, хороших и разных!

Page 55: Erlang

Порождение Pid = spawn(?MODULE, raising, [3, 10, 10]).

Pid — идентификатор процесса и может отличатся на разных нодах

Me = self(). %% текущий процесс

Page 56: Erlang

Передать сообщение

Pid ! {self(), hi}.

 Получить

receive    {Pid, hi} -> Pid ! hello;    OtherMessage ->  io:format(“I received        some strange message: ~p~n”,         [OtherMessage])end.

Page 57: Erlang

— Its a trap!

А если вдруг процесс  завершился или умер?

link(Pid) exit("We all die!")

Page 58: Erlang

gen_server gen_supervisor

OTP (Open Telecom Platform)

Page 59: Erlang

А теперь представим, что у нас не один сервер, а тысяча!

Правильно запустим erl% erl -name dilbert([email protected])1> node().'[email protected]'

у нас есть печеньки!$HOME/.erlang.cookieerlang:set_cookie(node(), Cookie) и пинговалка!net_adm:ping(Node).

Теперь можно грабить корованы!spawn(Node, Fun)spawn(Node, Module, FunctionName, Args)

Page 60: Erlang

У всех свои недостатки!

Как, я не смогу на Эрланге грабить корованы?

Page 61: Erlang

Недостатки?

Ну, кроме того, что нужно вывихнуть мозг

Page 62: Erlang

В десять раз медленнее Си (но зависит от задачи и алгоритмов)

Странный и местами устаревший синтаксис

Медленная математика

Строки — это список байт

Динамическая типизация

Неизменяемость данных зачастую влияет на выбор и асимптотику алгоритмов

Page 63: Erlang

Да, возьмите меня в свою секту!

Я тоже хочу делать сервисы на миллионы пользователей!

Page 64: Erlang

Книги

Page 65: Erlang
Page 66: Erlang
Page 67: Erlang
Page 68: Erlang

Ресурсы

Page 69: Erlang

http://www.erlang.org/ http://erlanger.ru/ http://groups.google.com/group/erlang-russian http://www.tryerlang.org/ http://erldocs.com/ http://learnyousomeerlang.com/

Page 70: Erlang

Журнал "Практика функционального программирования"

http://fprog.ru/

Page 71: Erlang

Гуру

Page 72: Erlang

Лев Валкинразработчик, стартапер, организатор fprog.ru

http://lionet.livejournal.com/

Максим Лапшин разработчик erlyvideo

http://levgem.livejournal.com/

Дмитрий Димандтсоздатель erlanger.ru

http://erlanger.ru/

Page 73: Erlang

Вопросы в лоб

И помидоры в башню

@mkrentovskiyhttp://devimpress.com/