Slide 1

Slide 1 text

Erlang Мгновенное Просветление Обучающий курс @5HT

Slide 2

Slide 2 text

Erlang Лекция 1. Место языка в современном мире функционального программирования

Slide 3

Slide 3 text

На чем делать кошерный проект? Экосистема JVM Scala ML Clojure Lisp Без ограничений Haskell ML OCaml ML Erlang Prolog FFI ANSI С

Slide 4

Slide 4 text

Haskell ● Сложная задача ● Нужно не потеряться в коде ● Все партнеры Суперзвезды ● Необходима мощная система типов Успешные области применения: Микротранзакции, FPGA моделирование, уникальные утилиты, создание DSL Консалтинг: WellTyped, LLC

Slide 5

Slide 5 text

Scala ● Мощная система типов ● JVM экосистема ● Akka легковесные процессы ● Кровавый энтерпрайз Успешные области применения: Бэкенды, Веб, Оркестрация Java сервисов Консалтинг: TypeSafe, Inc.

Slide 6

Slide 6 text

OCaml ● Cупербыстрота как С++ или выше ● Низкий вход за счет ООП ● Первоклассные типы ● ML-классика Успешные области применения: Банковская сфера, сложные алгоритмы, построение DSL Консалтинг: OCamlPro SAS

Slide 7

Slide 7 text

Erlang ● Суперпростой и масштабируемый ● Супернадежный soft real-time ● Оркестрация кластера Успешные области применения: Веб, Телеком, GSM, Интернет сервисы, Месаджинг, DHT Консалтинг: Synrc Research Center s.r.o.

Slide 8

Slide 8 text

Промышленность Haskell 1998 — наиболее академичный OCaml 1996 — маргинальная классика Scala 2004 — на пути к замене Java Erlang 1986 — наиболее промышленный Erlang — единстенный динамически- типизированный язык среди рассмотреных. Но грустить рано, смотрим на расклад.

Slide 9

Slide 9 text

MQ сервера ○ FioranoMQ JMS ○ Tibco JMS ○ WebSphere JMS ○ RabbitMQ AMQP MQ сервер — сердце кластера. Один из самых быстрых MQ — RabbitMQ — имплементация бинарного AMQP протокола разработаного в JP Morgan.

Slide 10

Slide 10 text

KV сервера C/C++: Redis AP, MongoDB AP Java: Oracle Cache Coherence AP, Cassandra CA, Hadoop CA Erlang: Riak AP, CouchDB AP, Hibari AP, KAI AP, LeoFS AP, Mnesia CA Как не странно, больше всего реализаций DHT именно на Erlang. В основном это из-за прозрачности распределенного кода.

Slide 11

Slide 11 text

WEB Сервера

Slide 12

Slide 12 text

Кот* создавал сайты на Erlang ? ● Lift Scala ● Happstack Haskell ● Eliom OCaml ● Nitrogen Erlang Нитроген является самым простым и больше всего подходит для agile-agile in production development process. * — https://groups.google.com/forum/#!topic/erlang-russian/p6GOpPx03YM

Slide 13

Slide 13 text

Кто использует Erlang ● Ericsson ● T-Mobile ● Telia ● Klarna ● Amazon SimpleDB ● Facebook Chat ● Github Pages ● WhatsApp ● ShoreTel M5

Slide 14

Slide 14 text

Современный Erlang стек ● Erlang/OTP устройчивая среда ● Riak надежное Key-Value хранилище ● RabbitMQ промышленный Pub/Sub ● Nitrogen суперпростой веб фреймворк ● Cowboy самый быстрый веб сервер ● GProc распределенный QLC реестр

Slide 15

Slide 15 text

Erlang Лекция 2. Обзор решений, принятых при разработке языка

Slide 16

Slide 16 text

Майк Вильямс, соавтор Erlang: Цели при разработке языка: ● Разрабатывать быстро и эффективно ● Устойчивость к сбоям оборудования ● Возможность обновлять код на лету

Slide 17

Slide 17 text

Parallelism and Concurrency ● Shared State (C++, Java) ● STM (Haskell, Clojure) ● Message Passing (Erlang, Haskell, Scala) ● Parallel composition (Spawn) ● Communication (Channels) ● Sequential Composition (Monadic) Process Calculus

Slide 18

Slide 18 text

● Preemptive (Erlang, Sparks) ● Cooperative (Lwt, Sparks, Akka) Erlang считает редукции и сам переключает контексты процессов (1.5К). Sparks переключаются только когда требуется память. Остальные модели актёров (Lwt, Akka) планируются кооперативными планировщиками. Task Switching

Slide 19

Slide 19 text

Shared State ● Нет разделяемой памяти. Рай. ● Разделяемая памать. Java. ● Разделяемые состояния и память. Ад. Erlang посылает сообщения в процессы не используя мютекстов, все происходит за атомарное изменение указателя очереди. Хип процесса изолирован и собирается GC в выделеное для этого время.

Slide 20

Slide 20 text

Heterogeneity and Interoperability ● NIF (C FFI, leveldb, shmem, сuda) ● Ports (Fast High Level Right Way) ● Distribution Protocol (ETF) Если надо подключить существующую C библиотеку лучше это сделать через NIF. В случае взаимодействия с внешними системами напрямую через Ports. Если хочеться хардкора — через dist протокол.

