You can edit almost every page by Creating an account. Otherwise, see the FAQ.

Simple Markup Language

Aus EverybodyWiki Bios & Wiki
Wechseln zu:Navigation, Suche



Simple Markup Language
Dateiendung: .sml
Website: www.simpleml.com

Die Simple Markup Language (dt. Einfache Auszeichnungssprache), abgekürzt SML, ist ein Datenformat zur einfachen textuellen Beschreibung hierarchischer Daten. SML ist einfach und schnell von Hand zu schreiben, da es im Vergleich zu Formaten wie XML oder JSON nur eine reduzierte Anzahl an Sonderzeichen verwendet. Es unterstützt Kommentare und ist dadurch vor allem für Konfigurationsdateien geeignet. Durch die geringe Menge an Regeln, ist SML auch für Nicht-Experten leicht verständlich. SML Dateien erzielen durch die minimalistische Schreibweise und der Option zur Minifikation besonders kleine Dateigrößen und bleiben trotz Minifikation weiterhin ohne spezielle Tools (wie Pretty Printer) lesbar.

Aufbau eines SML-Dokuments[Bearbeiten]

Ein SML-Dokument repräsentiert ein einfaches hierarchisches Objekt, das aus zwei Knotentypen aufgebaut wird, Elementen und Attributen. Elemente dienen der Gruppierung und Attribute enthalten die eigentlichen Daten. Wie bei XML oder HTML beginnt ein Wurzelelement die Hierarchie. Das folgende Beispiel zeigt eine einfache Konfigurationsdatei eines Computerspiels:

Configuration
  Video
    Resolution 1280 720
    RefreshRate 60
    Fullscreen true
  End
  Audio
    Volume 100
    Music 80
  End
  Player
    Name "Hero 123"
  End
End

Das Wurzelelement Configuration gruppiert die drei Unterelemente Video, Audio und Player. Diese wiederum enthalten Attribute, die beispielsweise die Auflösung definieren (Resolution 1280 720) oder den Spielernamen festlegen (Name "Hero 123"). Attribute können einen oder mehrere Werte enthalten. Diese werden mit Whitespace getrennt hinter den Namen des Attributs geschrieben. SML-Dokumente sind zeilenbasiert und Elemente werden mit einem Endeschlüsselwort geschlossen, standardmäßig mit dem englischen Wort End.

Kommentare[Bearbeiten]

Um eine Zeile auszukommentieren oder eine Anmerkung hinzuzufügen wird das Rautezeichen # vorangestellt.

# Game.cfg
Configuration
  Video
    Resolution 1920 1080  # or use 1280 720

    #RefreshRate 60
    Fullscreen true
  End
End

Kommentare können überall im Dokument platziert werden, als einzelne Zeile oder hinter Elementen und Attributen. Leere Zeilen sind erlaubt.

Einrückung[Bearbeiten]

Zur Einrückung können beliebige Unicode-Whitespace-Zeichen verwendet werden. Die Anzahl oder Art spielt keine Rolle. Auch Werte von Attributen können mit unterschiedlichen und mehreren Whitespace-Zeichen voneinander getrennt werden, um zum Beispiel Werte mehrerer Attribute gleichartig auszurichten.

Configuration
    Video
        Resolution   1280  720
        RefreshRate  60
        Fullscreen   true
    End
End

Werte[Bearbeiten]

Werte von SML-Attributen sind einfache Strings. Es findet keine Typenunterscheidung statt. Ein SML-Attribut ist somit ein benanntes String-Array, mit mindestens einem Wert. Enthält ein Wert Whitespace-Zeichen, doppelte Anführungszeichen, Rautezeichen oder zählt zu einen der Sonderfälle, muss der Wert in doppelten Anführungszeichen geschrieben werden.

Werte
  WertOhneLeerzeichen      HalloWelt
  WertMitLeerzeichen       "Hallo Welt"
  WertMitAnführungszeichen "Hallo ""Welt"""
  WertMitRaute             "#Das ist kein Kommentar"
  LeererString             ""
  Null                     -
  NurEinBindestrich        "-"
  MehrzeiligerText         "Zeile 1"/"Zeile 2"
End

SML erlaubt die Unterscheidung zwischen leeren Strings und Nullwerten. Außerdem werden mehrzeilige Werte unterstützt. Das Zeilenvorschubzeichen LF wird hierbei durch die Escape-Sequenz "/" ersetzt. Alle Werte bleiben damit in einer Zeile und die Struktur bleibt trotz mehrzeiliger Werte erkennbar. Doppelte Anführungszeichen werden durch die Escape-Sequenz "" dargestellt.

Durch dieses minimalistische Regelwerk müssen die meistens Werte nicht in doppelten Anführungszeichen geschrieben werden, wie das folgende Beispiel einer Windows-Dateiliste zeigt:

