Erlang
-
Upload
getdevnet -
Category
Technology
-
view
1.043 -
download
5
description
Transcript of Erlang
Erlang — просто еще один способ прострелить себе
ногу
Зачем нужно учить еще один язык программирования?
Почему бы сразу не пойти на курсы MBA?
Расширение сознания
От написания кода до дурдома не так далеко
Хорошего кода должно быть мало!
— его меньше писать
— его легче читать
— его просто изменять
Идеальный код - код, которого не существует!
Папа, ты можешь потратить свою жизнь на меня, а не на борьбу со сторонними эффектами
Еще один инструмент в копилку
Изобретениеи
переизобретения велосипедов
Велосипедов есть много и разных
Изобретение велосипеда — это не самый плохой
поступок
но не для ленивых...
Да и зачем изобретать, когда это уже есть
с выдержкой в продакшене на 25 лет, например
Выпендриваться при приеме на работу
А чего они как эти?
«Хорошие программисты думают перед тем, как писать программу, особенно если в коде используются указатели. Например, если нужно перевернуть связный список, хороший кандидат непременно нарисует сбоку, откуда и куда идут указатели. Он просто вынужден это сделать, ибо человек не в силах написать код, переворачивающий связный список, не нарисовав маленькие квадратики со стрелочками между ними. Плохой программист начнет писать сразу.»
Джоель Спольскигуру интервьюриования
И не забудем любимый вопрос «Почему канализационные люки круглые ?»
«Ну а правда, что может сделать честный человек в возрасте, близком к 33 годам, если его вдруг спросят на собеседовании про наследование квадрата от прямоугольника, объектную декомпозицию автомобиля, форму канализационного люка, остров лжецов или три лампочки в туалете? Ну или какой-нибудь вопрос про толкования какого-нибудь паттерна GoF ? Мне кажется, бить надо наверняка, ну, смотреть по обстановке - можно резко придвинуть стол, заблокировав собеседника и аргументировать локтями сверху, или воспользоваться стулом, если он достаточно крепкий и массивный...»
@dmzразработчик компиляторовфункциональщикзнаток множества страшных слов
— Напишите, пожалуйста, обращение списка.— На каком языке?— Да все равно...* * - но на самом деле не все равно. :-)
Полный дзен«Сейчас мы придумаем специализированный язык, опишем его грамматику и в его терминах решим предложенную задачу.»
Первый вариантreverse([]) -> [];reverse([X]) -> [X];reverse([X|T]) -> reverse(T) ++ [X].
Второй вариантlists:reverse([1,2,3]).
Ну и еще это просто весело!
ну и деньги, девушки, все такое...
Что такое Erlang и на кой он нужен?
И почему его адепты ненавидят node.js?
История
Агнер Краруп Эрланг (англ. Agner Krarup Erlang; 1 января 1878, Лонборг, Дания — 3 февраля, 1929) — датский математик, статистик и инженер, основатель научного направления по изучению трафика в телекоммуникационных системах и теории массового обслуживания.
Эрлангом была получена формула для расчета доли вызовов, получающих обслуживание на сельской телефонной станции и кому придется ожидать пока делаются внешние вызовы.
Robert Virding
Joe Armstrong
...и еще с десяток человек.
Mike Williams
Что написано?
Кто использует?
Основные свойства
Декларативность
Неизменяемость данных и автоматическая сборка мусора
Легкие процессы, обмен сообщениями никакой общей памяти
Несколько ортогональных инструментов обработки ошибок hot code reload, try/catch, linked processes, supervisors
Горячее обновление кода, работа 24/7/365 без остановки для апгрейда
Сопоставление с образцом, замыкания, функции высшего порядка, лямбда-функции
Let it fail
Для чего можно применять...
Высоконагруженные web-приложения и сетевые сервисы (СМО)
Управление распределенными инфраструктурами и системами
Взаимодействие с встраиваемыми устройствами
Интеграция разнородных информационных систем с различными протоколами общения
...и для чего применять не стоит
Толстые клиенты и GUI-приложения
Каждодневные задачкиу нас для этого есть Python и bash
Математические вычисления
Научить языку за 30 минут? Издеваешься?
У наших менеджеров это не пройдет!
Сначала поставим Эрланг
wget http://www.erlang.org/download/otp_src_R14B04.tar.gztar xf otp_src_R14B04.tar.gzcd otp*./configuremakesudo make install
в Windows: просто скачиваем инсталятор с сайта
У нас есть волшебный rebar! mkdir myappcd myappwget http://bitbucket.org/basho/rebar/downloads/rebarchmod u+x rebar./rebar create-app appid=myapp ./rebar compile ./rebar clean
Структура каталога
./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).
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
Типы • числа — 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]
• записи — 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>
Переменные — неизменяемые! 1> K = 1.12> K = 2.** exception error: no match of right hand side value 2
Переменные • пишутся с большой буквы• область видимости — в пределах правила плюс
замыкания
Операции
Сравнение==, /=, =<, <, >=, >, =:=, =/=
Арифметика+, -, *, /, bnot, div, rem, band, bor,
bxor, bsl, bsr Логика
not, and, or, xor
Списки++, --
Хвостовая рекурсия loop(N) -> io:format("~w~n", [N]), loop(N+1). BIF (встроенные функции)
1> tuple_size({a,b,c}).32> atom_to_list('Erlang')."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]
Функции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
Но вообще за такие реализации могут и побить
Правильно:
fib(N) -> fib(N-1,1,1).fib(0,_,B) -> B;fib(N,A,B) -> fib(N-1,B,A+B).
Ха, а что нам мешает делать анонимные функции и использовать в функциях высшего порядка?
> 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]
Ветвления
case Expr of Pattern1 [when GuardSeq1] -> Body1; ...; PatternN [when GuardSeqN] -> BodyNend
есть и if, но это по сути тот же case
Исключения try Exprs of Pattern1 [when GuardSeq1] -> Body1; ...; PatternN [when GuardSeqN] -> BodyNcatch ExceptionPattern1 -> ExceptionBody1; ...; ExceptionPatternN -> ExceptionBodyNafter AfterBodyend
За бортом• бинарные операции• преобразование типов• пограничные условия• препроцессор
ДОМАШНЕЕ ЗАДАНИЕ!
Процессы
— легковесные
— изолированные
— неблокирующие
— без общей памяти
Больше процессов, хороших и разных!
Порождение Pid = spawn(?MODULE, raising, [3, 10, 10]).
Pid — идентификатор процесса и может отличатся на разных нодах
Me = self(). %% текущий процесс
Передать сообщение
Pid ! {self(), hi}.
Получить
receive {Pid, hi} -> Pid ! hello; OtherMessage -> io:format(“I received some strange message: ~p~n”, [OtherMessage])end.
— Its a trap!
А если вдруг процесс завершился или умер?
link(Pid) exit("We all die!")
gen_server gen_supervisor
OTP (Open Telecom Platform)
А теперь представим, что у нас не один сервер, а тысяча!
Правильно запустим 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)
У всех свои недостатки!
Как, я не смогу на Эрланге грабить корованы?
Недостатки?
Ну, кроме того, что нужно вывихнуть мозг
В десять раз медленнее Си (но зависит от задачи и алгоритмов)
Странный и местами устаревший синтаксис
Медленная математика
Строки — это список байт
Динамическая типизация
Неизменяемость данных зачастую влияет на выбор и асимптотику алгоритмов
Да, возьмите меня в свою секту!
Я тоже хочу делать сервисы на миллионы пользователей!
Книги
Ресурсы
http://www.erlang.org/ http://erlanger.ru/ http://groups.google.com/group/erlang-russian http://www.tryerlang.org/ http://erldocs.com/ http://learnyousomeerlang.com/
Журнал "Практика функционального программирования"
http://fprog.ru/
Гуру
Лев Валкинразработчик, стартапер, организатор fprog.ru
http://lionet.livejournal.com/
Максим Лапшин разработчик erlyvideo
http://levgem.livejournal.com/
Дмитрий Димандтсоздатель erlanger.ru
http://erlanger.ru/
Вопросы в лоб
И помидоры в башню
@mkrentovskiyhttp://devimpress.com/