YAML

Aus besserwiki.de
YAML
Official YAML Logo.svg
Dateinamen-Erweiterungen
,
Internet-Medientyp Nicht registriert
Erste Veröffentlichung 11. Mai 2001; vor 21 Jahren
Letzte Version
1.2 (Revision 1.2.2)
1 Oktober 2021; vor 10 Monaten
Art des Formats Datenaustausch
Offenes Format? Ja
Website yaml.org

YAML (/ˈjæməl/ und YAH-ml) (siehe § Geschichte und Name) ist eine von Menschen lesbare Sprache zur Daten-Serialisierung. Sie wird häufig für Konfigurationsdateien und in Anwendungen verwendet, in denen Daten gespeichert oder übertragen werden. YAML zielt auf viele der gleichen Kommunikationsanwendungen wie Extensible Markup Language (XML) ab, hat aber eine minimale Syntax, die sich bewusst von SGML unterscheidet. YAML verwendet Einrückungen im Python-Stil, um Verschachtelungen zu kennzeichnen, und ein kompakteres Format, das [...] für Listen und {...} für Maps verwendet, so dass JSON-Dateien als YAML 1.2-Dateien gelten.

Eigene Datentypen sind erlaubt, jedoch kodiert YAML von Haus aus Skalare (wie Strings, Integer und Floats), Listen und assoziative Arrays (auch Maps, Dictionaries oder Hashes genannt). Diese Datentypen basieren auf der Programmiersprache Perl, obwohl alle gängigen höheren Programmiersprachen sehr ähnliche Konzepte verwenden. Die doppelpunktzentrierte Syntax, mit der Schlüssel-Wert-Paare ausgedrückt werden, ist von den in RFC 822 definierten E-Mail-Headern inspiriert, und das Dokumententrennzeichen --- ist von MIME (RFC 2046) entlehnt. Escape-Sequenzen werden von C wiederverwendet, und der Leerzeichenumbruch für mehrzeilige Strings ist von HTML inspiriert. Listen und Hashes können verschachtelte Listen und Hashes enthalten, die eine Baumstruktur bilden; beliebige Graphen können über YAML-Aliase dargestellt werden (ähnlich wie XML in SOAP). YAML soll in Streams gelesen und geschrieben werden, eine Funktion, die sich an SAX orientiert.

Unterstützung für das Lesen und Schreiben von YAML ist für viele Programmiersprachen verfügbar. Einige Quellcode-Editoren wie Vim, Emacs und verschiedene integrierte Entwicklungsumgebungen verfügen über Funktionen, die die Bearbeitung von YAML erleichtern, wie z.B. das Aufklappen von verschachtelten Strukturen oder das automatische Hervorheben von Syntaxfehlern.

Die offiziell empfohlene Dateinamenserweiterung für YAML-Dateien ist seit 2006 .yaml.

YAML [ˈjæməl] ist eine vereinfachte Auszeichnungssprache (englisch markup language) zur Datenserialisierung, angelehnt an XML (ursprünglich) und an die Datenstrukturen in den Sprachen Perl, Python und C sowie dem in RFC 2822 vorgestellten E-Mail-Format. Die Idee zu YAML stammt 2001 von Clark Evans, die Spezifikation wurde von ihm selbst, Brian Ingerson und Oren Ben-Kiki erstellt.

YAML ist ein rekursives Akronym für „YAML Ain’t Markup Language“ (ursprünglich „Yet Another Markup Language“).

Geschichte und Name

YAML (/ˈjæməl/, reimt sich auf Kamel) wurde erstmals 2001 von Clark Evans vorgeschlagen, der es zusammen mit Ingy döt Net und Oren Ben-Kiki entwickelte. Ursprünglich sollte YAML für Yet Another Markup Language stehen, da es in einer Zeit veröffentlicht wurde, in der es eine Vielzahl von Auszeichnungssprachen für die Darstellung und Vernetzung gab (HTML, XML, SGML, usw.). Der ursprüngliche Name war als augenzwinkernde Anspielung auf die Technologielandschaft gedacht und bezog sich auf den Zweck als Auszeichnungssprache mit dem Konstrukt Yet Another, wurde dann aber in YAML Ain't Markup Language umbenannt, ein rekursives Akronym, um den Zweck als datenorientierte und nicht als Dokumentenauszeichnungssprache zu kennzeichnen.

