3. На чем делать кошерный проект?
Экосистема JVM Без ограничений
Scala ML Haskell ML
Clojure Lisp OCaml ML
Erlang Prolog
FFI
ANSI С
4. Haskell
● Сложная задача
● Нужно не потеряться в коде
● Все партнеры Суперзвезды
● Необходима мощная система типов
Успешные области применения:
Микротранзакции, FPGA моделирование,
уникальные утилиты, создание DSL
Консалтинг: WellTyped, LLC
5. Scala
● Мощная система типов
● JVM экосистема
● Akka легковесные процессы
● Кровавый энтерпрайз
Успешные области применения:
Бэкенды, Веб, Оркестрация Java сервисов
Консалтинг: TypeSafe, Inc.
6. OCaml
● Cупербыстрота как С++ или выше
● Низкий вход за счет ООП
● Первоклассные типы
● ML-классика
Успешные области применения:
Банковская сфера, сложные алгоритмы,
построение DSL
Консалтинг: OCamlPro SAS
7. Erlang
● Суперпростой и масштабируемый
● Супернадежный soft real-time
● Оркестрация кластера
Успешные области применения:
Веб, Телеком, GSM, Интернет сервисы,
Месаджинг, DHT
Консалтинг: Synrc Research Center s.r.o.
8. Промышленность
Haskell 2006— наиболее академичный
OCaml 1996 — маргинальная классика
Scala 2004 — на пути к замене Java
Erlang 1986 — наиболее промышленный
Erlang — единстенный динамически-
типизированный язык среди рассмотреных.
Но грустить рано, смотрим на расклад.
9. MQ сервера
○ FioranoMQ JMS
○ Tibco JMS
○ WebSphere JMS
○ RabbitMQ AMQP
MQ сервер — сердце кластера. Один из
самых быстрых MQ — RabbitMQ —
имплементация бинарного AMQP
протокола разработаного в JP Morgan.
10. 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. В основном это из-за
прозрачности распределенного кода.
12. Кот* создавал сайты на Erlang ?
● Lift Scala
● Happstack Haskell
● Eliom OCaml
● Nitrogen Erlang
Нитроген является самым простым и
больше всего подходит для huyak-huyak in
production development process.
* — https://groups.google.com/forum/#!topic/erlang-russian/p6GOpPx03YM
13. Кто использует Erlang
● Ericsson ● Amazon SimpleDB
● T-Mobile ● Facebook Chat
● Telia ● Github Pages
● Klarna ● WhatsApp
● ShoreTel M5
16. Parallelism and Concurrency
● Shared State (C++, Java)
● STM (Haskell, Clojure)
● Message Passing (Erlang, Haskell, Scala)
Process Calculus
● Parallel composition (Spawn)
● Communication (Channels)
● Sequential Composition (Monadic)
17. Task Switching
● Preemptive (Erlang, Sparks)
● Cooperative (Lwt, Sparks, Akka)
Erlang считает редукции и сам переключает
контексты процессов (1.5К). Sparks
переключаются только когда требуется
память. Остальные модели актёров (Lwt,
Akka) планируются кооперативными
планировщиками.
18. Shared State
● Нет разделяемой памяти. Рай.
● Разделяемая памать. Java.
● Разделяемые состояния и память. Ад.
Erlang посылает сообщения в процессы не
используя мютекстов, все происходит за
атомарное изменение указателя очереди.
Хип процесса изолирован и собирается GC в
выделеное для этого время.
19. Interconnection
● TCP
● SCTP
Simplicity and Openness
● Go https://github.com/goerlang
● Ocaml https://github.com/khigia/erlocaml
● Scala https://github.com/boundary/scalang
20. Heterogeneity and Interoperability
● NIF (C FFI, leveldb, shmem, сuda)
● Ports (Fast High Level Right Way)
● Distribution Protocol (ETF)
Если надо подключить существующую C
библиотеку лучше это сделать через NIF. В
случае взаимодействия с внешними
системами напрямую через Ports. Если
хочеться хардкора через dist протокол.
22. Атомарные типы
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<erl_eval.6.82930912>
23. Составные типы
List [<<42,1,0,90>>,1,ok]
Tuple {<0.0.16>,107,42,["maxim",true]}
Можно типизировать кортежи и требовать,
чтобы все элементы списка были одного
типа. Строки — списки. Поэтому работа со
строками в Erlang медленная, нужно
стараться работать с бинарными данными.
26. 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 уже на второй
неделе.
27. XML < > Suck and Blow
● Текстовый формат
● 10% времени на парсинг
● Много ошибок при ручном парсинге
XML нужен только для связи с внешними
системами. Нет смысла использовать
внутри своей системы XML.
28. 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 году на
службе телекомов по сей день.
29. Свободные ASN компиляторы
● Erlang (Ericsson)
● asn1c (Lev Walkin)
Свободных ASN компиляторов не так и
много. Erlang — это лучший инструмент для
оркестрации сервисов, где данные
определяются c помощью ASN.1
30. Как с этим работать ?
SP DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
Message ::= SEQUENCE { version INTEGER DEFAULT 1,
type MsgType, body Body }
MsgType ::= ENUMERATED { public(0), private(1), tralala(2) }
Body ::= OCTET STRING
END
$ erlc SP.asn
31. И в Эрланг консоли
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"}}