YAML

vereinfachte Auszeichnungssprache zur Datenserialisierung

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
Dateiendung: .yml (veraltet),[1] .yaml
MIME-Type: application/yaml[2]
Erstveröffentlichung: 11. Mai 2001
Aktuelle Version 1.2.2[3]
(2021-10-01)
Art: Datenaustausch
yaml.org


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

Design-Ziele

Bearbeiten

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

Bearbeiten

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]

Assoziative Listen:

--- # Block
name: John Smith
age: 33
--- # Inline
{name: John Smith, age: 33}

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 [6]

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

--- >
  Umbrochener Text
  wird zu einem
  einzigen Absatz
  gefaltet.

  Leerzeilen bezeichnen
  dagegen Absatzumbrüche.

Liste von assoziativen Listen:

- {name: John Smith, age: 33}
- name: Mary Smith
  age: 27

Assoziative Liste von Listen:

men: [John Smith, Bill Jones]
women:
  - Mary Smith
  - Susan Williams

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, Uhrzeit
port-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ö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, 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.

Implementierungen

Bearbeiten

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

Ähnliche Techniken

Bearbeiten

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.[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.

Bearbeiten

Einzelnachweise

Bearbeiten
  1. Is there an official extension for YAML files? In: yaml.org. Abgerufen am 15. Januar 2021.
  2. Roberto Polli, Erik Wilde, Eemeli Aro: RFC 9512 – YAML Media Type. Februar 2024 (englisch).
  3. YAML Ain’t Markup Language (YAML™) Version 1.2.2. In: yaml.org. Abgerufen am 28. März 2022.
  4. Clark C . Evans: YAML Draft 0.1. 11. Mai 2001, abgerufen am 22. Juni 2019 (Newsgroup, jetzt auf Yahoo Groups).
  5. RFC 2822 – Internet Message Format. April 2001 (englisch).
  6. Ein Limerick aus dem Buch Eine kurze Geschichte der Zeit von Stephen Hawking zum Thema Relativitätstheorie
  7. noyaml.com
  8. The yaml document from hell. ruudvanasseldonk.com
  9. YAML: probably not so great after all. Abgerufen am 1. Juli 2022.
  10. yaml.org
  11. PyYAML yaml.load(input) Deprecation. In: yaml/pyyaml. github, abgerufen am 1. Juli 2022 (englisch).
  12. Arbitrary code execution via Swagger YAML parser (CVE-2017-1000207 and CVE-2017-1000208). In: LGTM Blog. 28. Juni 2018, archiviert vom Original (nicht mehr online verfügbar) am 28. Juni 2018; abgerufen am 1. Juli 2022.  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/lgtm.com
  13. yaml_parse. In: Manual. PHP, abgerufen am 1. Juli 2022.
  14. Module: YAML (Ruby 2.4.0). Abgerufen am 1. Juli 2022.
  15. R YAML package. Vanderbilt University, Department of Biostatistics, 20. Januar 2012, ehemals im Original (nicht mehr online verfügbar); abgerufen am 26. Januar 2018 (englisch).@1@2Vorlage:Toter Link/biostat.mc.vanderbilt.edu (Seite nicht mehr abrufbar. Suche in Webarchiven)
  16. David Tolnay: Crate serde_yaml. Abgerufen am 1. Juli 2020 (englisch).
  17. YAML Ain’t Markup Language (YAML) Version 1.2