Представьте: вы пьёте утренний кофе и просматриваете очередное объявление о «революционном» языке программирования, как вдруг натыкаетесь на что-то под названием Gleam. Ваша первая мысль? «Отлично, ещё один JavaScript-фреймворк, выдаваемый за язык программирования». Но подождите — Gleam — это нечто совершенно иное, и, осмелюсь сказать, освежающе здравое.

Gleam не пытается заново изобрести колесо или решить проблему голода в мире с помощью блокчейна и искусственного интеллекта. Вместо этого он делает нечто более ценное: делает функциональное программирование на BEAM доступным, не жертвуя при этом мощью, которая делает Erlang и Elixir такими привлекательными для создания надёжных систем.

Что же такое Gleam?

Gleam — это статически типизированный функциональный язык программирования, который компилируется как в байт-код Erlang, так и в JavaScript. Думайте о нём как о дружелюбном супергерое из вашего района в экосистеме BEAM — у него есть все суперсилы Erlang (отказоустойчивость, массовое параллелизм, горячая замена кода), но с синтаксисом, который не заставит вас сомневаться в выборе карьеры.

Язык недавно достиг версии v1.0, что в годах языков программирования означает, что он наконец-то готов познакомиться с вашими родителями. Созданный под влиянием таких языков, как Elm и Rust, Gleam привносит принципы современного проектирования языков в проверенную временем виртуальную машину BEAM.

graph TD A[Исходный код Gleam] --> B[Компилятор Gleam] B --> C[Байт-код Erlang] B --> D[Код JavaScript] C --> E[ВМ BEAM] D --> F[Браузер/Node.js] E --> G[Параллельные системы] E --> H[Распределённые приложения] F --> I[Веб-приложения] F --> J[Интерфейсы фронтенда]

Почему вам стоит обратить внимание на ещё один язык программирования?

Прежде чем вы закатите глаза и пробормочете «только не ещё один», позвольте мне привести вам три веские причины, почему Gleam заслуживает места в вашем списке для изучения:

Безопасность превыше всего, вопросы потом: система типов Gleam похожа на наличие действительно педантичного, но полезного друга, который ловит ваши ошибки, прежде чем они станут производственными катастрофами. Статическая типизация означает, что ваш код либо компилируется правильно, либо не компилируется вообще — никаких сюрпризов вроде «undefined is not a function» в 3 часа ночи.

Стоя на плечах гигантов: ориентируясь на виртуальную машину BEAM, Gleam наследует десятилетия проверенных временем инноваций в области параллелизма и отказоустойчивости. Вы получаете параллелизм по модели акторов, деревья надзора и горячую перезагрузку кода, не изучая… уникальные особенности синтаксиса Erlang.

Гибкость JavaScript: нужно запустить вашу логику в браузере? Gleam компилируется и в JavaScript, что означает, что вы можете делиться кодом между вашим бэкендом и фронтендом, не прибегая к Node.js везде.

Настройка вашей игровой площадки Gleam

Давайте немного погрузимся в работу, хорошо? Настройка Gleam удивительно проста — никаких контейнеров Docker, никаких сложных инструментов сборки, просто старая добрая установка программного обеспечения.

Предварительные условия: обычные подозреваемые

Сначала вам нужно установить Erlang/OTP на вашу систему. Не паникуйте — это не так страшно, как кажется. Зайдите на официальный сайт Erlang и скачайте установщик для вашей операционной системы. Если вы используете macOS и Homebrew, вас ждёт удовольствие:

brew install erlang

Для самого компилятора Gleam у вас есть несколько вариантов. Самый простой подход — использовать менеджер пакетов вашей системы:

# macOS с Homebrew
brew install gleam
# Или скачайте предварительно скомпилированные двоичные файлы с GitHub
# https://github.com/gleam-lang/gleam/releases

Проверка: доверяй, но проверяй

Давайте убедимся, что всё работает правильно:

gleam --version
erl -version

Если обе команды возвращают информацию о версии без ошибок, у вас всё в порядке.

Ваш первый танец с Gleam

Время для традиционного «Hello, World!» — потому что какой учебник по программированию обходится без этого классического ритуала?