Versionen

Version Veröffentlichungsdatum
YAML 1.0 29. Januar 2004
YAML 1.1 18. Januar 2005
YAML 1.2.0 21. Juli 2009
YAML 1.2.1 1. Oktober 2009
YAML 1.2.2 1. Oktober 2021

Gestaltung

Syntax

Ein Spickzettel und die vollständige Spezifikation sind auf der offiziellen Website verfügbar. Im Folgenden finden Sie eine Zusammenfassung der grundlegenden Elemente.

YAML akzeptiert den gesamten Unicode-Zeichensatz, mit Ausnahme einiger Steuerzeichen, und kann in UTF-8, UTF-16 oder UTF-32 kodiert sein. (Obwohl UTF-32 nicht zwingend vorgeschrieben ist, ist es für einen Parser erforderlich, um JSON-Kompatibilität zu gewährleisten.)

  • Leerzeichen werden zur Kennzeichnung der Struktur verwendet; Tabulatorzeichen sind jedoch als Teil dieser Einrückung nicht zulässig.
  • Kommentare beginnen mit dem Nummernzeichen (#), können an beliebiger Stelle in einer Zeile beginnen und bis zum Ende der Zeile fortgesetzt werden. Kommentare müssen von anderen Token durch Leerzeichen getrennt werden. Wenn #-Zeichen innerhalb einer Zeichenkette erscheinen, handelt es sich um Zahlenzeichen-Literale (#).
  • Listenmitglieder werden durch einen führenden Bindestrich (-) gekennzeichnet, wobei ein Mitglied pro Zeile angegeben wird.
    • Eine Liste kann auch durch Einschließen von Text in eckigen Klammern ([...]) angegeben werden, wobei jeder Eintrag durch ein Komma getrennt wird.
  • Ein assoziativer Array-Eintrag wird durch einen Doppelpunkt in der Form Schlüssel: Wert mit einem Eintrag pro Zeile dargestellt. YAML verlangt, dass auf den Doppelpunkt ein Leerzeichen folgt, damit url-artige Zeichenketten wie http://www.wikipedia.org</nowiki> dargestellt werden können, ohne dass sie in Anführungszeichen gesetzt werden müssen.
    • Ein Fragezeichen kann vor einem Schlüssel in der Form "?Schlüssel: Wert" verwendet werden, damit der Schlüssel führende Bindestriche, eckige Klammern etc. ohne Anführungszeichen enthalten kann.
    • Ein assoziatives Array kann auch durch in geschweifte Klammern ({...}) eingeschlossenen Text angegeben werden, wobei Schlüssel und Werte durch Doppelpunkt und die Einträge durch Kommas getrennt sind (Leerzeichen sind nicht erforderlich, um die Kompatibilität mit JSON zu wahren).
  • Strings (eine Art von Skalaren in YAML) werden normalerweise nicht in Anführungszeichen gesetzt, können aber in Anführungszeichen (") oder einfache Anführungszeichen (') eingeschlossen werden.
    • Innerhalb von Anführungszeichen können Sonderzeichen mit Escape-Sequenzen im C-Stil dargestellt werden, die mit einem Backslash (\) beginnen. Der Dokumentation zufolge wird nur die oktale Escape-Sequenz \0 unterstützt.
    • Innerhalb von einfachen Anführungszeichen ist die einzige unterstützte Escape-Sequenz ein doppeltes einfaches Anführungszeichen (), das das einfache Anführungszeichen selbst bezeichnet, wie in 'dont'.
  • Blockskalare werden durch Einrückung mit optionalen Modifikatoren zur Beibehaltung (|) oder Faltung (>) von Zeilenumbrüchen abgegrenzt.
  • Mehrere Dokumente innerhalb eines Streams werden durch drei Bindestriche (---) getrennt.
    • Drei Punkte (...) beenden optional ein Dokument innerhalb eines Streams.
  • Wiederholte Knoten werden zunächst durch ein kaufmännisches Und (&) und danach durch einen Stern (*) gekennzeichnet.
  • Knoten können durch ein doppeltes Ausrufezeichen (!!), gefolgt von einer Zeichenkette, die zu einem URI erweitert werden kann, mit einem Typ oder Tag gekennzeichnet werden.
  • YAML-Dokumenten in einem Stream können "Direktiven" vorangestellt werden, die aus einem Prozentzeichen (%) gefolgt von einem Namen und durch Leerzeichen getrennten Parametern bestehen. In YAML 1.1 sind zwei Direktiven definiert:
    • Die %YAML-Direktive dient zur Identifikation der YAML-Version eines Dokuments.
    • Die %TAG-Direktive wird als Abkürzung für URI-Präfixe verwendet. Diese Abkürzungen können dann in Knoten-Typ-Tags verwendet werden.

Zwei weitere Zeichen sind in YAML für eine mögliche zukünftige Spezifikation reserviert: das at-Zeichen (@) und der Backtick (`).

Grundlegende Komponenten

Hinweis:

  • Das Zeichen # leitet einzeilige Kommentare ein, --- markiert den Beginn eines neuen Abschnitts.
  • Ein Kommentar in der gleichen Zeile wie --- kann zwar Probleme beim Einlesen der YAML-Datei hervorrufen – aus Übersichtsgründen ist er im Beispiel jedoch trotzdem in der gleichen Zeile.

Listen:

--- # im Block Format ein paar Filme von M. Curtiz und A. Hitchcock aus den 1940er Jahren
- Berüchtigt (Notorious)
- Casablanca
- Ich kämpfe um dich (Spellbound)
- Solange ein Herz schlägt (Mildred Pierce)
--- # Inline Format einer Einkaufsliste
[Haferflocken, Bananen, Nüsse] <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Beispiele&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/YAML#Beispiele <span style="color:#dddddd">ⓘ</span>]</span>

Assoziative Listen:

--- # Block
name: John Smith
age: 33
--- # Inline
{name: John Smith, age: 33} <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Beispiele&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/YAML#Beispiele <span style="color:#dddddd">ⓘ</span>]</span>

Block-Ausdrücke mit senkrechtem Strich bewirken, dass Zeilenumbrüche beibehalten werden:

--- |
  There was a young lady of Wright
  Who travelled much faster than light.
      She departed one day
      In a relative way
  And returned in the previous night.

Quelle

Block-Ausdrücke mit Größer-als-Zeichen bewirken, dass einzelne Zeilenumbrüche in Leerzeichen geändert werden:

--- >
  Umgebrochener Text
  wird zu einem
  einzigen Absatz
  gefaltet. <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Beispiele&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/YAML#Beispiele <span style="color:#dddddd">ⓘ</span>]</span>

  Leerzeilen bezeichnen
  dagegen Absatzumbrüche.

Liste von assoziativen Listen:

- {name: John Smith, age: 33}
- name: Mary Smith
  age: 27 <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Beispiele&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/YAML#Beispiele <span style="color:#dddddd">ⓘ</span>]</span>

Assoziative Liste von Listen:

men: [John Smith, Bill Jones]
women:
  - Mary Smith
  - Susan Williams <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Beispiele&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/YAML#Beispiele <span style="color:#dddddd">ⓘ</span>]</span>

YAML bietet einen "in-line"-Stil zur Kennzeichnung von assoziativen Arrays und Listen. Hier ein Beispiel für die Komponenten.

Erweiterte Komponenten

Zwei Eigenschaften, die YAML von den Möglichkeiten anderer Daten-Serialisierungssprachen abheben, sind Strukturen und Datentypisierung.

YAML-Strukturen ermöglichen die Speicherung mehrerer Dokumente innerhalb einer Datei, die Verwendung von Referenzen für wiederkehrende Knoten und die Verwendung beliebiger Knoten als Schlüssel.

Zur Übersichtlichkeit, Kompaktheit und Vermeidung von Eingabefehlern bietet YAML Knotenanker (mittels &) und Referenzen (mittels *). Referenzen auf den Anker funktionieren für alle Datentypen (siehe die ship-to-Referenz im folgenden Beispiel).

Nachfolgend ein Beispiel für eine Warteschlange in einem Instrumenten-Sequenzer, in der zwei Schritte wiederholt verwendet werden, ohne dass diese jeweils vollständig beschrieben werden.

Eine explizite Datentypisierung ist in den meisten YAML-Dokumenten nur selten zu finden, da YAML einfache Typen automatisch erkennt. Datentypen können in drei Kategorien eingeteilt werden: core, defined und user-defined. Core sind diejenigen, die in jedem Parser erwartet werden (z.B. Floats, Ints, Strings, Listen, Maps, ...). Viele weitergehende Datentypen, wie z.B. Binärdaten, sind in der YAML-Spezifikation definiert, werden aber nicht in allen Implementierungen unterstützt. Schließlich definiert YAML eine Möglichkeit, die Datentypdefinitionen lokal zu erweitern, um benutzerdefinierte Klassen, Strukturen oder Primitive (z.B. Quad-Precision Floats) zu berücksichtigen.

YAML erkennt den Datentyp der Entität automatisch, aber manchmal möchte man den Datentyp explizit casten. Dies ist vor allem dann der Fall, wenn ein Ein-Wort-String, der wie eine Zahl, ein Boolescher Wert oder ein Tag aussieht, durch Anführungszeichen oder durch ein explizites Datentyp-Tag disambiguiert werden muss.

Nicht jede Implementierung von YAML verfügt über alle in der Spezifikation definierten Datentypen. Diese eingebauten Typen werden mit einem doppelten Ausrufezeichen (!!) gekennzeichnet. Besonders interessante Typen, die hier nicht gezeigt werden, sind Sets, Ordered Maps, Timestamps und Hexadezimal. Hier ein Beispiel für base64-kodierte Binärdaten.

Viele Implementierungen von YAML können benutzerdefinierte Datentypen zur Objektserialisierung unterstützen. Lokale Datentypen sind keine universellen Datentypen, sondern werden in der Anwendung mit Hilfe der YAML-Parser-Bibliothek definiert. Lokale Datentypen werden durch ein einzelnes Ausrufezeichen (!) gekennzeichnet.

Beispiel

Die Hierarchie der Datenstruktur wird durch die Einrückung der Gliederung gewahrt.

Beachten Sie, dass Zeichenketten nicht in Anführungszeichen eingeschlossen werden müssen. Die spezifische Anzahl der Leerzeichen in der Einrückung ist unwichtig, solange parallele Elemente die gleiche linke Ausrichtung haben und die hierarchisch verschachtelten Elemente weiter eingerückt werden. Dieses Beispieldokument definiert ein assoziatives Array mit 7 Schlüsseln der obersten Ebene: Einer der Schlüssel, "items", enthält eine Liste mit zwei Elementen, von denen jedes Element selbst ein assoziatives Array mit unterschiedlichen Schlüsseln ist. Relationale Daten und Redundanzbeseitigung werden angezeigt: Der Inhalt des assoziativen Arrays "ship-to" wird vom Inhalt des assoziativen Arrays "bill-to" kopiert, wie durch die Anker- (&) und Referenzbeschriftung (*) angezeigt. Optional können Leerzeilen zur besseren Lesbarkeit hinzugefügt werden. Mehrere Dokumente können in einer einzigen Datei/einem einzigen Stream vorhanden sein und werden durch --- getrennt. Ein optionales ... kann am Ende einer Datei verwendet werden (nützlich, um ein Ende in der Streaming-Kommunikation zu signalisieren, ohne die Pipe zu schließen).

Merkmale

Eingerückte Begrenzungen

Da YAML zur Strukturierung primär auf die Einrückung von Gliederungspunkten setzt, ist es besonders resistent gegen Kollisionen von Begrenzungszeichen. Durch die Unempfindlichkeit von YAML gegenüber Anführungszeichen und geschweiften Klammern in skalaren Werten können XML-, JSON- oder auch YAML-Dokumente durch einfaches Einrücken in ein Blockliteral (mittels | oder >) in ein YAML-Dokument eingebettet werden:

YAML kann in JSON eingefügt werden, indem alle inneren Anführungszeichen in Anführungszeichen gesetzt und escaped werden. YAML kann in XML eingefügt werden, indem reservierte Zeichen (<, >, &, ', ") escaped und Leerzeichen umgewandelt werden oder indem es in einen CDATA-Abschnitt eingefügt wird.

Nicht-hierarchische Datenmodelle

Im Gegensatz zu JSON, das Daten nur in einem hierarchischen Modell darstellen kann, bei dem jeder Kindknoten einen einzigen Elternknoten hat, bietet YAML auch ein einfaches relationales Schema, das es erlaubt, Wiederholungen identischer Daten von zwei oder mehr Punkten im Baum aus zu referenzieren, anstatt sie an diesen Punkten redundant einzugeben. Dies ist vergleichbar mit der in XML eingebauten Funktion IDREF. Der YAML-Parser expandiert diese Referenzen dann beim Einlesen in die entsprechenden Datenstrukturen, so dass das Programm, das den Parser verwendet, kein relationales Kodierungsmodell kennen muss - im Gegensatz zu XML-Prozessoren, die Referenzen nicht expandieren. Diese Erweiterung kann die Lesbarkeit verbessern und gleichzeitig Dateneingabefehler in Konfigurationsdateien oder Verarbeitungsprotokollen verringern, bei denen viele Parameter in einer Reihe von Datensätzen gleich bleiben, während nur wenige variieren. Ein Beispiel dafür ist, dass die Datensätze "Lieferadresse" und "Rechnungsadresse" in einer Rechnung fast immer die gleichen Daten sind.

Praktische Überlegungen

YAML ist zeilenorientiert, so dass es oft einfach ist, die unstrukturierte Ausgabe bestehender Programme in das YAML-Format zu konvertieren und dabei das Aussehen des Originaldokuments weitgehend beizubehalten. Da keine schließenden Tags, geschweifte Klammern oder Anführungszeichen zu berücksichtigen sind, ist es in der Regel ein Leichtes, wohlgeformtes YAML direkt aus verteilten Druckanweisungen einfacher Programme zu erzeugen. Ebenso erleichtern die Whitespace-Begrenzer die schnelle Filterung von YAML-Dateien mit den zeilenorientierten Befehlen von grep, AWK, Perl, Ruby und Python.

Insbesondere sind im Gegensatz zu Markup-Sprachen Abschnitte von aufeinanderfolgenden YAML-Zeilen in der Regel selbst wohlgeformte YAML-Dokumente. Dies macht es sehr einfach, Parser zu schreiben, die ein Dokument nicht in seiner Gesamtheit verarbeiten müssen (z.B. Abgleich von öffnenden und schließenden Tags und Navigation von quotierten und escapten Zeichen), bevor sie mit der Extraktion bestimmter Datensätze beginnen. Diese Eigenschaft ist besonders nützlich, wenn in einem einzigen, zustandslosen Durchgang über Datensätze in einer Datei iteriert wird, deren gesamte Datenstruktur zu groß ist, um sie im Speicher zu halten, oder bei der die Wiederherstellung der gesamten Struktur, um ein Element zu extrahieren, unverhältnismäßig teuer wäre.

Obwohl es den Anschein hat, dass die eingerückte Begrenzung tief verschachtelte Hierarchien erschwert, kann YAML mit Einrückungen bis zu einem einzigen Leerzeichen umgehen, wodurch eine bessere Komprimierung als bei Auszeichnungssprachen erreicht werden kann. Darüber hinaus kann eine extrem tiefe Einrückung vollständig vermieden werden, indem man entweder: 1) auf den "Inline-Stil" (d.h. JSON-ähnliches Format) ohne Einrückung zurückgreifen oder 2) die Hierarchie mit Hilfe von relationalen Ankern in eine flache Form bringen, die der YAML-Parser transparent in die vollständige Datenstruktur umwandelt.

Sicherheit

YAML ist eine reine Datenrepräsentationssprache und verfügt daher über keine ausführbaren Befehle. Validierung und sicheres Parsen ist zwar in jeder Datensprache möglich, die Implementierung ist jedoch ein so berüchtigter Fallstrick, dass das Fehlen einer zugehörigen Kommandosprache bei YAML einen relativen Sicherheitsvorteil darstellen kann.

YAML erlaubt jedoch sprachspezifische Tags, so dass mit einem Parser, der diese Tags unterstützt, beliebige lokale Objekte erzeugt werden können. Jeder YAML-Parser, der die Ausführung einer anspruchsvollen Objektinstanziierung zulässt, eröffnet das Potential für einen Injection-Angriff. Perl-Parser, die das Laden von Objekten beliebiger Klassen erlauben, erzeugen sogenannte "blessed" Werte. Die Verwendung dieser Werte kann unerwartetes Verhalten auslösen, z.B. wenn die Klasse überladene Operatoren verwendet. Dies kann zur Ausführung von beliebigem Perl-Code führen.

Ähnlich verhält es sich bei Python- oder Ruby-Parsern. Gemäß der PyYAML-Dokumentation:

Beachten Sie, dass die Möglichkeit, ein beliebiges Python-Objekt zu konstruieren, gefährlich sein kann, wenn Sie ein YAML-Dokument aus einer nicht vertrauenswürdigen Quelle wie dem Internet erhalten. Die Funktion yaml.safe_load beschränkt diese Möglichkeit auf einfache Python-Objekte wie Integer oder Listen. [...]

Mit PyYAML können Sie ein Python-Objekt beliebigen Typs konstruieren. Sogar Instanzen von Python-Klassen können mit dem Tag !!python/object konstruiert werden.

Datenverarbeitung und -darstellung

In der YAML-Spezifikation wird ein Instanzdokument als "Presentation" oder "Character Stream" bezeichnet. Die primären logischen Strukturen in einem YAML-Instanzdokument sind Skalare, Sequenzen und Mappings. Die YAML-Spezifikation gibt auch einige grundlegende Einschränkungen vor, die für diese primären logischen Strukturen gelten. So haben z.B. Mapping-Schlüssel gemäß der Spezifikation keine Reihenfolge. In allen Fällen, in denen die Reihenfolge der Knoten von Bedeutung ist, muss eine Sequenz verwendet werden.

Darüber hinaus definiert die YAML-Spezifikation bei der Festlegung der Konformität von YAML-Verarbeitern zwei primäre Operationen: Dump und Load. Alle YAML-konformen Prozessoren müssen mindestens eine dieser beiden Operationen anbieten, optional auch beide. Schließlich definiert die YAML-Spezifikation ein Informationsmodell bzw. einen "Repräsentationsgraphen", der sowohl für die Dump- als auch für die Ladeoperationen während der Verarbeitung erstellt werden muss, wobei diese Repräsentation dem Benutzer nicht über eine API zur Verfügung gestellt werden muss.

Vergleich mit anderen Serialisierungsformaten

Vergleich mit JSON

Die JSON-Syntax ist eine Grundlage von YAML Version 1.2, die mit dem ausdrücklichen Ziel veröffentlicht wurde, YAML "in Übereinstimmung mit JSON als offizielle Untermenge" zu bringen. Obwohl frühere YAML-Versionen nicht strikt kompatibel waren, fielen die Abweichungen kaum auf, und die meisten JSON-Dokumente können von einigen YAML-Parsern wie Syck geparst werden. Dies liegt daran, dass die semantische Struktur von JSON dem optionalen "Inline-Stil" der YAML-Schreibweise entspricht. Während erweiterte Hierarchien wie JSON im Inline-Stil geschrieben werden können, ist dieser Stil in YAML nicht zu empfehlen, es sei denn, er dient der Übersichtlichkeit.

YAML verfügt über viele zusätzliche Features, die in JSON fehlen, wie z.B. Kommentare, erweiterbare Datentypen, relationale Anker, Strings ohne Anführungszeichen und Mapping-Typen, die die Schlüsselreihenfolge beibehalten.

Vergleich mit TOML

TOML wurde als Weiterentwicklung des .ini-Dateiformats konzipiert. Es wurde darauf hingewiesen, dass die YAML-Spezifikation 23.449 Wörter umfasst, während die TOML-Spezifikation nur 3.339 Wörter hat. Diese zusätzlichen Wörter und die eingerückte Syntax von YAML ermöglichen es, dass YAML im Vergleich zu TOML weniger komplex geschrieben werden kann. Außerdem ist die Hierarchie eines YAML-Dokuments durch die Einrückung ersichtlich.

Vergleich mit XML

YAML kennt keine Tag-Attribute, wie sie in XML zu finden sind. Stattdessen verfügt YAML über erweiterbare Typdeklarationen (einschließlich Klassentypen für Objekte).

YAML selbst verfügt nicht über die sprachdefinierten Dokumentenschema-Deskriptoren von XML, die z.B. die Selbstvalidierung eines Dokuments ermöglichen. Es gibt jedoch mehrere extern definierte Schemadeskriptorsprachen für YAML (z.B. Doctrine, Kwalify und Rx), die diese Aufgabe erfüllen. Auch die Semantik, die durch die sprachdefinierten Typendeklarationen im YAML-Dokument selbst gegeben ist, macht einen Validator in einfachen, alltäglichen Situationen häufig überflüssig. Darüber hinaus ermöglicht YAXML, das YAML-Datenstrukturen in XML darstellt, die Anwendung von XML-Schema-Importern und Ausgabemechanismen wie XSLT auf YAML.

Einen umfassenderen Vergleich von YAML mit anderen Serialisierungsformaten bietet der Vergleich von Daten-Serialisierungsformaten.

Software (Emitters und Parsers)

Für feste Datenstrukturen können YAML-Dateien einfach über Druckbefehle erzeugt werden, die sowohl die Daten als auch die YAML-spezifische Dekoration schreiben. Für die Ausgabe variabler oder komplexer, hierarchischer Daten ist jedoch ein dedizierter YAML-Emitter vorzuziehen. Ebenso lassen sich einfache YAML-Dateien (z.B. Schlüssel-Wert-Paare) leicht mit regulären Ausdrücken parsen. Für komplexere bzw. variierende Datenstrukturen empfiehlt sich ein formaler YAML-Parser.

YAML-Emitter und -Parser gibt es für viele gängige Sprachen. Die meisten von ihnen sind in der jeweiligen Sprache geschrieben. Einige sind Sprachbindungen der C-Bibliothek libyaml; sie können schneller laufen. Früher gab es noch eine weitere C-Bibliothek namens Syck, die von why the lucky stiff geschrieben wurde und verwaist ist: Sie wird nicht mehr gewartet, es gibt kein maßgebliches Quellpaket, und die Website wurde gekapert. Die einzige empfehlenswerte C-Bibliothek ist daher libyaml. Sie wurde ursprünglich von Kirill Simonov entwickelt. Im Jahr 2018 wurde die Entwicklung von den neuen Betreuern Ian Cordasco und Ingy döt Net wieder aufgenommen.

C++-Programmierer haben die Wahl zwischen der C-Bibliothek libyaml und der C++-Bibliothek libyaml-cpp. Beide haben völlig unabhängige Codebasen und völlig unterschiedliche APIs. Die Bibliothek libyaml-cpp hat immer noch eine Hauptversionsnummer von 0, was bedeutet, dass sich die API jederzeit ändern kann, wie es nach Version 0.3 auch geschehen ist. Es gibt eine auf die Grammatik fokussierte Implementierung in C#, die auf Erweiterungen für die verschachtelten Elemente abzielt.

Einige Implementierungen von YAML, wie z.B. YAML.pm von Perl, laden eine komplette Datei (Stream) und parsen diese en masse. Andere Implementierungen, wie z.B. PyYaml, sind "lazy" und iterieren nur auf Anfrage über das nächste Dokument. Bei sehr großen Dateien, in denen die Dokumente unabhängig voneinander verarbeitet werden sollen, kann die Instanziierung der gesamten Datei vor der Verarbeitung prohibitiv sein. In YAML.pm muss man daher gelegentlich eine Datei in einzelne Dokumente zerlegen und diese einzeln parsen. YAML macht es einem leicht, da dies lediglich eine Aufteilung am Dokumentenende erfordert. Dieses ist definiert als drei Punkte am Anfang einer Zeile, gefolgt von einem Leerzeichen (und ggf. einem Kommentar). Diese Markierung ist im Inhalt verboten.

Kritik

Insbesondere nach der weiten Verbreitung von YAML in Konfigurationen für Cloud-verwandte Systeme, beispielsweise Kubernetes und Microsoft Azure, hat das Format einige Kritik erhalten.

Die angestrebte Vereinfachung der YAML-Syntax wird nach Meinung verschiedener Kritiker nicht erreicht. Die YAML-Spezifikation ist wesentlich länger als die Spezifikationen für JSON, TOML oder selbst die als umfangreich geltende XML. YAML weist beispielsweise eine Vielzahl an Datentypen, einschließlich Datums- und Zeitformaten auf, die fast alle ohne Anführungszeichen geschrieben werden können. Das führt zu komplexen Regeln bei der Typisierung von Werten, deren Ergebnisse überraschend sein können:

time: 04:30 # Uhrzeit als Ganzzahl: 16200
# d. h. Port-Weiterleitung in Containern muss für korrektes Ergebnis evtl. in Anführungszeichen stehen:
port-forwarding-bad: 24:24 # falsch, Uhrzeit
port-forwarding-good: 80:80 # korrekt, String <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Kritik&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/YAML#Kritik <span style="color:#dddddd">ⓘ</span>]</span>

# Es gibt 22 Varianten für boolesches Wahr und Falsch:
- Don Corleone: Do you have faith in my judgment? # String
- Clemenza: Yes # Boolscher Wert Wahr (true)
- Don Corleone: Do I have your loyalty? # String <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Kritik&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/YAML#Kritik <span style="color:#dddddd">ⓘ</span>]</span>

# Gleitkommazahlen werden immer als solche erfasst, falls möglich
python: 3.5.3 # String
postgres: 9.3 # Gleitkommazahl

Hinzu kommen Schwierigkeiten wie mindestens neun Varianten für mehrzeilige Texte und die bereits erwähnten 22 Varianten für boolesche Werte.

Tolerantes Parsing, welches Fehler weitestgehend vermeiden möchte (vergleiche JavaScript), kann zu unerwarteten Resultaten führen. Beispielsweise sind abgeschnittene YAML-Dokumente, die bei unvollständiger Dateispeicherung oder einem Netzwerkfehler auftreten können, meist noch gültig.

YAML ist standardmäßig unsicher und erlaubt beim Einlesen die Ausführung beliebigen Programmcodes in einer Vielzahl von Implementierungen. Obwohl die meisten Implementierungen eine sichere Alternative anbieten und teilweise die unsichere Einlesefunktion als veraltet markiert haben, stellen die unsicheren Funktionen den Standard dar.

YAML wird wegen des großen Leerraums, der verwirrenden Funktionen, der unsicheren Vorgaben und der komplexen und mehrdeutigen Spezifikation kritisiert:

  • Konfigurationsdateien können Befehle ausführen oder Inhalte laden, ohne dass der Benutzer dies merkt.
  • Das Editieren großer YAML-Dateien ist schwierig, da Einrückungsfehler unbemerkt bleiben können.
  • Die automatische Erkennung von Typen ist eine Fehlerquelle. So werden z.B. nicht in Anführungszeichen gesetzte Yes und NO in Booleans umgewandelt, Software-Versionsnummern können in Floats umgewandelt werden.
  • Abgeschnittene Dateien werden oft als gültiges YAML interpretiert, da keine Terminatoren vorhanden sind.
  • Die Komplexität des Standards führte zu inkonsistenten Implementierungen und machte die Sprache nicht portierbar.

Die wahrgenommenen Schwächen und die Komplexität von YAML haben zur Entstehung von strengeren Alternativen wie StrictYAML und NestedText geführt.

Design-Ziele

Die grundsätzliche Annahme von YAML ist, dass sich jede beliebige Datenstruktur nur mit assoziativen Listen, Listen (Arrays) und Einzelwerten (Skalaren) darstellen lässt. Durch dieses einfache Konzept ist YAML wesentlich leichter von Menschen zu lesen und zu schreiben als beispielsweise XML, außerdem vereinfacht es die Weiterverarbeitung der Daten, da die meisten Sprachen solche Konstrukte bereits integriert haben.

Implementierungen

YAML-Implementierungen existieren unter anderem in den Programmiersprachen C, C++, C#, JavaScript, ActionScript, Perl, PHP, Python, Java, R, Ruby, Rust sowie für die .NET-Plattformen.

Ähnliche Techniken

Zu ähnlichen Formaten für Konfigurationsdateien siehe Konfigurationsdatei#Dateiformate.

Mit JSON existiert eine ähnliche Technik, die noch mehr am Objektmodell (DOM) orientiert ist und aus der Programmiersprache JavaScript stammt. JSON ist eine echte Untermenge von YAML: Jedes JSON-Dokument ist in Version 1.2 von YAML ein valides YAML-Dokument. Aus der Clojure-Welt stammt das EDN-Format, welches eine an JSON angelehnte, erweiterbare Syntax verwendet.

Auch für die grafische Notationssprache UML (Version 2) existiert eine textbasierte Alternative, die auf leichte Lesbarkeit für Menschen hin ausgelegt ist – die Human-Usable Textual Notation (HUTN). Das Metamodell von UML und HUTN ist jeweils MOF, sodass HUTN jedes UML-Diagramm als leicht lesbaren Text darstellen kann. Die leichte Lesbarkeit unterscheidet HUTN vom XMI-Format, das für den Datenaustausch zwischen UML-Applikationen vorgesehen ist.