YAML
YAML (рекурсивный акроним от YAML Ain’t Markup Language, «YAML — не язык разметки») — это формат сериализации данных, предназначенный для представления структурированной информации в виде, удобном для чтения человеком. YAML часто используется для написания конфигурационных файлов, в системах непрерывной интеграции и развёртывания (CI/CD), в инструментах оркестрации (например, Ansible, Kubernetes, Docker Compose), а также для обмена данными между компонентами программного обеспечения. Ключевыми характеристиками YAML являются минималистичный синтаксис, основанный на отступах (пробелах), и поддержка сложных структур данных, таких как списки, словари и скалярные типы.
История
YAML был впервые предложен в 2001 году как упрощённая альтернатива XML для задач конфигурации и обмена данными. Первоначальная спецификация (YAML 1.0) была разработана Кларком Эвансом, Инго Мёллером-Нильссоном и Брайаном Ингерсоном. Название изначально расшифровывалось как Yet Another Markup Language («Ещё один язык разметки»), но позже, чтобы подчеркнуть отличие от языков разметки (таких как HTML или XML), было изменено на рекурсивный вариант YAML Ain’t Markup Language.
В 2004 году вышла версия YAML 1.1, которая стала наиболее распространённой и поддерживаемой большинством реализаций. В 2009 году была опубликована версия YAML 1.2, которая устранила некоторые неоднозначности и несовместимости предыдущей версии, в частности, стандартизировала представление чисел и типов данных. Несмотря на это, многие популярные инструменты (например, Ansible и Docker Compose) до сих пор используют синтаксис, основанный на YAML 1.1.
Структура и синтаксис
Основной принцип YAML — использование отступов (пробелов, но не табуляций) для обозначения вложенности. Количество пробелов должно быть одинаковым для элементов одного уровня. Синтаксис YAML включает три основных типа узлов: скаляры, последовательности (списки) и отображения (словари).
Скаляры
Скаляры представляют собой простые значения: строки, числа, логические значения (true/false), даты и null. Строки могут быть записаны без кавычек (если не содержат специальных символов), в одинарных или двойных кавычках. Для многострочных строк используются блоковые литералы (|) и складные блоки (>).
``yaml строка: Пример текста число: 42 логическое: true дата: 2023-10-01 пусто: null ``
Последовательности (списки)
Последовательности обозначаются дефисом с пробелом перед элементом. Каждый элемент списка находится на новой строке с одинаковым отступом.
```yaml список:
- яблоко
- банан
- апельсин
```
Отображения (словари)
Отображения представляют собой пары «ключ: значение», разделённые двоеточием и пробелом. Ключи могут быть строками (часто без кавычек) или другими скалярами.
``yaml словарь: имя: Иван возраст: 30 город: Москва ``
Вложенные структуры
YAML позволяет создавать произвольно глубокие вложенные структуры, комбинируя списки и словари.
```yaml человек: имя: Анна навыки:
адрес: улица: Ленина дом: 10 ```
Якоря и алиасы
YAML поддерживает механизм якорей (&) и алиасов (*), который позволяет повторно использовать одни и те же данные в разных частях документа. Это особенно полезно для уменьшения дублирования в больших конфигурационных файлах.
```yaml общие_настройки: &defaults лог_уровень: info порт: 8080
сервер1: <<: *defaults хост: example.com ```
Типы данных
YAML 1.2 поддерживает следующие встроенные типы данных:
- Строки (str): последовательности символов.
- Целые числа (int): десятичные, шестнадцатеричные, восьмеричные.
- Числа с плавающей точкой (float): включая экспоненциальную запись, специальные значения
.inf,-.inf,.nan. - Логические значения (bool):
true,false,yes,no,on,off(в YAML 1.1 поддерживаются все варианты, в YAML 1.2 — толькоtrue/false). - Null:
null,~. - Дата и время (timestamp): в формате ISO 8601 (например,
2023-10-01T12:00:00Z). - Бинарные данные (binary): кодируются в Base64.
Применение
YAML получил широкое распространение в различных областях разработки программного обеспечения и системного администрирования.
Конфигурационные файлы
YAML является основным форматом конфигурации для многих инструментов:
- Ansible: плейбуки (playbooks) для автоматизации управления конфигурациями пишутся на YAML.
- Kubernetes: манифесты для описания подов, сервисов, развёртываний и других ресурсов используют YAML.
- Docker Compose: файл
docker-compose.ymlописывает многоконтейнерные приложения. - GitLab CI/CD: файл
.gitlab-ci.ymlопределяет пайплайны и задания. - Homebrew: формулы для установки пакетов в macOS пишутся на YAML.
Обмен данными
Хотя YAML реже используется для передачи данных по сети (где доминирует JSON), он применяется во внутренних системах, где важна читаемость, например, в файлах локализации, описаниях тестовых сценариев или метаданных.
Документация
Некоторые системы документирования, такие как MkDocs и Jekyll, используют YAML для задания метаданных (front matter) в начале Markdown-файлов.
Преимущества и недостатки
Преимущества
- Читаемость: синтаксис с отступами делает YAML интуитивно понятным для человека, особенно для не-программистов.
- Краткость: отсутствие закрывающих тегов и фигурных скобок сокращает объём файла по сравнению с XML.
- Поддержка сложных структур: возможность вложенности, якорей и алиасов упрощает описание иерархических данных.
- Широкая поддержка: YAML реализован практически для всех популярных языков программирования (Python, Ruby, Go, Java, JavaScript, C++ и др.).
Недостатки
- Чувствительность к отступам: ошибка в количестве пробелов (или использование табуляции вместо пробелов) приводит к неверной интерпретации структуры, что может быть трудно отлаживать.
- Отсутствие строгой типизации: автоматическое приведение типов (например, строки
"yes"к логическому значению) может приводить к неожиданным результатам, особенно в YAML 1.1. - Сложность синтаксиса: неочевидные правила для многострочных строк, специальных символов и якорей могут запутывать новичков.
- Безопасность: при десериализации YAML из ненадёжных источников возможно выполнение произвольного кода (если парсер поддерживает произвольные объекты). Рекомендуется использовать безопасные парсеры (например,
yaml.safe_loadв Python).
Критика и ограничения
Основная критика YAML связана с его неоднозначностью и сложностью спецификации. Например, в YAML 1.1 строка "yes" интерпретируется как логическое true, а "no" — как false, что может вызывать ошибки. В YAML 1.2 это поведение было изменено, но не все реализации обновились. Также критикуется использование отступов как единственного способа обозначения вложенности: при редактировании файла в разных редакторах (с разными настройками табуляции) структура может быть нарушена.
Другим ограничением является отсутствие стандартного способа комментирования внутри структур (комментарии возможны только на уровне строк). Кроме того, YAML не поддерживает ссылки на внешние файлы или импорт по умолчанию, хотя некоторые инструменты (например, Ansible) добавляют эту функциональность расширениями.
Сравнение с альтернативами
| Характеристика | YAML | JSON | XML | TOML |
|---|---|---|---|---|
| Читаемость | Высокая | Средняя | Низкая | Высокая |
| Размер файла | Малый | Средний | Большой | Малый |
| Поддержка комментариев | Да | Нет | Да | Да |
| Чувствительность к отступам | Да | Нет | Нет | Нет |
| Поддержка сложных типов | Да (даты, якоря) | Ограниченная | Да (схемы) | Ограниченная |
| Скорость парсинга | Средняя | Высокая | Низкая | Высокая |
Интересные факты
- Название YAML изначально расшифровывалось как «Yet Another Markup Language», но позже было изменено на рекурсивное «YAML Ain’t Markup Language», чтобы подчеркнуть, что YAML — это формат данных, а не язык разметки.
- YAML является надмножеством JSON: любой корректный JSON-документ является также корректным YAML-документом (хотя обратное неверно).
- В сообществе разработчиков существует шутка, что YAML расшифровывается как «YAML is a Markup Language» (YAML — это язык разметки), что противоречит официальному рекурсивному акрониму.
- Спецификация YAML 1.2 содержит более 100 страниц, что делает её одной из самых объёмных спецификаций форматов сериализации.
Источники
- Спецификация YAML 1.2 (yaml.org/spec/1.2/spec.html)
- Документация Ansible по синтаксису YAML
- Официальная документация Kubernetes по манифестам
- Статья «YAML: Probably not so great after all» (сообщество разработчиков)
- Книга «YAML Essentials» (Packt Publishing, 2015)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →