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
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 протокол.
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].
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