Erlang

  • Amazon Simple DB
  • Yahoo! Delicious (> 5M users)
  • Facebook (chat)
  • WhatsApp
  • T-Mobile (SMS & auth)
  • Ericsson

Bloody Enterprise

Open Source

  • CouchDB
  • Ejabberd (XMPP-server)
  • RabbitMQ

Назначение

Не подходит

  • Графоний
  • Численные алгоритмы
  • Приложение для смартфона

Подходит

  • РАСПРЕДЕЛЕННЫЕ
  • ОТКАЗОУСТОЙЧИВЫЕ
  • ВЫСОКОНАГРУЖЕННЫЕ
  • СИСТЕМЫ
  • У Л Ь Т Р А _ Х А Р Д К О Р

Интересные особенности

  • Декларативный (Prolog)

atom

Term

Пунктуация

Моя личная боль

Интересные особенности

  • Декларативный (Prolog)
  • Функциональный (Haskell)

Интересные особенности

  • Декларативный (Prolog)
  • Функциональный (Haskell)
  • Concurrent вычисления и передача сообщений

process

MQ

exclusive memory

Интересные особенности

  • Декларативный (Prolog)
  • Функциональный (Haskell)
  • Concurrent вычисления и передача сообщений
  • Легковесные потоки и принцип «Let it crash»

Open Telecom Platform (OTP)

  • link — если один процесс падает, второй об этом узнаёт
  • generic behavior
    • сервер (gen_server)
    • конечный автомат (gen_statem)
    • обработчик событий (gen_event)
  • supervisor — процесс-оркестровщик

Интересные особенности

  • Декларативный (Prolog)
  • Функциональный (Haskell)
  • Concurrent вычисления и передача сообщений
  • Легковесные потоки и принцип «Let it crash»
  • Распределенные вычисления

Интересные особенности

  • Декларативный (Prolog)
  • Функциональный (Haskell)
  • Concurrent вычисления и передача сообщений
  • Легковесные потоки и принцип «Let it crash»
  • Распределенные вычисления
  • Parallel вычисления

Message Queue

Message Queues

Интересные особенности

  • Декларативный (Prolog)
  • Функциональный (Haskell)
  • Concurrent вычисления и передача сообщений
  • Легковесные потоки и принцип «Let it crash»
  • Распределенные вычисления
  • Parallel вычисления
  • Интеграция с другими языками
    • Native Implemented Functions (NIFs)
    • Ports

Интересные особенности

  • Декларативный (Prolog)
  • Функциональный (Haskell)
  • Concurrent вычисления и передача сообщений
  • Легковесные потоки и принцип «Let it crash»
  • Распределенные вычисления
  • Parallel вычисления
  • Интеграция с другими языками
    • Native Implemented Functions (NIFs)
    • Ports
  • Горячая замена кода

Синтаксис

Атомы

  • Пишутся с маленькой буквы
  • Можно смотреть как на строковые константы
  • В основном несут пользу при читаемости кода и паттерн матчинге

Термы

  • Неизменяемые переменные (invariable variables)
  • Пишутся с большой буквы
  • Или с underscore, если значение неважно

Списки

  • Однонаправленный список
  • Основной способ хранения коллекций
  • Может хранить разнородные данные
  • Отличается от кортежа способом обработки

Функции

  • У функций есть арность (arity)
  • Можно задать несколько образцов (как в Прологе)

Модули

  • -module(fileName).
  • Группировка кода. Вместо классов
  • import/export
    • похоже на js, python

Параллельное программирование

Философия

  • В мире события происходят одновременно
  • У объектов мира нет общих данных
  • Объекты общаются между собой с помощью сообщений
  • Случаются неприятности

Рассмотрим locker.erl

Демонстрация

Поведения

gen_server

gen_server

gen_server:start

gen_server:start_link

callback module

Module:init/1

gen_server:stop

Module:terminate/2

gen_server:call
gen_server:multi_call
Module:handle_call/3
gen_server:cast
gen_server:abcast 
Module:handle_info/2
Module:handle_continue/2
Module:code_change/3
Module:handle_cast/2

gen_event

gen_event

callback module

gen_event:notify
gen_event:sync_notify
Module:handle_event/2

gen_statem

(ex. gen_fsm)

gen_statem

callback module

gen_statem:call
Module:handle_event/3

Appendix

Типизация

  • На момент изобретия языка никто не знал как хорошо построить систему типов
  • Основная сложность заключается в горячей замене кода
  • TypEr + Dializer

Сборка мусора

  • Нет GC pause
  • Производится отдельно для каждого процесса
  • Копирующая сборка
    • Использует две области памяти для того, чтобы оставить живые объекты в одной
  • Последовательная сборка (2 поколения)
    • Сперва поверхностная
    • Потом глубокая

Что осталось за бортом

  • Охранные выражения (guards)
  • Как происходит компиляция
  • Директивы модулей (record, export/import)
  • Встроенные функции
  • Преобразование типов
  • Метапрограммирование
  • Ввод/вывод
  • Обработка ошибок
  • Отладка, автотесты (EUnit)
  • Ports & NIFs
  • Горячая замена кода
  • Supervisor

Erlang

By koteek

Erlang

  • 269