Учебник Erlang для начинающих
Erlang — функциональный язык для построения конкурентных, распределённых и отказоустойчивых систем, способных работать годами без остановки. В этом курсе вы пройдёте путь от истории языка в Ericsson и философии «let it crash» до модели акторов, передачи сообщений, фреймворка OTP с gen_server и деревьями супервизоров, распределённых кластеров и горячей замены кода. Подойдёт тем, кто знаком с программированием и хочет понять, как устроена надёжность промышленных систем вроде WhatsApp, RabbitMQ и телеком-платформ.
Курс «Erlang: язык надёжных систем» состоит из 8 разделов и 26 уроков: Знакомство с Erlang, Основы языка, Функциональное программирование в Erlang, Модель акторов и процессы, Надёжность и обработка ошибок, OTP — фреймворк надёжности, Хранение, распределённость и горячая замена и Erlang в мире: сравнения и применения. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Знакомство с Erlang
- Что такое Erlang и зачем он нужен
Erlang — язык для надёжных конкурентных систем: история в Ericsson, телеком, девять девяток доступности и философия отказоустойчивости.
- Философия «let it crash» и отказоустойчивость
Почему в Erlang принято «пусть падает»: изоляция отказов, восстановление вместо защиты от каждой ошибки и роль супервизоров.
- Платформа BEAM: виртуальная машина Erlang
BEAM — виртуальная машина Erlang: планировщики, лёгкие процессы, вытесняющая многозадачность, сборка мусора на процесс и почему всё это даёт устойчивость.
- Что такое Erlang и зачем он нужен
2 Основы языка
- Установка, оболочка erl и первая программа
Как поставить Erlang/OTP, работать в интерактивной оболочке erl, скомпилировать модуль и запустить первую функцию.
- Неизменяемые данные и одно присваивание
Переменные в Erlang связываются один раз и неизменяемы: что такое single assignment, как читать ошибку no match и почему это упрощает конкурентность.
- Типы данных: атомы, числа, кортежи, списки, map, бинарные данные
Базовые типы Erlang: атомы, целые и числа с плавающей точкой, кортежи, списки, ассоциативные массивы map и бинарные данные.
- Установка, оболочка erl и первая программа
3 Функциональное программирование в Erlang
- Сопоставление с образцом (pattern matching)
Pattern matching в Erlang: сопоставление кортежей и списков, переменные-заполнители, конструкция case и почему сопоставление — основа всего языка.
- Функции, модули и многовариантные определения
Определение функций в Erlang: несколько клауз с pattern matching, локальные и экспортируемые функции, анонимные функции fun и модульная организация кода.
- Рекурсия и хвостовые вызовы
Рекурсия как основной способ повторения в Erlang: обычная и хвостовая рекурсия, аккумуляторы и почему хвостовые вызовы не переполняют стек.
- Списковые включения, lists и охранные выражения
Работа со списками в Erlang: list comprehensions, модуль lists (map, filter, foldl) и охранные выражения guards для уточнения клауз.
- Сопоставление с образцом (pattern matching)
4 Модель акторов и процессы
- Лёгкие процессы и spawn
Модель акторов в Erlang: лёгкие процессы, функция spawn, идентификаторы PID, изоляция и почему миллионы процессов — это норма.
- Передача сообщений: ! и receive
Обмен сообщениями между процессами Erlang: оператор отправки !, блок receive, почтовый ящик и селективный приём сообщений.
- Состояние, регистрация и серверный цикл
Как процесс хранит состояние через рекурсивный цикл, регистрация процессов под именем и шаблон «сервер на receive».
- Лёгкие процессы и spawn
5 Надёжность и обработка ошибок
- Связи и мониторы: link и monitor
Обнаружение падений в Erlang: связи link с двусторонним распространением сигналов, мониторы monitor для одностороннего наблюдения и флаг trap_exit.
- «Let it crash» на практике: изоляция отказов
Практика отказоустойчивости: почему рабочий код пишут счастливым путём, как отказ локализуется в процессе и роль перезапуска чистого состояния.
- Обработка ошибок: try/catch, throw, exit, error
Механизмы исключений в Erlang: классы ошибок throw, error и exit, конструкция try/catch и почему её используют умеренно.
- Связи и мониторы: link и monitor
6 OTP — фреймворк надёжности
- Что такое OTP и поведения
OTP как фреймворк надёжности Erlang: что такое поведения (behaviours), разделение общей и прикладной части, и почему OTP — стандарт промышленного Erlang.
- gen_server: главный строительный блок
Поведение gen_server в Erlang: callbacks init, handle_call и handle_cast, синхронные и асинхронные вызовы, хранение состояния и клиентский API.
- Деревья супервизоров и стратегии перезапуска
Поведение supervisor в Erlang: дочерние спецификации, стратегии перезапуска one_for_one, one_for_all и rest_for_one, интенсивность перезапуска и деревья надзора.
- Приложения и релизы OTP
Обзор приложений и релизов OTP: .app-файл, корневой супервизор, дерево приложения, сборка релиза и запуск как единого продукта.
- Что такое OTP и поведения
7 Хранение, распределённость и горячая замена
- ETS: быстрое хранилище в памяти
ETS (Erlang Term Storage) — встроенное хранилище в памяти: типы таблиц set, bag и ordered_set, доступ из многих процессов и место ETS в архитектуре.
- Распределённость: узлы и прозрачная передача сообщений
Распределённый Erlang: узлы (nodes), имена и cookie, прозрачная передача сообщений между машинами и кластер «из коробки».
- Горячая замена кода без остановки
Горячая замена кода в Erlang: загрузка новой версии модуля без остановки системы, две версии модуля одновременно и полностью квалифицированные вызовы.
- ETS: быстрое хранилище в памяти
8 Erlang в мире: сравнения и применения
- Erlang и Elixir: одна платформа, разный синтаксис
Сравнение Erlang и Elixir: общая виртуальная машина BEAM и OTP, различия синтаксиса, макросы и инструментарий, и когда выбирать каждый язык.
- Почему модель акторов проще для конкурентности
Сравнение модели акторов с потоками и общей памятью: гонки данных, блокировки, deadlock и почему изоляция процессов делает конкурентный код понятнее.
- Где применяют Erlang: реальные системы
Практические применения Erlang: мессенджеры (WhatsApp), телеком, очереди сообщений (RabbitMQ), базы данных и когда Erlang — правильный выбор.
- Erlang и Elixir: одна платформа, разный синтаксис