Slide 21

Slide 21 text

Ports Example Shell: cat song.mp3 | /opt/local/bin/ffmpeg -f mp3 -i - -acodec libfaac -f flv - > dan.flv Erlang: {ok, Bin} = file:read_file("song.mp3"), Port = open_port({spawn, "/opt/local/bin/ffmpeg -f mp3 -i - - acodec libfaac -f flv -"}, [binary, use_stdio, stream]), <> = Bin, Port ! {self(), {command, Data}}

Slide 22

Slide 22 text

Interconnection ETF ● TCP ● SCTP Simplicity and Openness ● Go https://github.com/goerlang ● Ocaml https://github.com/khigia/erlocaml ● Scala https://github.com/boundary/scalang

Slide 23

Slide 23 text

Erlang Лекция 1Б. Введение в язык и примеры программ

Slide 24

Slide 24 text

Атомарные типы Integer 42 длинная арифметика Float 4.2 double Atom ok Reference #Ref<0.0.0.29> Binary <<"maxim">> Pid <0.0.42> Port #Port<0.42> Fun #Fun

Slide 25

Slide 25 text

Составные типы List [<<42,1,0,90>>,1,ok] Tuple {<0.0.16>,107,42,["maxim",true]} Можно типизировать кортежи и требовать, чтобы все элементы списка были одного типа. Строки — списки. Поэтому работа со строками в Erlang медленная, нужно стараться работать с бинарными данными.

Slide 26

Slide 26 text

Строки и Списки и Генераторы "string" = [$s, $t, $r, $i, $n, $g]. "string" = [115, 116, 114, 105, 110, 103]. A = [ X || lists:seq(100,136)]. rp(A). [H|T] = [1,2,3,4]. H = 1. T = [2,3,4].

Slide 27

Slide 27 text

Сахар для кортежей -record(contact, { name, mail, surname }). fake_contacts() -> [ #contact{name="Maxim", mail="[email protected]"}, #contact{name="Andrew", mail="[email protected]"} ]. replace_email(#contact{} = Contact, Email) -> Contact#contact{email = Email}. rr(Module). % загрузить все описания кортежей

Slide 28

Slide 28 text

Процессы -module(sandbox). -compile(export_all). -record(state, { author = "Maxim"}). start() -> Pid = spawn(sandbox,looper,[#state{}]). looper(State = #state{}) -> receive print -> error_logger:info_msg("Print State: ~p",[State]); Command -> error_logger:info_msg("Unknown: ~p",[Command]) end, looper(State).

Slide 29

Slide 29 text

Матчинг и Биндинг {{Year, Month, Day}, {Hour, Min, Sec}} = calendar:local_time(). DT = {{Year, Month, Day}, {Hour, Min, Sec}}. Year = 2013. Month = 4. Day = 13. Hour = 12. Min = 15. Sec = 35. io:write("Datetime: ~p",[DT]).

Slide 30

Slide 30 text

Парсинг TCP заголовка <> = TcpBuf.

Slide 31

Slide 31 text

Чат на Нитрогене... body() -> wf:comet_global(fun() -> chat_loop() end, chat), [ #panel { id=chatHistory, class=chat_history }, #textbox { id=messageTextBox, next=sendButton }, #button { id=send, text="Send", postback=chat } ]. event(chat) -> Usrname = wf:q(userNameTextBox), Msg = wf:q(messageTextBox), wf:send_global(chat, {message, Usname, Msg}), wf:wire("obj('messageTextBox').focus();" "obj('messageTextBox').select();");

Slide 32

Slide 32 text

... выглядит просто chat_loop() -> receive {message, Username, Message} -> Terms = [#span { text=Username, class=username }, ": ", #span { text=Message, class=message } ], wf:insert_bottom(chatHistory, Terms), wf:wire("obj('chatHistory').scrollTop = " "obj('chatHistory').scrollHeight;"), wf:flush() end, chat_loop().

Slide 33

Slide 33 text

RLE декомпрессия еще проще -module(rle). -compile(export_all). drle([]) -> []; drle([H|L]) when H<192 -> [H,drle(L)]; drle([H,X|L]) -> [lists:duplicate(H-192,X),drle(L)]. Любой кто писал на Python, PHP, Perl, Ruby может писать на Erlang уже на второй неделе.

Slide 34

Slide 34 text

XML < > Suck and Blow ● Текстовый формат ● 10% времени на парсинг ● Много ошибок при ручном парсинге XML нужен только для связи с внешними системами. Нет смысла использовать внутри своей системы XML.

Slide 35

Slide 35 text

ASN.1 ● BER - LDAP, SNMP, PKCS#7, GSM TAP, ISDN, UMTS ● DER - X.509 Certs and Keys ● XER - XML encoding ● ECN - Bluetooth, UMTS RRC, GPRS, GSM, SS7 ASN.1 разработанный в 1984 году на службе телекомов по сей день.

Slide 36

Slide 36 text

Свободные ASN компиляторы ● Erlang (Ericsson) ● asn1c (Lev Walkin) Свободных ASN компиляторов не так и много. Erlang — это лучший инструмент для оркестрации сервисов, где данные определяются c помощью ASN.1