Upload
maxim-sokhatsky
View
8.894
Download
1
Embed Size (px)
Citation preview
Erlang
Мгновенное ПросветлениеОбучающий курс
@5HT
ErlangЛекция 1. Место языка в современном мире функционального программирования
На чем делать кошерный проект?
Экосистема JVM
Scala MLClojure Lisp
Без ограничений
Haskell MLOCaml MLErlang Prolog
FFI
ANSI С
Haskell
● Сложная задача● Нужно не потеряться в коде● Все партнеры Суперзвезды● Необходима мощная система типов
Успешные области применения:Микротранзакции, FPGA моделирование, уникальные утилиты, создание DSL
Консалтинг: WellTyped, LLC
Scala
● Мощная система типов● JVM экосистема● Akka легковесные процессы● Кровавый энтерпрайз
Успешные области применения:Бэкенды, Веб, Оркестрация Java сервисов
Консалтинг: TypeSafe, Inc.
OCaml
● Cупербыстрота как С++ или выше● Низкий вход за счет ООП● Первоклассные типы● ML-классика
Успешные области применения:Банковская сфера, сложные алгоритмы, построение DSL
Консалтинг: OCamlPro SAS
Erlang
● Суперпростой и масштабируемый● Супернадежный soft real-time● Оркестрация кластера
Успешные области применения:Веб, Телеком, GSM, Интернет сервисы, Месаджинг, DHT
Консалтинг: Synrc Research Center s.r.o.
Промышленность
Haskell 2006— наиболее академичныйOCaml 1996 — маргинальная классикаScala 2004 — на пути к замене JavaErlang 1986 — наиболее промышленный
Erlang — единстенный динамически-типизированный язык среди рассмотреных. Но грустить рано, смотрим на расклад.
MQ сервера
○ FioranoMQ JMS○ Tibco JMS○ WebSphere JMS○ RabbitMQ AMQP
MQ сервер — сердце кластера. Один из самых быстрых MQ — RabbitMQ — имплементация бинарного AMQP протокола разработаного в JP Morgan.
KV сервера
C/C++: Redis AP, MongoDB APJava: Oracle Cache Coherence AP, Cassandra CA, Hadoop CAErlang: Riak AP, CouchDB AP, Hibari AP, KAI AP, LeoFS AP, Mnesia CA
Как не странно, больше всего реализаций DHT именно на Erlang. В основном это из-за прозрачности распределенного кода.
WEB Сервера
Кот* создавал сайты на Erlang ?
● Lift Scala● Happstack Haskell● Eliom OCaml● Nitrogen Erlang
Нитроген является самым простым и больше всего подходит для huyak-huyak in production development process.* — https://groups.google.com/forum/#!topic/erlang-russian/p6GOpPx03YM
Кто использует Erlang
● Ericsson
● T-Mobile
● Telia
● Klarna
● Amazon SimpleDB
● Facebook Chat
● Github Pages
● ShoreTel M5
Современный Erlang стек
● Erlang/OTP устройчивая среда
● Riak надежное Key-Value хранилище
● RabbitMQ промышленный Pub/Sub
● Nitrogen суперпростой веб фреймворк
● Cowboy самый быстрый веб сервер
● GProc распределенный реестр
ErlangЛекция 2. Обзор решений, принятых при разработке языка
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
● Preemptive (Erlang, Sparks)● Cooperative (Lwt, Sparks, Akka)
Erlang считает редукции и сам переключает контексты процессов (1.5К). Sparks переключаются только когда требуется память. Остальные модели актёров (Lwt, Akka) планируются кооперативными планировщиками.
Task Switching
Shared State
● Нет разделяемой памяти. Рай.● Разделяемая памать. Java.● Разделяемые состояния и память. Ад.
Erlang посылает сообщения в процессы не используя мютекстов, все происходит за атомарное изменение указателя очереди. Хип процесса изолирован и собирается GC в выделеное для этого время.
Interconnection
● TCP● SCTP
Simplicity and Openness
● Go https://github.com/goerlang● Ocaml https://github.com/khigia/erlocaml● Scala https://github.com/boundary/scalang
Heterogeneity and Interoperability
● NIF (C FFI, leveldb, shmem, сuda)● Ports (Fast High Level Right Way)● Distribution Protocol (ETF)
Если надо подключить существующую C библиотеку лучше это сделать через NIF. В случае взаимодействия с внешними системами напрямую через Ports. Если хочеться хардкора через dist протокол.
ErlangЛекция 3. Введение в язык и примеры программ
Атомарные типы
Integer 42 длинная арифметикаFloat 4.2 doubleAtom ok Reference #Ref<0.0.0.29>Binary <<"maxim">>Pid <0.0.42>Port #Port<0.42>Fun #Fun<erl_eval.6.82930912>
Составные типы
List [<<42,1,0,90>>,1,ok]Tuple {<0.0.16>,107,42,["maxim",true]}
Можно типизировать кортежи и требовать, чтобы все элементы списка были одного типа. Строки — списки. Поэтому работа со строками в Erlang медленная, нужно стараться работать с бинарными данными.
Чат на Нитрогене...
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();");
... выглядит просто
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().
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 уже на второй неделе.
XML < > Suck and Blow
● Текстовый формат● 10% времени на парсинг● Много ошибок при ручном парсинге
XML нужен только для связи с внешними системами. Нет смысла использовать внутри своей системы XML.
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 году на службе телекомов по сей день.
Свободные ASN компиляторы
● Erlang (Ericsson)● asn1c (Lev Walkin)
Свободных ASN компиляторов не так и много. Erlang — это лучший инструмент для оркестрации сервисов, где данные определяются c помощью ASN.1
Как с этим работать ?
SP DEFINITIONS AUTOMATIC TAGS ::=BEGINMessage ::= SEQUENCE { version INTEGER DEFAULT 1,
type MsgType, body Body }
MsgType ::= ENUMERATED { public(0), private(1), tralala(2) }Body ::= OCTET STRINGEND
$ erlc SP.asn
И в Эрланг консоли
1> {ok, Bin} = 'SP':encode('Message', #'Message'{version = 3, type = private, body = "Hello, ASN.1"}).
{ok,[48,20,128,1,3,129,1,1,130,12,72,101,108,108,111,44,32,65,83,78,46,49]}
1> 'SP':decode('Message', Bin).{ok,#'Message'{version = 3,type = private, body = "Hello, ASN.1"}}
ErlangСеминар 1. Практическое занятие. LDAP сервер
ErlangЛекция 4. Управление релизами, деплой и обновление кота
ErlangСеминар 2. Чат на Cowboy и вебсокетах
ErlangСеминар 3. Демонстрация продакшин системы как оно есть
ErlangЛекция 5. Будущее. Виртуализация и работа в Xen