YAML
YAML — зручний для читання людиною формат серіалізації даних, концептуально близький до мов розмітки, але орієнтований на зручність введення-виведення типових структур даних багатьох мов програмування.
Назва YAML це рекурсивний акронім YAML Ain't Markup Language («YAML — не мова розмітки»). У назві відображена історія розвитку: на ранніх етапах мова називалася Yet Another Markup Language («Ще одна мова розмітки») і навіть розглядалася як конкурент XML, але пізніше була перейменована з метою акцентувати увагу на даних, а не на розбивці документів.
Особливості
YAML створений Кларком Евансом (Clark Evans), для реалізації таких вимог:
- YAML короткий і зрозумілий;
- YAML дуже виразний і розширний;
- YAML допускає простий потоковий інтерфейс;
- YAML використовує структури даних, характерні для мов програмування;
- YAML легко реалізується, (можливо, занадто легко);
- YAML використовує цілісну модель даних. Немає винятків — немає безладу.
Синтаксис YAML мінімальний, особливо в порівнянні з XML синтаксисом. У специфікації вказують, що великий вплив справив стандарт RFC 822.
Використання
YAML в основному використовується як формат для файлів конфігурації. Застосовується для установки веб-каркасів Ruby on Rails і Symfony.
Приклад
У певному проекті потрібно зберігати конфігурацію, що описує відображення текстових команд на функції, за допомогою регулярних виразів. Можна подати цю структуру у вигляді простого тексту, подібного до конфігураційного файлу давньої UNIX-програми:
PRIVMSG newUri ^http://.*
PRIVMSG deleteUri ^delete.*
PRIVMSG randomUri ^random.*
Тоді витрати на розбивку мінімальні, але все стає дуже негнучким — значення не можуть містити пробіли, не можуть бути багаторядковими тощо. Підходить тільки в простих випадках.
У XML витрати на розбивку значніші:
<bindings>
<binding>
<ircEvent>PRIVMSG</ircEvent>
<method>newUri</method>
<regex>^http://.*</regex>
</binding>
<binding>
<ircEvent>PRIVMSG</ircEvent>
<method>deleteUri</method>
<regex>^delete.*</regex>
</binding>
<binding>
<ircEvent>PRIVMSG</ircEvent>
<method>randomUri</method>
<regex>^random.*</regex>
</binding>
</bindings>
Звичайно, можна зробити «дешевше» відображення з використанням атрибутів (і втратою гнучкості):
<event name = "PRIVMSG">
<method name = "newUri" regex = "^http://.*" />
<method name = "deleteUri" regex = "^delete.*" />
<method name = "newUri" regex = "^random.*" />
</event>
Тепер те ж саме на YAML:
event: PRIVMSG
methods:
- Name: newUri
regexp: '^http://.*'
- Name: deleteUri
regexp: '^delete.*'
- Name: randomUri
regexp: '^random.*'
Говорячи про відмінності YAML від XML, відзначимо також, що вкладені XML елементи можуть використовуватися для відображення довільних структур, а YAML ближчий до відображення типових моделей даних з Perl, Python, Java, що дозволяє описувати вільні поєднання послідовностей, зіставлень і скалярних типів — це ближче до реальних структур даних мов програмування, і не вимагає різних угод про DOM-відображення структур даних на документи і назад, як потрібно в XML.
Синтаксичні елементи
Послідовності
--- # Список фільмів: послідовність у блочному форматі
- Casablanca
- Spellbound
- Notorious
--- # Список покупок: послідовність у Однорядковому форматі
[milk, bread, eggs, juice]
Зіставлення імені та значення
--- # Блочний формат
name: John Smith
age: 33
--- # Однорядковий формат
{name: John Smith, age: 33}
Переведення рядків зберігаються
--- |
There was a young fellow of Warwick
Who had reason for feeling euphoric
For he could, by election
Have triune erection
Ionic, Corinthian, and Doric
Переведення рядків зникають
--- >
Wrapped text
will be folded
into a single
paragraph
Blank lines denote
paragraph breaks
Послідовності із зіставлень
- {Name: John Smith, age: 33}
- Name: Mary Smith
age: 27
Зіставлення з послідовностей
men: [John Smith, Bill Jones]
women:
- Mary Smith
- Susan Williams
Реалізації
Підтримка YAML існує в мовах програмування:
- JavaScript (здійснюється виведення YAML, але не розбір введення)
- Objective-C
- .NET Framework (сайт проекту)
- Perl
- PHP
- Python
- Ruby (YAML включений у стандартну бібліотеку починаючи з версії 1.8.)
- Java
- Haskell
- XML (поки що тільки чорновий варіант)