Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Erlang Instant Enlightenment

Erlang Instant Enlightenment

Namdak Tonpa

March 15, 2013
Tweet

More Decks by Namdak Tonpa

Other Decks in Programming

Transcript

  1. На чем делать кошерный проект? Экосистема JVM Scala ML Clojure

    Lisp Без ограничений Haskell ML OCaml ML Erlang Prolog FFI ANSI С
  2. Haskell • Сложная задача • Нужно не потеряться в коде

    • Все партнеры Суперзвезды • Необходима мощная система типов Успешные области применения: Микротранзакции, FPGA моделирование, уникальные утилиты, создание DSL Консалтинг: WellTyped, LLC
  3. Scala • Мощная система типов • JVM экосистема • Akka

    легковесные процессы • Кровавый энтерпрайз Успешные области применения: Бэкенды, Веб, Оркестрация Java сервисов Консалтинг: TypeSafe, Inc.
  4. OCaml • Cупербыстрота как С++ или выше • Низкий вход

    за счет ООП • Первоклассные типы • ML-классика Успешные области применения: Банковская сфера, сложные алгоритмы, построение DSL Консалтинг: OCamlPro SAS
  5. Erlang • Суперпростой и масштабируемый • Супернадежный soft real-time •

    Оркестрация кластера Успешные области применения: Веб, Телеком, GSM, Интернет сервисы, Месаджинг, DHT Консалтинг: Synrc Research Center s.r.o.
  6. Промышленность Haskell 1998 — наиболее академичный OCaml 1996 — маргинальная

    классика Scala 2004 — на пути к замене Java Erlang 1986 — наиболее промышленный Erlang — единстенный динамически- типизированный язык среди рассмотреных. Но грустить рано, смотрим на расклад.
  7. MQ сервера ◦ FioranoMQ JMS ◦ Tibco JMS ◦ WebSphere

    JMS ◦ RabbitMQ AMQP MQ сервер — сердце кластера. Один из самых быстрых MQ — RabbitMQ — имплементация бинарного AMQP протокола разработаного в JP Morgan.
  8. 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. В основном это из-за прозрачности распределенного кода.
  9. Кот* создавал сайты на Erlang ? • Lift Scala •

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

    Klarna • Amazon SimpleDB • Facebook Chat • Github Pages • WhatsApp • ShoreTel M5
  11. Современный Erlang стек • Erlang/OTP устройчивая среда • Riak надежное

    Key-Value хранилище • RabbitMQ промышленный Pub/Sub • Nitrogen суперпростой веб фреймворк • Cowboy самый быстрый веб сервер • GProc распределенный QLC реестр
  12. Майк Вильямс, соавтор Erlang: Цели при разработке языка: • Разрабатывать

    быстро и эффективно • Устойчивость к сбоям оборудования • Возможность обновлять код на лету
  13. 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
  14. • Preemptive (Erlang, Sparks) • Cooperative (Lwt, Sparks, Akka) Erlang

    считает редукции и сам переключает контексты процессов (1.5К). Sparks переключаются только когда требуется память. Остальные модели актёров (Lwt, Akka) планируются кооперативными планировщиками. Task Switching
  15. Shared State • Нет разделяемой памяти. Рай. • Разделяемая памать.

    Java. • Разделяемые состояния и память. Ад. Erlang посылает сообщения в процессы не используя мютекстов, все происходит за атомарное изменение указателя очереди. Хип процесса изолирован и собирается GC в выделеное для этого время.
  16. Heterogeneity and Interoperability • NIF (C FFI, leveldb, shmem, сuda)

    • Ports (Fast High Level Right Way) • Distribution Protocol (ETF) Если надо подключить существующую C библиотеку лучше это сделать через NIF. В случае взаимодействия с внешними системами напрямую через Ports. Если хочеться хардкора — через dist протокол.
  17. 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]), <<Data:128000/binary, Remain/binary>> = Bin, Port ! {self(), {command, Data}}
  18. Interconnection ETF • TCP • SCTP Simplicity and Openness •

    Go https://github.com/goerlang • Ocaml https://github.com/khigia/erlocaml • Scala https://github.com/boundary/scalang
  19. Атомарные типы 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>
  20. Составные типы List [<<42,1,0,90>>,1,ok] Tuple {<0.0.16>,107,42,["maxim",true]} Можно типизировать кортежи и

    требовать, чтобы все элементы списка были одного типа. Строки — списки. Поэтому работа со строками в Erlang медленная, нужно стараться работать с бинарными данными.
  21. Строки и Списки и Генераторы "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].
  22. Сахар для кортежей -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). % загрузить все описания кортежей
  23. Процессы -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).
  24. Матчинг и Биндинг {{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]).
  25. Чат на Нитрогене... 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();");
  26. ... выглядит просто 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().
  27. 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 уже на второй неделе.
  28. XML < > Suck and Blow • Текстовый формат •

    10% времени на парсинг • Много ошибок при ручном парсинге XML нужен только для связи с внешними системами. Нет смысла использовать внутри своей системы XML.
  29. 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 году на службе телекомов по сей день.
  30. Свободные ASN компиляторы • Erlang (Ericsson) • asn1c (Lev Walkin)

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