YAML

Материал из свободной русской энциклопедии «Традиция»
Перейти к навигации Перейти к поиску

Тим Брэй, один из авторов спецификации XML 1.0, недавно столкнулся с проблемой извлечения небольших данных из большого XML-файла. На своем веблоге Тим Брэй признался , что он не очень доволен результатами, сообщает газета "Компьютерные вести".

Похоже, уже даже до создателей XML начинает доходить, что если программисты http://www.xmlsuck.com/ и создают http://www.yaml.org/ ему, то, наверное, у этого формата и правда есть недостатки, не позволяющие ему быть действительно универсальным.

Clark Evans: Тогда давайте будем независимыми. В следующей версии давайте _полностью_ откажемся от синтаксиса XML. Я серьёзно. Меня достали теги и их производные.


YAML = Yaml Is Not Markup Language, создан как некоторая альтернатива XML. Проблема XML - неудобство для редактирования и чтения текста человеком. YAML - решает ту же задачу, что и XML, т.е. представление произольной сложности структур данных, но в форме, удобной для человека, такие же аналоги можно провести между HTML и WikiWiki разметкой.

YAML создан Clark Evans'ом, для реализации следующих требований:

  • YAML краток и понятен.
  • YAML очень выразительный и расширяемый.
  • YAML допускает простой потоковый интерфейс.
  • YAML использует структуры данных, родные для языков програмирования.
  • YAML легко реализуется, возможно, слишком легко.
  • YAML использует цельную модель данных. Нет исключений -- нет беспорядка.

Легок для чтения и записи[править | править код]

Синтаксис YAML сверхлегкий, особенно по сравнению с XML ным синтакисом, и хотя в спецификации не говорится о WikiWiki разметке - YAML очень похож на WikiWiki разметку. Вообще, в спецификации указывают, что большое влияние оказал стандарт RFC 822.

Рассмотрим примеры. Итак, в некотором питоновском проекте нужно хранить конфигурацию, описывающую отображение текстовых команд на функции, с помощью регулярных выражений. Структура данных на Питоне будет выглядеть так:

<code-python>

[ ("PRIVMSG", "newUri", "^http://.*"),
  ("PRIVMSG", "deleteUri", "^delete.*"),
  ("PRIVMSG", "randomUri", "^random.*") ]

</code-python>

Тут можно насчитать порядка 30 "вспомогательных" символов, необходимых для описания структуры - неплохо.

Можно представить эту структуру плоским текстом, типа конфигурационного файла от древней UNIX-программы:

 PRIVMSG newUri ^http://.*
 PRIVMSG deleteUri ^delete.*
 PRIVMSG randomUri ^random.*
 

Тогда "overhead" вообще минимален, но все становится очень негибко - значения не могут включать пробелы, не могут быть многострочными и т.п. Но в простых приложениях это сойдет.

В XML, "overhead" сильно больше: <code-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>

</code-xml>

Конечно, можно сделать более "дешевое" отображение с использованием атрибутов (и потерей гибкости):

<code-xml>

<bindings>
 <binding ircEvent="PRIVMSG" method="newUri" regex="^http://.*" />
 ...
</bindings>

</code-xml>

Но по любому понятно, что все это очень неоптимально и неудобно для ручного редактирования, а "space overhead" вреден не только расходом ресурсов для хранения, но и неудобством чтения - трудно выделить смысловую информацию в мешанине тэгов.

Теперь то же самое на YAML:

 ---
 -
    - PRIVMSG
    - newUri
    - '^http://.*'
 -
    - PRIVMSG
    - deleteUri
    - ^delete.*
 -
    - PRIVMSG
    - randomUri
    - ^random.*
 

"Space overhead" - 12 четко видимых символов, и некоторое количество пробелов и переводов строк. (YAML использует "---", для разделения документов внутри файла или потока.)

Говоря об отличиях YAML от XML, отметим также, что вложеннее XML элементы обычно используются для отображения иерархических структур, а YAML более ближе к отображению моделей данных из Perl, Python, Java, позволяя описывать свободные винигреты из последовательностей, отображений и скалярных типов - т.е. ближе к реальным структурам данных программных языков, и не требует различных соглашений про DOM-отображения структур данных на документы и обратно, как требуется в XML.

Примеры[править | править код]

Счет[править | править код]

--- !clarkevans.com/^invoice
invoice: 34843
date   : 2001-01-23
bill-to: &id001
   given  : Chris
   family : Dumars
   address:
       lines: |
           458 Walkman Dr.
           Suite #292
       city    : Royal Oak
       state   : MI
       postal  : 48046
ship-to: *id001
product:
   - sku         : BL394D
     quantity    : 4
     description : Basketball
     price       : 450.00
   - sku         : BL4438H
     quantity    : 1
     description : Super Hoop
     price       : 2392.00
tax  : 251.42
total: 4443.52
comments: >
   Late afternoon is best.
   Backup contact is Nancy
   Billsmer @ 338-4338.

Лог файл[править | править код]

---Time: 2001-11-23 15:01:42 -5
User: ed
Warning:
  This is an error message
  for the log file
---
Time: 2001-11-23 15:02:31 -5
User: ed
Warning:
  A slightly different error
  message.
---
Date: 2001-11-23 15:03:17 -5
User: ed
Fatal:
  Unknown variable "bar"
Stack:
  - file: TopClass.py
    line: 23
    code: |
      x = MoreObject("345\n")
  - file: MoreClass.py
    line: 58
    code: |-
      foo = bar

Ссылки[править | править код]