Введение
Эта глава знакомит с языком Gleam и его местом в мире функционального программирования.
- Цели главы
- Зачем ещё один ФП-язык?
- BEAM: виртуальная машина, проверенная временем
- Двойной таргет
- Философия Gleam
- Сравнение с другими языками
- Структура книги
- Заключение
Цели главы
В этой главе мы:
- Поймём, зачем нужен ещё один функциональный язык
- Познакомимся с BEAM — виртуальной машиной Erlang
- Увидим, чем Gleam отличается от других ФП-языков
- Узнаем, как устроена эта книга
Зачем ещё один ФП-язык?
Функциональное программирование давно вышло за пределы академии. map, filter и reduce стали привычными для JavaScript, Python и даже Java программистов. Но между «использовать пару приёмов из ФП» и «писать на функциональном языке» — пропасть.
Elixir и Erlang работают на легендарной BEAM-машине с отказоустойчивостью и конкурентностью из коробки, но лишены статической типизации — ошибки типов обнаруживаются только в рантайме. Haskell и OCaml дают мощные системы типов, со своей рантайм-средой, но без встроенной такой же мощной конкурентности.
Gleam занимает уникальную нишу: это строго типизированный минималистичный язык на BEAM. Он сочетает:
- Безопасность типов — ошибки ловятся компилятором, а не пользователем в продакшене
- Отказоустойчивость BEAM — процессы, супервизоры
- Намеренную простоту — нет классов типов, нет макросов, нет GADTs
BEAM: виртуальная машина, проверенная временем
BEAM (Bogdan/Björn's Erlang Abstract Machine) — виртуальная машина, созданная в Ericsson для телекоммуникаций. Её ключевые свойства:
- Лёгкие процессы — миллионы конкурентных процессов в одной VM, каждый с собственной кучей
- Изоляция сбоев — падение одного процесса не затрагивает другие
- Горячая перезагрузка — обновление кода без остановки системы (на 2026 год не актуально для Gleam)
- Распределённость — процессы общаются по сети прозрачно
На BEAM работают системы, обслуживающие сотни миллионов пользователей:
| Система | Масштаб |
|---|---|
| 2 млрд пользователей, ~50 инженеров | |
| Discord | Миллионы конкурентных подключений |
| RabbitMQ | Один из самых популярных брокеров сообщений |
| Ericsson | Телекоммуникации с 99.9999999% uptime |
Gleam компилируется в Erlang-байткод и получает все эти свойства бесплатно. Код на Gleam вызывает Erlang- и Elixir-библиотеки напрямую, без обёрток и накладных расходов.
Двойной таргет
У Gleam есть еще одно полезное свойство: один и тот же код компилируется в Erlang (для сервера) и в JavaScript (для браузера и Node.js).
┌─── Erlang (BEAM) ───► сервер, CLI, IoT
gleam build ──┤
└─── JavaScript ──────► браузер, Node.js
А для переключения между таргетами достаточно изменить одну строку в gleam.toml:
target = "erlang" # или "javascript"
Стандартная библиотека Gleam работает на обоих таргетах. Для платформо-специфичного кода используется FFI — вызов Erlang- или JavaScript-функций из Gleam-кода.
Философия Gleam
Gleam — намеренно минималистичный язык. Его создатель Louis Pilfold следует принципу: если фичу можно не добавлять — её не добавляют.
В Gleam нет:
- Классов типов (type classes)
- Макросов
- GADTs и зависимых типов
- Исключений (в привычном смысле)
- REPL
- Перегрузки операторов
- Неявных приведений типов
Это не ограничение, а осознанный выбор. Каждая строка кода на Gleam читается однозначно: нет скрытой диспетчеризации, нет магии макросов, нет неявных преобразований. Код делает ровно то, что написано.
Дружелюбные ошибки
Gleam известен исключительно понятными сообщениями об ошибках. Компилятор не просто говорит «type mismatch» — он объясняет, что пошло не так, и часто предлагает исправление:
error: Type mismatch
┌─ src/main.gleam:4:17
│
4 │ string.length(42)
│ ^^
Expected type:
String
Found type:
Int
Hint: try using `int.to_string` to convert the value.
Компилятор указывает точную строку и столбец ошибки, показывает ожидаемый и найденный тип, и сразу предлагает исправление. Это делает работу с Gleam особенно приятной для новичков.
Hex — единая экосистема
Gleam использует Hex — менеджер пакетов, общий с Erlang и Elixir. Это означает доступ к Erlang-библиотекам напрямую, а также к растущей экосистеме собственных Gleam-пакетов: Wisp (веб), Lustre (фронтенд), Mist (HTTP-сервер) и многие другие. Подробнее о совместимости с BEAM-экосистемой — в главе 8.
Сравнение с другими языками
| Gleam | Elm | Rust | Elixir | Haskell | OCaml | |
|---|---|---|---|---|---|---|
| Статическая типизация | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ |
| BEAM | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ |
| Простота | ✓✓ | ✓ | ✗ | ✓ | ✗ | ✗ |
| Конкурентность (акторы) | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ |
| JS-таргет | ✓ | ✓ | ✗ | ✗ | ✓* | ✓* |
| Зрелая экосистема | Растёт | Средняя | ✓✓ | ✓ | ✓ | ✓ |
* Haskell компилируется в JS через GHCJS/Asterius, OCaml — через js_of_ocaml/Melange. Однако в обоих случаях это отдельные инструменты, а не встроенная возможность компилятора. В Gleam и Elm JS-таргет — штатный режим работы.
- Elm — ближайший родственник по философии (типы + простота), но работает только в браузере
- Rust — похожий подход к безопасности, но другой уровень сложности и нет BEAM
- Elixir — тот же BEAM, но без статических типов
- Haskell/OCaml — мощные системы типов, есть JS-таргеты через сторонние инструменты, но нет BEAM-конкурентности
Структура книги
Книга состоит из 14 глав и приложений:
| Глава | Тема |
|---|---|
| 1 | Введение |
| 2 | Начало работы |
| 3 | Функции и пайплайны |
| 4 | Типы данных и коллекции |
| 5 | Рекурсия, свёртки и обработка ошибок |
| 6 | Строки, битовые массивы и стандартная библиотека |
| 7 | Type Safety и Parse Don't Validate |
| 8 | Erlang FFI и системное программирование |
| 9 | JavaScript FFI и фронтенд интеграция |
| 10 | Процессы и OTP |
| 11 | Тестирование |
| 12 | Веб-разработка с Wisp |
| 13 | Фронтенд с Lustre |
| 14 | Заключение и следующие шаги |
Приложения:
- Приложение A: Telegram-бот с Telega
Каждая глава содержит:
- Объяснение концепций с примерами кода
- Сквозной проект, демонстрирующий концепции на практике
- Упражнения с подсказками (кроме этой вводной главы)
Как читать эту книгу
Начинающим рекомендуется читать главы последовательно, так как ранний материал закладывает фундаментальные концепции. Однако тем, кто уже знаком с функциональным программированием — особенно в строго типизированных языках — можно пропускать известные темы.
Каждая глава (со 2-й по 13-ю) построена вокруг практического примера, который служит мотивацией для новых идей. Главы 2–7 образуют базовый курс и лучше изучать последовательно. Главы 8–13 более независимы и покрывают специализированные темы: FFI, OTP, тестирование, веб-разработку.
Код из репозитория следует изучать вместе с текстом для полного понимания:
exercises/
├── chapter02/ # Начало работы
├── chapter03/ # Функции и пайплайны
├── ...
├── chapter13/ # Фронтенд с Lustre
└── appendix_a/ # Telegram-бот
Каждая директория содержит:
src/chapterXX.gleam— примеры кода из текста главыtest/my_solutions.gleam— шаблоны для ваших решенийno-peeking/solutions.gleam— референсные решения
Это не справочник с готовыми шаблонами. Для максимального эффекта от обучения настоятельно рекомендуется:
- Читать главу и изучать примеры кода
- Решать упражнения самостоятельно — каждое упражнение снабжено подсказками
- Запускать тесты:
cd exercises/chapterXX && gleam test - Только после попыток решения смотреть в
no-peeking/solutions.gleam
Упражнения — неотъемлемая часть понимания материала. Проработка их критически важна для усвоения концепций.
О читателе
Книга предполагает:
- Опыт программирования на любом языке (Python, JavaScript, Go, Java — неважно)
- Базовое понимание командной строки (терминал,
cd, запуск команд) - Знакомство с Git (на уровне
clone,commit,push)
Опыт функционального программирования не требуется — мы объясняем все концепции с нуля.
Ресурсы
- Gleam — официальный сайт
- Gleam Language Tour — интерактивный тур по языку
- Exercism — Gleam Track — упражнения с менторингом
- Awesome Gleam — каталог библиотек
- Gleam Discord — сообщество
Заключение
Gleam — молодой, но быстро растущий язык. Он берёт лучшее из двух миров: надёжность статической типизации и промышленную конкурентность BEAM. При этом он остаётся простым — выучить весь язык можно за выходные.
В следующей главе мы установим Gleam, создадим первый проект и напишем первую программу.