Создание проекта: начало с чистого листа

Gleam поставляется с генератором проектов, который настраивает всё необходимое:

gleam new my_first_gleam_app
cd my_first_gleam_app

Это создаёт красиво организованную структуру проекта, которая бы понравилась Мари Кондо:

my_first_gleam_app/
├── gleam.toml          # Конфигурация проекта
├── src/                # Здесь находится ваш исходный код
│   └── my_first_gleam_app.gleam
└── test/               # Тесты (да, тестирование встроено!)
    └── my_first_gleam_app_test.gleam

Обязательное «Hello World»

Откройте src/my_first_gleam_app.gleam и замените его содержимое на:

import gleam/io
pub fn main() {
  let приветствие = "Hello, Gleam! Welcome to the BEAM party!"
  io.println(приветствие)
  // Давайте немного украсим
  let уровень_возбуждения = 9000
  io.println("Мой уровень возбуждения превышает " <> int.to_string(уровень_возбуждения))
}

Запустите своё творение:

gleam run

Поздравляем! Вы только что написали и выполнили свою первую программу на Gleam. Это тёплое приятное чувство? Это удовлетворение от чистого, работающего кода.

Синтаксис Gleam: где элегантность встречается с практичностью

Теперь, когда мы разбили лёд, давайте погрузимся в синтаксис Gleam. Если вы использовали какой-либо современный функциональный язык, вы почувствуете себя как дома. Если нет, не волнуйтесь — синтаксис Gleam удивительно интуитивно понятен.

Переменные и неизменность: примите неизменную жизнь

В Gleam переменные по умолчанию неизменяемы — как только вы связали значение, оно остаётся связанным. Поначалу это может показаться ограничением, но поверьте, это освобождает. Больше не нужно беспокоиться о том, что какая-то удалённая функция изменит ваши данные.

import gleam/io
import gleam/int
import gleam/float
import gleam/bool
pub fn main() {
  // Основные типы — строительные блоки величия
  let имя_разработчика = "Максим"
  let опыт_работы = 10
  let уровень_зависимости_от_кофе = 95.5
  let любит_функциональное_программирование = True
  // Конкатенация строк с оператором <>
  io.println("Разработчик: " <> имя_разработчика)
  io.println("Опыт работы: " <> int.to_string(опыт_работы) <> " лет")
  io.println("Зависимость от кофе: " <> float.to_string(уровень_зависимости_от_кофе) <> "%")
  io.println("Любит ФП: " <> bool.to_string(любит_функциональное_программирование))
}

Функции: сердце функционального программирования

Функции в Gleam — граждане первого класса. Они чистые, компонуемые и абсолютно восхитительные в работе:

import gleam/io
import gleam/int
// Простая функция, которая вычисляет квадрат числа
pub fn square(x: Int) -> Int {
  x * x
}
// Функция, которая демонстрирует сопоставление с образцом
pub fn describe_number(n: Int) -> String {
  case n {
    0 -> "Ноль — самое одинокое число"
    1 -> "Один — высшая власть"
    n if n < 0 -> "Отрицательное — глядя на тёмную сторону"
    n if n > 100 -> "Большое число — возможно, чей-то возраст в собачьих годах"
    _ -> "Просто обычное число, ничего особенного"
  }
}
pub fn main() {
  let число = 42
  let квадрат = square(число)
  io.println("Квадрат числа " <> int.to_string(число) <> " равен " <> int.to_string(квадрат))
  io.println(describe_number(число))
}

Пользовательские типы: создание вашего собственного мира

Пользовательские типы в Gleam — это то место, где происходит настоящее волшебство. Они позволяют вам точно и безопасно моделировать вашу область:

import gleam/io
import gleam/int
// Определение пользовательского типа для различных парадигм программирования
pub type ProgrammingParadigm {
  Functional
  ObjectOriented
  Procedural
  LogicBased
  Reactive(уровень_энтузиазма: Int)
}
// Пользовательский тип для профиля разработчика
pub type Developer {
  Developer(
    name: String,
    favorite_paradigm: ProgrammingParadigm,
    coffee_cups_per_day: Int,
  )
}
pub fn describe_paradigm(parad