YAML [ˈjæməl] ist ein textbasiertes Dateiformat zur Datenserialisierung, das außerdem für Konfigurationsdateien verbreitet ist. Die Idee zu YAML stammt von Clark Evans von 2001[4], die Spezifikation wurde von ihm selbst, Brian Ingerson und Oren Ben-Kiki erstellt. YAML ist an XML(da ursprünglich als vereinfachte Auszeichnungssprache gedacht) und an die Datenstrukturen in den Sprachen Perl, Python und C sowie dem in RFC 2822[5] vorgestellten E-Mail-Format angelehnt.
YAML ist ein rekursives Akronym für „YAML Ain’t Markup Language“ (ursprünglich „Yet Another Markup Language“).
Die grundsätzliche Annahme von YAML ist, dass jede beliebige Datenstruktur nur mit assoziativen Listen, Listen (Arrays) und Einzelwerten (Skalaren) dargestellt werden kann. 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.
Beispiele
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]
Block-Ausdrücke mit Größer-als-Zeichen bewirken, dass einzelne Zeilenumbrüche in Leerzeichen geändert werden:
--->Umbrochener Textwird zu einemeinzigen Absatzgefaltet.Leerzeilen bezeichnendagegen Absatzumbrüche.
Liste von assoziativen Listen:
-{name:John Smith, age:33}-name:Mary Smithage:27
Assoziative Liste von Listen:
men:[John Smith,Bill Jones]women:-Mary Smith-Susan Williams
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.[7][8]
Die angestrebte Vereinfachung der JSON-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.[9] YAML weist beispielsweise eine Vielzahl an Datentypen, einschließlich Datums- und Zeitformaten auf, die fast alle ohne Anführungszeichen geschrieben werden können. Da Strings nicht in Anführungszeichen geschrieben werden müssen, führt das 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, Uhrzeitport-forwarding-good:80:80# korrekt, String# 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# Gleitkommazahlen werden immer als solche erfasst, falls möglichpython:3.5.3# Stringpostgres: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, die es in der veralteten Version 1.1 gab und aus Variationen der Wörter "yes", "no", "true", "false", "on" und "off" bestehen.[10] Alle diese Schwierigkeiten lassen sich jedoch umgehen, indem man Strings immer in Anführungszeichen schreibt.
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.[11][12][13][14] Obwohl die meisten Implementierungen eine sichere Alternative anbieten und teilweise die unsichere Einlesefunktion als veraltet markiert haben, stellen die unsicheren Funktionen den Standard dar.
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.[17] 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.