Перейти к основному содержимому

Первая программа на Elixir

Разработчику Архитектору Инженеру

Play ITЗагрузка интерактивного демо…


Первая программа на Elixir

Если вы пришли из JavaScript, Python, Java или C#, полезно сразу принять одну мысль — первая программа в Elixir нужна не только ради Hello, World!, а чтобы почувствовать модель языка. Уже на старте вы встречаете iex, кортежи {:ok, value}, сопоставление с образцом и привычку явно проверять результат каждой операции.

В этой статье маршрут такой: быстрый запуск -> скрипт .exs -> проект через mix -> точка входа -> базовая инженерная дисциплина (mix test, mix format).


Где применяют Elixir

Elixir работает на Erlang/OTP — платформе с миллионами легковесных процессов и отказоустойчивостью (Telecom, WhatsApp). Синтаксис приятнее Erlang; модель — функциональная, с pattern matching и |> (pipe).

Первая программа — mix new, iex (REPL), Hello в консоли. Веб: Phoenix (отдельные материалы).

Если коротко, Elixir особенно полезен там, где одновременно важны:

  • большое число параллельных соединений;
  • стабильная работа 24/7;
  • предсказуемое поведение под нагрузкой;
  • простой путь от прототипа к промышленному сервису.

Что понадобится

Установлены Erlang/OTP и Elixir; проверка — erl, elixir, mix.

Для комфортного старта также подготовьте:

  • любой редактор кода с подсветкой Elixir;
  • терминал, где удобно запускать mix и iex;
  • 15-20 минут на первый запуск без отвлечений.

Полезные статьи рядом:


Установка необходимых компонентов