RecentFiles
  File IMG_0004.jpg
  File c:\Misc\GreenBackground.png
  File d:\Untitled.mp4
  File c:\Photos\DSC_0366.jpg
  File 20210104_163259.mp4
  File "c:\My Files\Image - 001.png"
End

Element- und Attributnamen[Bearbeiten]

SML baut auf Unicode auf, weshalb Elemente und Attribute beliebig benannt werden können. Bezüglich der verwendbaren Zeichen gibt es keine Einschränkungen und es gelten die gleichen Schreibweiseregeln wie für Werte. Als einzige Einschränkung gilt, dass Element- und Attributsnamen nicht Null sein dürfen und das Elemente nicht den gleichen Namen wie das Endeschlüsselwort haben dürfen.

"My Root Element"
  "My First Attribute" 123
End

Eine wichtige Eigenschaft von SML ist, dass Element- und Attributnamen case-insensitve sind, das bedeutet unabhängig von Groß- und Kleinschreibung. Ein Element mit dem Namen RoterApfel ist also das gleiche wie roterApfel oder ROTERAPFEL. Das folgende SML-Dokument wäre also genauso eine gültige Konfigurationsdatei, wie im obigen Beispiel:

CONFIGURATION
  VIDEO
    RESOLUTION 1280 720
    REFRESHRATE 60
    FULLSCREEN true
  END
END

Reihenfolge[Bearbeiten]

SML-Elemente können mehrere Elemente und Attribute mit dem gleichen Namen enthalten. Je nach Anwendungsbereich kann die Reihenfolge eine Rolle spielen oder nicht. Im folgenden Beispiel einer Wiedergabeliste ist die Reihenfolge der gleichnamigen Attribute von Bedeutung:

Tracks
  Track Song1 /storage/sdcard0/Music/Song1.ogg
  Track Song2 /storage/sdcard0/Music/Rock.ogg
  Track Song3 https://www.example.com/Pop.ogg
End

Endeschlüsselwort[Bearbeiten]

SML-Dokumente können in beliebigen Sprachen geschrieben werden. Auch das Endeschlüsselwort kann angepasst werden, um eine sprachlich einheitliche Schreibweise zu erzielen. Das folgende Beispiel zeigt ein vollständig in Japanisch geschriebenes SML-Dokument mit ersetztem Endeschlüsselwort:

契約
  個人情報
    名字 田中
    名前 
  エンド
  日付 2021-01-02
エンド

Ein SML-Parser springt in diesem Fall an das Ende des Dokuments und verwendet das letzte Wort als Endeschlüsselwort. Im folgenden deutschen Beispiel ist dies das Ende Wort:

Vertragsdaten
  Personendaten
    Nachname Meier
    Vorname Hans
  Ende
  Datum 2021-01-02
Ende

Menschenfreundlichkeit[Bearbeiten]

Ein Ziel von SML ist es, ein Format zu bieten, dass leicht für Menschen lesbar ist, aber gleichzeitig auch für Maschinen. Ein besonderer Wert wird hierbei auch auf die Robustheit gelegt, ohne dabei an Funktionalität einbüßen zu müssen. Dies geschieht wie folgt:

  1. Durch die reduzierte Anzahl an Spezialzeichen und Sonderregeln ist das Format auch für Nicht-Programmierer leicht zugänglich.
  2. Die Trennung mittels Leerzeichen und Tabs ist intuitiv.
  3. Struktur wird nicht durch Einrückung erzeugt.
  4. Kommentare sind möglich und einfach zu schreiben.
  5. Namen von Elementen und Attributen sind case-insensitiv.
  6. Mehrdeutigkeiten vermeiden und eindeutige Regeln bieten.

Probleme wie ungültige abschließende Kommas oder fehlerhafte Einrückungen können mit SML nicht auftreten.

SML ist durch seine Case-Insensitivität und die wenigen Sonderzeichen vor allem für Zehnfingerschreiber angenehm und schnell zu schreiben. Element- und Attributnamen können einfach klein geschrieben werden und die Finger dadurch entlastet werden, ohne dass dadurch Probleme mit der verarbeitenden Software entstehen.

Vergleich mit XML, JSON und YAML[Bearbeiten]

Folgendes Beispiel eines Geodaten-Formats soll zum Vergleich dienen:

PointOfInterest
  City      Seattle
  Name      "Space Needle"
  GpsCoords 47.6205 -122.3493
  # Opening hours should go here
End

Das SML-Dokument stellt einen markanten geografischen Punkt dar (in dem Fall die Space Needle in Seattle), der durch drei Attribute den Namen der Stadt, den Namen des Punktes und dessen GPS-Koordinaten beschreibt. Ein Kommentar wurde hinzugefügt, der andeutet, dass noch Öffnungszeiten hinzugefügt werden können.

