Offenbar gibt es unterschiedliche Ergebnisse, wenn verschiedene Datentypen für die gleichen Dinge verwendet werden. Wir fangen heute mal damit an, zu verstehen, welche Datentypen es denn überhaupt gibt. Außerdem geht es scheinbar um Kaffee und Rost.
Shownotes
JSON: ein populäres Format für die Serialisierung von Daten
Serialisierung: "Abbildung von strukturierten Daten auf eine sequenzielle Darstellungsform", insb. auf Bytefolgen wie in einer Datei oder einer Datenübertragung im NetzwerkJSON ist bekannt dafür, nicht erfunden, sondern "entdeckt" worden zu seinhttps://www.corecursive.com/json-vs-xml-douglas-crockford/außerdem relativ minimal: nur sechs verschiedene Grundstrukturenaber trotzdem relativ universell: damit unser Ausgangspunkt für die Kartografierung der Welt der Datentypenaußerdem Gegenüberstellung mit dem Typvorrat von Rust (einer zeitgenössischen Programmiersprache mit einem detaillierten Typsystem)atomare Datentypen: einzelne Werte (C++ nennt sie "Plain Old Data" (POD), Perl nennt sie "Skalare")
Boolean: ein Bit (wahr oder falsch)Typvorrat in Rust: boolin JSON: true oder falseZahlen: in verschiedenen Bitgrößen, mit oder ohne Vorzeichen, Ganzzahl oder FließkommazahlTypvorrat in Rust: u8/i8, u16/i16, u32/i32, u64/i64, u128/i128, usize/isize, f32, f64in JSON: wie gewohnt ausgeschrieben (z.B. 42, -23.5) oder in wissenschaftlicher Notation (z.B. 7.297e-3 oder -6.022E23)Zeichenfolgen: nicht wirklich unteilbar, aber wird für gewöhnlich als einzelner Wert verstandenTypvorrat in Rust: String (UTF-8), OsString (Kodierung gemäß Zeichentabelle des Systems) und anderein JSON: als Zeichenkette mit Anführungszeichen und mit Escape-Sequenzen für nicht druckbare Zeichen (z.B. "Mit freundlichen Grüßen\nErika Mustermann")fehlender Wert: in JSON null (heißt woanders vielleicht auch nil)Typvorrat in Rust: siehe späterListen: ein abgeleiteter Datentyp
deswegen vorhin "atomar": der Typ einer Liste bestimmt sich aus dem Typ der Elemente (in statisch typisierten Programmiersprachen ist z.B. "Liste von 8-Bit-Zahlen" etwas anderes als "Liste von Strings" oder "Liste von Listen von Strings")Typvorrat in Rust:mit variabler Länge: Vec, wobei X für den Typ der Elemente steht (Beispiele zu oben: Vec, Vec, Vec>); der Name "Vec" deutet auf die Struktur im Arbeitsspeicher hinmit fester Länge: [X; N], wobei N für die Anzahl von Elementen stehtin JSON: kommagetrennte Liste der Elemente in eckigen Klammern (z.B. [42, 23])Unterschiede zu Rust:JSON ist nicht statisch typisiert und hat nur einen Listentyp, der alle möglichen Elemente enthalten kann und beliebig lang sein kann (z.B. [42, "Hallo", []])assoziative Datenfelder: ein anderer abgeleiteter Datentyp
enthält nicht einzelne Elemente, sondern Paare von Schlüssel und Wert; ermöglicht schnellen Zugriff auf einen Wert anhand seines Schlüsselsheißt je nach Programmiersprache bzw. Datenformat "Objekt", "Map", "Dictionary" etc.Typvorrat in Rust: unter anderem HashMap, wobei K der Schlüsseltyp ("key") und V der Werttyp ("value") ist; der Name "HashMap" deutet auf die Struktur im Arbeitsspeicher hinin JSON: kommagetrennte Liste von Wertpaaren in geschweiften Klammern, die Wertpaare jeweils mit Doppelpunkt getrennt; der Schlüssel muss ein String sein (z.B. {"Karo": 9, "Herz": 10, "Pik": 11, "Kreuz": 12})wiederum Unterschied zu Rust: Werte verschiedener Typen dürfen gemischt werdenDamit ist alles beschrieben, was JSON kann, doch es gibt so viel mehr! Beispiele für abgeleitete Datentypen:
Mengen ("Sets"): wie Listen, aber ohne definierte Ordnungin Rust: HashSet; der Name "HashSet" deutet auf die Struktur im Arbeitsspeicher hinGraphen: Netzwerke von Knoten mit Kanten dazwischen (z.B. Straßenkarte: Kreuzungen = Knoten, Straßen = Kanten)in Rust: kein entsprechender Typ in der Standardbibliothekähnlich wie bei Listen und assoziativen Datenfeldern viele verschiedene Implementationsstrategien, aber bei Graphen gibt es keinen "Standardansatz"Außerdem ist JSON relativ restriktiv in der Auswahl an PODs. Andere Serialisierungsformate unterstützen zum Beispiel Datums- oder Zeitangaben, Referenzen auf externe Dateien etc.Hörtipp: Douglas Crockford bei CoRecursive zur Entstehung von JSONLehrbuch: Structure and Interpretation of Computer Programs