Для работы с Elixir требуется два основных компонента: сам язык Elixir и среда выполнения Erlang/OTP. Они распространяются отдельно, но совместимы между собой в рамках определённых версий. Официальный сайт Elixir (https://elixir-lang.org) содержит актуальные рекомендации по совместимости.


Шаг 1. Установка Erlang/OTP

Erlang/OTP — это платформа, на которой исполняется код Elixir. Без неё Elixir работать не может. Установка зависит от операционной системы.

На macOS
Рекомендуемый способ — использовать менеджер пакетов Homebrew:

brew install erlang

На Ubuntu или Debian
Добавьте официальный репозиторий Erlang Solutions, чтобы получить актуальную версию:

wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb
sudo dpkg -i erlang-solutions_2.0_all.deb
sudo apt update
sudo apt install erlang

На Windows
Скачайте установщик с официального сайта Erlang (https://www.erlang.org/downloads). Выберите версию, совместимую с последней стабильной версией Elixir. Установщик добавит Erlang в систему и настроит переменные окружения.

После установки проверьте, что Erlang доступен:

erl -version

Команда должна вывести номер версии, например: Erlang/OTP 26.


Шаг 2. Установка Elixir

Теперь можно установить сам Elixir.

На macOS
Через Homebrew:

brew install elixir

На Ubuntu или Debian
После установки Erlang:

sudo apt install elixir

На Windows
Скачайте установщик с https://elixir-lang.org/install.html. Он автоматически определит наличие Erlang и завершит настройку.

Проверьте установку:

elixir --version

Вывод будет содержать версии Elixir и Erlang, например:

Elixir 1.17.0 (compiled with Erlang/OTP 26)

Это означает, что система готова к работе.


Запуск интерактивной оболочки

Elixir предоставляет интерактивную оболочку под названием IEx (Interactive Elixir). Это мощный инструмент для экспериментов, отладки и изучения языка.

Запустите её командой:

iex

Вы увидите приглашение вида:

Erlang/OTP 26 [erts-14.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit]

Interactive Elixir (1.17.0) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>

Пример в IEx:

"Hello, World!"

Разбор:

  • В IEx строковый литерал сам по себе просто вычисляется и возвращается как значение.
  • Этот пример показывает, что в Elixir выражения возвращают результат, даже без "печати" в консоль.
  • Для реального вывода в stdout используют функции модуля IO, например IO.puts/1.

Оболочка сразу выведет результат:

"Hello, World!"

Это строка, но она не была напечатана в терминале — она просто возвращена как значение. Чтобы действительно вывести текст на экран, используйте функцию IO.puts/1:

IO.puts("Hello, World!")

Разбор:

  • IO.puts/1 печатает строку в консоль и добавляет перевод строки.
  • Аргумент "Hello, World!" — бинарная UTF-8 строка.
  • Функция возвращает :ok, поэтому после вывода текста в IEx видно и это возвращаемое значение.

Результат:

Hello, World!
:ok

Функция IO.puts/1 выводит строку и возвращает атом :ok, что означает успешное завершение операции. Это стандартная практика в экосистеме Erlang/Elixir — многие функции возвращают кортежи вида {:ok, result} или {:error, reason}, но в простых случаях используется атом :ok.

Нажмите Ctrl+C дважды, чтобы выйти из IEx.

Быстрый эксперимент с типами и pipe в той же сессии:

users = [
%{name: "Алиса", score: 85},
%{name: "Боб", score: 42}
]

users
|> Enum.filter(fn u -> u.score >= 50 end)
|> Enum.map(fn u -> u.name end)

Разбор:

  • users — список map с полями :name и :score.
  • Enum.filter/2 оставляет только записи с score >= 50.
  • Enum.map/2 превращает список map в список имён.
  • Оператор |> передаёт результат предыдущего шага первым аргументом следующей функции.

Написание первой программы в файле

Хотя IEx удобен для быстрых экспериментов, реальные программы пишутся в файлах. Создадим скрипт, который при запуске выводит "Hello, World!".


Шаг 1. Создание файла

Откройте текстовый редактор и создайте файл с именем hello.exs. Расширение .exs означает "Elixir script" — такой файл предназначен для однократного выполнения, а не для компиляции в модуль.

Добавьте в него следующее содержимое:

IO.puts("Hello, World!")

Разбор:

  • Это минимальный исполняемый скрипт .exs: при запуске выполняется сверху вниз.
  • Здесь нет модуля и функций, поэтому код полезен для быстрых учебных или утилитарных задач.
  • Любая логика, добавленная в файл, также выполнится сразу при вызове elixir hello.exs.

Сохраните файл.


Шаг 2. Запуск скрипта

В каталоге с файлом:

elixir hello.exs

Вывод:

Hello, World!

Программа завершилась. Это самый простой способ запуска Elixir-кода без создания полноценного проекта.

Обратите внимание: файл с расширением .exs не компилируется в байт-код BEAM, а интерпретируется на лету. Это делает его идеальным для небольших задач, автоматизации или обучения.


Создание полноценного проекта с помощью Mix

Для более сложных приложений используется инструмент Mix — стандартный менеджер сборки и управления проектами в экосистеме Elixir. Он генерирует структуру проекта, управляет зависимостями, компилирует код и запускает тесты.


Шаг 1. Генерация нового проекта

В каталоге будущего проекта:

mix new hello_world

Mix создаст каталог hello_world со следующей структурой:

hello_world/
├── lib/
│ └── hello_world.ex
├── test/
│ └── hello_world_test.exs
├── .formatter.exs
├── mix.exs
└── README.md

Основной файл программы — lib/hello_world.ex. По умолчанию он содержит модуль с примером функции:

Код ITЗагрузка примера кода…

Разбор:

  • defmodule HelloWorld do ... end объявляет модуль и пространство имен для функций.
  • @moduledoc и @doc добавляют документацию, которую читают iex и ExDoc.
  • Функция hello/0 не принимает аргументы (арность 0) и возвращает атом :world.
  • Атомы вроде :world часто используют как легкие метки состояний или статусов.

Этот код определяет модуль HelloWorld с функцией hello/0, возвращающей атом :world.


Шаг 2. Изменение программы

Отредактируйте файл lib/hello_world.ex, чтобы он выводил "Hello, World!" при запуске. Однако важно понимать: модуль сам по себе ничего не делает — он лишь определяет поведение. Чтобы что-то вывести, нужно вызвать функцию.

Создадим новую функцию, которая печатает приветствие:

defmodule HelloWorld do
def greet do
IO.puts("Hello, World!")
end
end

Разбор:

  • Добавлена публичная функция greet/0, доступная как HelloWorld.greet().
  • Тело функции содержит побочный эффект: вывод в консоль через IO.puts/1.
  • Возвращаемым значением функции будет :ok, так как это возвращает последняя строка.

Теперь нужно запустить эту функцию. Для этого можно воспользоваться IEx в контексте проекта.


Шаг 3. Запуск в IEx

Перейдите в каталог проекта:

cd hello_world

Запустите IEx с подключением к проекту:

iex -S mix

Флаг -S mix означает: "запусти IEx, предварительно выполнив mix для загрузки зависимостей и компиляции кода".

Теперь в оболочке доступен модуль HelloWorld. Вызовите функцию:

HelloWorld.greet()

Разбор:

  • Вызов через Модуль.функция() использует полное имя функции в пространстве имен.
  • Скобки здесь можно опустить, но для новичков явный вызов читается лучше.
  • Команда срабатывает только если модуль уже скомпилирован и загружен (iex -S mix).

Результат:

Hello, World!
:ok

Программа работает.

Чтобы перейти от "просто запускается" к "понимаю, что происходит", выполните в этой же сессии:

1 + 2
{:ok, 10}
[h | t] = [1, 2, 3]
"hello" |> String.upcase()

Разбор:

  • 1 + 2 — базовое арифметическое выражение, возвращает 3.
  • {:ok, 10} — кортеж из атома статуса и данных, типичный контракт в Elixir.
  • [h | t] = [1, 2, 3] использует pattern matching — h получает 1, t получает [2, 3].
  • Оператор |> передает левый результат первым аргументом функции справа: String.upcase("hello").

Так вы сразу увидите числа, кортежи, сопоставление с образцом и оператор |> вживую.

Для закрепления добавьте еще два коротких шага:

case File.read("missing.txt") do
{:ok, content} -> content
{:error, reason} -> {:error, reason}
end

with {n, ""} <- Integer.parse("42") do
{:ok, n}
end

Разбор:

  • case разбирает результат File.read/1 по шаблонам успеха и ошибки.
  • Ветка {:ok, content} возвращает содержимое файла, а ветка {:error, reason} сохраняет причину отказа.
  • Integer.parse("42") возвращает кортеж {42, ""}, где второй элемент — непрочитанный остаток строки.
  • В with шаблон {n, ""} гарантирует, что строка распарсилась полностью без лишних символов.

Эти примеры показывают, почему в Elixir обычно возвращают результат как данные, а не прячут поток в исключения.


Шаг 4. Создание исполняемой точки входа

Если требуется запускать программу как самостоятельный скрипт (без входа в IEx), можно создать файл lib/hello_world/cli.ex:

defmodule HelloWorld.CLI do
def main(_args) do
HelloWorld.greet()
end
end

Разбор:

  • HelloWorld.CLI выступает точкой входа для escript.
  • main/1 принимает список аргументов командной строки, здесь он помечен как _args, потому что не используется.
  • Внутри main/1 вызывается HelloWorld.greet(), поэтому при запуске бинарника печатается приветствие.

Затем укажите эту функцию как точку входа в файле mix.exs. Найдите секцию project и добавьте параметр escript:

def project do
[
app: :hello_world,
version: "0.1.0",
elixir: "~> 1.17",
start_permanent: Mix.env() == :prod,
escript: [main_module: HelloWorld.CLI],
deps: deps()
]
end

Разбор:

  • Функция project/0 возвращает keyword-list с метаданными сборки Mix.
  • Пара escript: [main_module: HelloWorld.CLI] сообщает, какой модуль запускать как исполняемый файл.
  • app, version, elixir и deps формируют базовый контракт проекта для компиляции и зависимостей.
  • start_permanent: Mix.env() == :prod включает более строгий режим запуска в production.

Теперь соберите исполняемый файл:

mix escript.build

Эта команда создаст файл hello_world в корне проекта. Запустите его:

./hello_world

Вывод:

Hello, World!

Теперь у вас есть полностью автономная программа на Elixir, которую можно запускать из командной строки.


Шаг 5. Тесты и форматирование

В каталоге test/ уже есть пример для ExUnit. Запуск тестов:

mix test

Форматирование кода по общепринятому стилю:

mix format

Файлы в lib/ с расширением .ex компилируются в модули (байт-код BEAM); скрипты .exs (как hello.exs) выполняются без отдельной сборки — удобно для утилит и экспериментов в IEx.

Минимальный тест в test/hello_world_test.exs:

defmodule HelloWorldTest do
use ExUnit.Case

test "hello returns :world" do
assert HelloWorld.hello() == :world
end
end

Разбор:

  • use ExUnit.Case подключает поведение тестового модуля ExUnit.
  • test "описание" do ... end объявляет один тестовый сценарий.
  • assert проверяет условие; при несовпадении тест падает с понятным diff.
  • mix test компилирует проект и запускает все файлы из каталога test/.

Почему это важно уже на первом шаге:

  • mix test формирует привычку сразу проверять изменения;
  • mix format держит единый стиль в команде;
  • вместе они снижают "технический шум" и упрощают ревью.

Мини-чеклист после первой программы

Если все пункты ниже выполнены, база действительно закрепилась:

  • вы запускаете iex и выходите из него без подсказок;
  • понимаете разницу между .ex и .exs;
  • создаете проект через mix new;
  • вызываете функцию модуля в iex -S mix;
  • запускаете mix test и mix format.

Куда идти дальше после этого урока

Логичный следующий маршрут:

  1. Основы языка Elixir — модель языка и базовые принципы.
  2. Типы данных и неизменяемость — структуры данных и операции.
  3. Управляющие конструкции и операторы Elixircase, with, cond, guards.
  4. Функции и процессы в Elixir — переход к реальным архитектурным паттернам.

Быстрый план на 1-2 вечера

Если хотите мягко зайти в Elixir после первой программы:

Так материал закрепляется практикой без перегруза.


Как читать ошибки без паники

Если что-то не запускается, держите простой алгоритм:

  1. Сначала смотрите тип ошибки (MatchError, UndefinedFunctionError и т.д.).
  2. Проверяйте имя модуля/функции и арность (name/arity).
  3. Убеждайтесь, что запустили iex -S mix, а не "голый" iex.
  4. Перезапускайте сессию после правок и повторяйте команду.

Такая привычка полезна не только в обучении, но и в реальной эксплуатации сервисов.


Частые ошибки

СимптомПричина
mix не найденElixir не установлен или не в PATH
** (MatchError)Неверный pattern в = / case
Нет выводаЗапущен не тот модуль — проверьте mix run / iex -S mix
Erlang version mismatchВерсия OTP не совместима с Elixir — см. elixir-lang.org

Что попробовать

  1. iex1 + 1 и pipe |> IO.inspect().
  2. mix phx.new — заготовка веб-приложения (когда готовы к Phoenix).
  3. mix test после изменения lib/.

В подборках

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

Первые шаги (маршрут подборки) — Первая программа на Scala, Первая программа на Zig, Первая программа на Haskell, Первая программа на Nim, Первая программа на Groovy, Первая программа на Dart.