XML[Bearbeiten]

Mit XML können verschiedene Varianten definiert werden, um dieselben Informationen darzustellen. Ob Elemente mit InnerText verwendet werden oder Attribute hängt oft von der Präferenz des Entwicklers ab.

<?xml version="1.0" encoding="UTF-8"?>
<PointOfInterest>
  <City>Seattle</City>
  <Name>Space Needle</Name>
  <GpsCoords lat="47.6205" long="-122.3493"/>
  <!-- Opening hours should go here -->
</PointOfInterest>

Im Vergleich zeigt sich, dass wesentlich mehr Sonderzeichen verwendet werden. Vor allem Kommentare sind aufwendiger zu schreiben (<!-- und --> anstatt #) und es muss darauf geachtet werden, wo die Kommentare stehen, da sie nicht an allen Stellen erlaubt sind (z. B. Attribute auskommentieren).

SML benötigt außerdem keine Encoding- und Versionsdeklaration.

JSON[Bearbeiten]

Dasselbe Beispiel mit JSON:

{ "City":      "Seattle",
  "Name":      "Space Needle",
  "GpsCoords": [47.6205, -122.3493],
  "_comment":  "Opening hours should go here" }

JSON setzt zwingend voraus, dass die Schlüssel eines Objektes in doppelten Anführungszeichen geschrieben werden. JSON unterscheidet verschiedene Datentypen (Zahlen, Boolesche Werte, Zeichenketten und Nullwert) und nutzt zur Strukturierung Objekte und Arrays. String-Werte werden immer in Anführungszeichen geschrieben und für Sonderzeichen werden die in der C-artigen Sprachenfamilie bekannten Escape-Sequenzen mit Backslash verwendet (\", \\, \n, \t …).

JSON kommt unter anderem für Konfigurationsformate zum Einsatz, erlaubt jedoch standardmäßig keine Kommentare. Als Workaround werden z. B. Schlüssel-Wert Paare verwendet, die aus einem Schlüssel mit beispielsweise führendem Unterstrich beginnen und der Kommentartext als String angegeben wird. Alternativ kann ein Präprozesser eingesetzt werden, der C-artige Kommentare (//, /* */) herausfiltert, bevor die JSON Datei geparsed wird. Dies sind jedoch keine standardisierten Verfahren.

Objekte in JSON sind nicht benannt, wie das obige Beispiel zeigt. Erst ein Schlüssel-Wert Paar ordnet einem JSON Objekt einen Namen zu. Ein SML-Dokument im Gegensatz hat immer ein benanntes Wurzelelement, dass damit auch den Dokumenteninhalt klassifiziert (PointOfInterest) und als eine Art Formatbezeichner agiert.

YAML[Bearbeiten]

Dasselbe Beispiel in YAML:

City:      Seattle
Name:      Space Needle
GpsCoords: [47.6205, -122.3493]
# Opening hours should go here

YAML bietet im Vergleich zu JSON eine wesentlich reduziertere Schreibweise, bei der auf die Verwendung von doppelten Anführungszeichen und geschweiften Klammern wenn möglich verzichtet wird. YAML erreicht dies durch eine Strukturierung die auf Einrückung basiert, ähnlich wie bei der Programmiersprache Python. YAML unterstützt im Gegensatz zu JSON Kommentare, die wie bei SML mit einer Raute # beginnen.

Das Konzept der Einrückung ist bei einfachen Dokumenten leicht verständlich, kann jedoch bei komplexeren Dokumenten zu Problemen führen[1]. Wer Tabs zur Einrückung präferiert, muss in YAML zwingend Leerzeichen verwenden, da Tabs für die Einrückung nicht erlaubt sind[2]. Da der führende Whitespace bei YAML signifikant ist, kann er außerdem nicht wie vergleichsweise bei JSON bei einer Minifikation entfernt werden.

SML ist hier wesentliche flexibler. Tabs oder Leerzeichen können beliebig verwendet werden oder zur Einrückung im Zuge einer Minifikation ganz weggelassen werden.

Die Grundkonzepte von YAML sind einfach. Jedoch besitzt YAML auch komplexere Konzepte, die in der 84-seitigen Spezifikation beschrieben werden[3]. SML im Vergleich bietet ein wesentlich kürzeres Regelwerk.

Kodierung[Bearbeiten]

SML benötigt keine Encoding-Deklaration, wie sie beispielsweise bei XML oder HTML verwendet werden:

<head>
  <meta charset="UTF-8">
</head>

Dies wird durch das Konzept erreicht, dass eine SML-Datei immer von einer kurzen Bytefolge angeführt wird, die das verwendete Encoding eindeutig identifiziert (Byte Order Mark). Durch dieses Konzept muss das Encoding nicht von einem Algorithmus erraten werden.

Unterstützte Encodings sind UTF-8, UTF-16 (Big Endian und Little Endian), sowie UTF-32 (Big Endian). Um die Korrektheit der Daten sicherzustellen, muss ein SML-Parser bei Nicht-Vorhandensein eines BOMs oder bei Auftreten einer ungültigen Encoding-Sequenz eine Fehlermeldung bringen.

Minifikation[Bearbeiten]

SML bietet wie JSON die Möglichkeit zur Minifikation. Hierbei werden nicht signifikanter Whitespace und Kommentare entfernt und das Endeschlüsselwort auf Null gesetzt. Das Konfigurationsbeispiel sieht minifiziert wie folgt aus:

Configuration
Video
Resolution 1280 720
RefreshRate 60
Fullscreen true
-
Audio
Volume 100
Music 80
-
Player
Name "Hero 123"
-
-

Trotz Minifikation bleibt das SML-Dokument lesbar, da die Zeilenumbrüche erhalten bleiben. Da ein Zeilenumbruch nur durch ein Zeichen dargestellt wird, bringt dies im Vergleich zu JSON keine Nachteile, da auch hier mindestens ein Zeichen zur Trennung verwendet wird. Ein auf eine Zeile minifiziertes JSON-Dokument auf der anderen Seite, benötigt jedoch wieder Tools, um es besser lesbar darzustellen (Pretty Printer, TreeView Darstellung).

Mit zunehmender Verschachtelungstiefe erzielt SML gegenüber YAML weitere Größenvorteile, da die Einrückung nicht verpflichtend ist.

Einsatzgebiete[Bearbeiten]

SML ist ein universelles Format und kann in den verschiedensten Bereichen eingesetzt werden. Einige Anwendungsbereiche können sein:

  • Konfigurationsformate
  • Make / Projektdateien
  • Manifest / Metadaten
  • 2D / 3D Grafikformate
  • UI Layout
  • Geodaten
  • Multimedia
  • Lokalisierung
  • etc.

Mit SML sind nicht nur einfache Beispiele wie das folgende Rezept möglich, sondern auch beliebig komplexe Datenstrukturen.

recipe
  title "Bosten Baked Beans"
  ingredients
    ingredient 2 cups "navy beans"
    ingredient ½ pound bacon
    ... ...
  end
  steps
    step "Soak beans overnight in water"
    ... ...
  end
end

Tabellen in SML-Dokumenten[Bearbeiten]

Eine Stärke von SML ist die Verbindung von hierarchischen Datenstrukturen mit tabellarischen Daten:

Tables
  Table1
    FirstName  LastName  Age  PlaceOfBirth
    William    Smith     30   Boston
    Olivia     Jones     27   Austin
    Lucas      Brown     38   Chicago
  End
  Table2
    City     State
    Boston   Massachusetts
    Austin   Texas
    Chicago  Illinois
  End
End

Kommunikation[Bearbeiten]

SML ist außerdem eine valide Option für die Client-Server-Kommunikation z. B. als Alternative zu XML und JSON für Ajax.[4] Remote Procedure Calls mit SML zu schreiben, anstatt in XML-RPC oder JSON-RPC, fühlt sich natürlich an und profitiert von der geringen Größe von SML-Dokumenten (auch ohne Kompression).

methodCall
  methodName examples.getStateName
  params
    param i4 40
  end
end

Implementierungen[Bearbeiten]

Für fünf der im TIOBE-Index gelisteten Top-10-Programmiersprachen (Stand August 2021) existieren bereits Bibliotheken mit offenem Quelltext:

Die Referenzbibliotheken können leicht in andere Programmiersprachen portiert werden. Eine Portierung nach TypeScript ist verfügbar und es kommen stetig weitere Portierungen hinzu.

SML kann direkt im Webbrowser ausprobiert werden.[5]

Weblinks[Bearbeiten]

Einzelnachweise[Bearbeiten]

  1. YAML: probably not so great after all. Abgerufen am 8. August 2021.
  2. YAML Ain't Markup Language. Abgerufen am 8. August 2021.
  3. YAML Ain’t Markup Language (YAML) Version 1.2 3rd Edition, Patched at 2009-10-01. (PDF) Abgerufen am 8. August 2021.
  4. SmlRequest - Asynchronous Client-Server Communication with JavaScript and SML (AJAS). Abgerufen am 8. August 2021.
  5. SML Playground. Abgerufen am 8. August 2021.


Diese artikel "Simple Markup Language" ist von Wikipedia The list of its authors can be seen in its historical and/or the page Edithistory:Simple Markup Language.



Read or create/edit this page in another language[Bearbeiten]