Camping_RIDER: Exkurs: Zum Datentyp String in verschiedenen Programmiersprachen

Beitrag lesen

Aloha ;)

Ein String erscheint vielleicht als Array. Ist das die Lösung? var_dump schon eingesetzt?

Ja habe ich auch schon vermutet im SelfHTML vorum für JavaScript ht man mir gesagt - wenn ich mich recht entsinne - das String nicht zur Array-Klasse gehören.

Strings sind in vielen Programmiersprachen sehr unterschiedlich gelöst. Das liegt daran, dass man sie verdammt oft braucht, dass sie aber trotz allem nicht so primitiv umzusetzen sind, wie richtige primitive Datentypen (z.B. Booleans oder Integer-Zahlen oder Float-Zahlen oder Character), da Strings ja aus vielen verschiedenen Zeichen bestehen. Deshalb kann man Aussagen über String in den meisten Fällen nicht auf andere Programmiersprachen übertragen (das kann man eigentlich bei keinem Datentyp, in der Praxis sind die Implementierungen der primitiven Datentypen programmiersprachenübergreifend aber so ähnlich, dass das meist schon funktioniert).

Unterschiedliche Programmiersprachen haben dementsprechend ganz unterschiedliche Vorstellungen davon, was ein String ist - und manche verwenden zu allem Überfluss sogar die gleiche Zugriffs-Syntax für Strings wie für Arrays, selbst wenn Strings in der entsprechenden Sprache eigentlich keine Arrays sind.

Ein paar Beispiele aus mir bekannten Sprachen (man möge mir einzelne Fehler verzeihen, ich schreib das meiste nur aus dem Gedächtnis runter):

JavaScript / ECMAScript

Strings sind eigene Objekte mit anderen Methoden als Arrays, akzeptieren aber für den Zugriff die gleiche Syntax wie Arrays: "Hallo"[1] ergibt "a", "Hallo".length ergibt 5 und der String "Hallo" unterscheidet sich damit in der Verwendung kaum offensichtlich vom Array ["H","a","l","l","o"], Verwechslungen sind also leicht möglich.

PHP

Strings sind hier - ähnlich wie in JavaScript - von Arrays verschiedene Objekte, leider ist auch hier der Zugriff sehr ähnlich: Auf einzelne Zeichen kann - genau wie auf Array-Elemente - mittels [ ] zugegriffen werden. Unterschiede gibt es allerdings bei der Länge. Die Array-Länge wird mit count ermittelt, die String-Länge mit strlen - allerdings ist auch das nicht ohne Tücken, da count auch für String-Objekte ein Ergebnis (nämlich 1) liefert, dem man die potenzielle Falsch-Verwendung nicht ansieht.

Java

Strings sind hier eigenständige Objekte, die ganz klar von Arrays abgegrenzt sind. Die Zugriffsmöglichkeiten sind nicht verwechselbar (ausschließlich die Methode charAt liefert einzelne Zeichen, es gibt keine Kurznotation mit [ ]) und auch der Zugriff auf die Länge ist eindeutig zu unterscheiden (zumindest zwischen String und Array, Strings haben variable Länge und length() ist eine Funktion (Methode), Arrays haben feste Länge und length ist ein Attribut).

Haskell

Strings sind hier nichts anderes als Listen (Listen sind in Haskell sowas wie Arrays in anderen Sprachen) von Zeichen, der Datentyp String ist lediglich ein Alias des Typs [Char] ("Liste von Zeichen").

Prolog

Strings sind hier eigenständige Objekte, auf die anders zugegriffen wird als auf Arrays (in Prolog: Listen), es gibt aber die Möglichkeit einer (expliziten) bi-direktionalen Konvertierung von Strings und Listen von Zeichen. Leider wird die Unterschiedlichkeit teils nicht sonderlich deutlich, da mit length/2 sowohl die Länge von Strings als auch von Arrays richtig angegeben wird. Die Konvertierung funktioniert hier in den vordefinierten Prädikaten implizit, wie bspw. memberchk/2 zeigt, das auf Strings nicht trivial funktioniert - nämlich nur dann, wenn man nicht nach dem Zeichen, sondern nach dessen entsprechendem Zeichencode sucht. Auch append/3 liefert direkt ein Array von Zeichencodes, wenn es mit Strings gefüttert wird. Auch hier also eher große Verwechslungsgefahr, wobei man immerhin den Zeichencode noch deutlich vom Zeichen unterscheiden kann, wenn eine Ausgabe daherkommt.

C

Hier sind Strings nichts Anderes als Arrays von chars.

Rust

(Anm.: Rust ist eine ganz neue Sprache, die vor allem auch für Systeme gedacht ist, also eher low-level, dabei aber einen Fokus auch Sicherheit legt)

In Rust sind Strings vor allem: anders und vielfältig. Es gibt viele verschiedene Arten von Strings mit entsprechend unterschiedlichen Typen, je nach den spezifischen Bedürfnissen der Anwendung. Schnellzugriff via [ ] ist nicht so ohne weiteres möglich, auch wenn Strings Vektoren (Rusts Array-ähnlicher Typ) sonst sehr ähnlich sind. Das Fehlen dieses Schnellzugriffs ist sogar Absicht, um Missverständnissen vorzubeugen:

Usually, access to a vector with [] is very fast. But, because each character in a UTF-8 encoded string can be multiple bytes, you have to walk over the string to find the nᵗʰ letter of a string. This is a significantly more expensive operation, and we don’t want to be misleading.

[Quelle]


Ich denke, dass die Unterschiedlichkeit klar deutlich wird. Und auch wenn es überall anders (bezogen auf primitive und quasi-primitive Datentypen) auch Unterschiede zwischen den Programmiersprachen gibt, so sind sie doch nie so groß wie bei Strings und deren Repräsentation.

Grüße,

RIDER

--
Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
# Facebook # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[