Was an mir vorbeigegangen ist … Groß-/Kleinschreibung

Loading

Der heutige Blog, der zweite in der losen Reihe „Was an mir vorbeigegangen ist“ über Dinge die sich allgemein durchgesetzt haben, die ich aber für unnötig finde ist ein spezieller. Anders als der Titel vermuten lässt, geht es nicht um die Schreibweise im Deutschen an sich, obwohl man auch hier einiges ändern könnte, was aber für die deutsche Sprache an und für sich gilt – ich finde es schon interessant, das Englisch das sich ja aus demselben Sprachstamm entwickelte, in der Grammatik mit so viel weniger Regeln auskommt.

Es geht um Groß/Kleinschreibung bei Programmiersprachen. Ich kam drauf weil ich für meinen Ölstandmesser in Python programmiert habe und Python gehört zu den Sprachen die Groß/Kleinschreibung unterscheiden. Es bemängelte einige Fehler bzw. eigentlich nicht, es gab nur einen Hinweis das ich eine variable „Distanz“ nirgendwo verwendet habe, ja woanders habe ich eben „distanz“ geschrieben und das sind in Python zwei verschiedene Variablen. Erinnert mich irgendwie an BASIC, da musste man eine Variable auch nicht deklarieren, das erste verwenden legte sie an, gab es da einen Schreibfehler, so hatte man eine neue Variable was sehr schwer zu findende Programmfehler verursachte.

Zeichencodes

Aber ich gehe mal zurück in der Geschichte des Computers und bringe gleichzeitig etwas Computergeschichte unter. Die Problematik basiert schließlich auf den Zeichencodes. Innerhalb des Computers gibt es ja nur Bits. Wie man diese interpretiert ist abhängig vm Context. Eine Bitfolge kann z.B. für den Wert 140 stehen, oder für das Zeichen „î“ oder für den Wert – 12 oder für den Wahrheitswert „Wahr“ (wenn wie bei vielen Programmiersprachen dieser nicht in einem Bit, sondern einem Byte gespeichert wird und jeder Werte ungleich Null für Wahr steht).

Schon innerhalb eines Computers kann die Interpretation unterschiedlich sein, das betrifft nun nicht nur Programmierer sondern auch Anwender. Wer noch alte Texte hat, die unter DOS verfasst wurden und die Zeichen mit einem Code von 128 bis 255 haben (DOS arbeitete nur mit 1 Byte Codes) und diese mit einem Windowsprogramm, sagen wir mal Notepad, anschaut wird feststellen das Windows, obwohl Nachfolger von Dos die Codes anders interpretiert. Wer selbst Webseiten erstellt muss im Kopf in den Metadaten nur die Dokumentenkodierung ändern und der Browser zeigt andere Zeichen an, und hier gibt es nicht zwei sondern mindestens vier Zeichensätze.

Was ich damit sagen will: was wir für ein Zeichen sehen ist eine Vereinbarung, sie hat mit dem Bitmuster nichts zu tun. Aber das ist eigentlich ein anderes Problem, das Problem, von dem ich schreibe fing mit der Programmiersprache „C“ an. Aber ich komme zuerst mal auf die Zeichensätze zurück. Sobald die Computer Text verarbeiten können mussten – und auch Programme sind im Endeffekt Text, braucht man eine Vereinbarung welche Bitfolge für welches Zeichen steht. Anfangs kochte hier jeder Hersteller sein eigenes Süppchen. Große Hersteller wie IBM konnten ihre Interpretation als Standard durchsetzen.

Anfangs war das ein 6 Bit Code. 6 Bits erlaubt 64 Zeichen. Das reicht aus für die Großbuchstaben, Zahlen, Satzzeichen, aber es reicht nicht für Groß- und Kleinbuchstaben. Entsprechend waren die Befehle in den ersten Programmiersprachen FORTRAN und COBOL nur in Großbuchstaben und alle Ausgaben dieser Programme meist auch in Großbuchstaben. Ich habe solche vom Finanzamt und anderen Stellen noch sehr lange bekommen, erst mit der Jahrtausendwende wo man dem Y2K-Bug ausmerzte ging man auch diese Ausdrucke an.

Von Vorteil des 6 Bit Codes war auch das Computerarchitekturen mit weniger Bits auskamen. So gab es damals auch Rechner mit 12, 18 oder 24 Bits, z.B. von CDC oder Digital Equipment.

In den sechziger Jahren bürgerte es sich ein, 8 Bits für ein Byte zu verwenden. Es wurde für die Codierung der ASCII Standard geschaffen der 95 Bitfolgen (von 32 bis 126) normierte und nun alle Zeichen einer Tastatur inklusive Groß/Kleinschreibung umfasste inklusive einiger Zeichen die für die Allgemeinheit erst Jahrzehnte später wichtig werden sollten wie „@“ (Code 64) und „#“ (Code 35). Der ASCII-Code hat nur die Buchstaben die es im englischen gibt (ASCII steht für American Standard Code for Information Interchange) was dann später bei europäischen Sprachen mit Umlauten und Akzenten zu Problemen führte, an Sprachen mit Nicht-Lateinischen Buchstaben oder mehr als einige dutzend Zeichen dachte man erst recht nicht. Undefiniert blieben die Zeichen mit Codes 128 bis 255, die dann auch je nach Hersteller für eigene Zeichen genutzt wurden und z.B. das obige Problem von Windows und DOS-Texten verursachen.

Programme in Groß/Kleinscheibung

Nun konnte man Programme in Groß- und Kleinbuchstaben verfassen und die meisten neuen Sprachen interpretierten diese Freiheit dahingehend das sie die Groß/Kleinschreibung intern ignorierten. Ob ein Befehlswort nun als „for“, „FOR“ oder „FoR“ oder irgend einer anderen der möglichen Kombinationen geschrieben wurde, war egal. Das ist eigentlich auch die Art wie ich als Mensch denke. Wenn jemand etwas in GROSSBUCHSTABEN schreibt, dann meistens weil er Aufmerksamkeit möchte. Wer viel Aufmerksamkeit möchte, benutzt GROSSBUCHSTABEN HAEUFIG UND EXZESSIV!, aber er meint damit nichts anderes. Also „BLUME“ ist immer noch eine Blume und kein Baum oder ein Esel.

Dann kamen Kerninghan und Ritchie mit „C“ als Programmiersprache und UNIX als Betriebssystem (man beachte – beides groß geschrieben). In beiden Systemen wurde zwischen Groß und Kleinschreibung unterschieden. Das ging los mit den Befehlen – wenn der Befehl der oben schon erwähnt wurde „for“ heißt, dann gibt es einen Syntaxfehler wenn der Benutzer „For“ schreibt. Gut daran gewöhnt man sich, und die meisten schreiben Befehle eh klein, außer sie sind sehr lang, was eher für die Namen von Bibliotheksfunktionen gilt. Aber bei eigenen Bezeichnern, das sind Variablennamen, Konstanten, Typbezeichnungen etc. gilt das auch. Und das führt eben zum obigen Beispiel bei Python: Die Variable „Distanz“ ist nicht für den Computer das gleiche wie die Variable „distanz“.

Warum? Ich habe es nie verstanden. Es bringt keine Ersparnis beim Compiler. Selbst bei einem einfachen 8 Bit Prozessor benötigt man lediglich fünf Maschinenbefehle um einen Klein- in einen Großbuchstaben umzuwandeln und umgekehrt. Wenn man sich für ein System entscheidet, kann man intern einfach alle Bezeichner in Klein- oder Großbuchstaben ablegen und den Quelltext vor dem Vergleich einfach umwandeln. Einige Sprachen machen das von sich aus, BASIC wird z.B. jeden Quelltext außer dem was in Kommentaren und Anführungszeichen steht in Großbuchstaben umwandeln. Besonders pikant: die ersten C-Compiler mit denen ich zu tun hatte, unterschieden zwar Groß-/Kleinschreibung speicherten aber nur die ersten sechs bis acht Zeichen ab. Für diese waren „a“ und „A“ unterschiedliche Bezeichner aber „variablerwert“ und „variablerWERT“ genau das gleiche, wie übrigens auch „variablerXYZ“. Fehlermeldungen gab es da keine.

Es ist nur umständlich, es lehnt sich nicht an das menschliche Denken an und die Begrenzung der Zeichenzahl (die es heute nicht mehr gibt, anders als die Unterscheidung von Groß/Kleinschreibung) führt zu wirklich schwer zu findenden Fehlern.

Warum nur, ich habs nie verstanden?

Natürlich kann man mit Groß/Kleinschreibung ein System aufbauen um sofort erkennen zu können um was es sich bei einem Bezeichner handelt. So sind in vielen alten C-Compilern alle Konstanten nur in Großschreibung abgelegt, da erkennt man das es eine Konstante ist, sofort. C ist auch anfällig weil die Sprache viele Freiheiten in der Benutzung von Variablen lässt, man also nicht im Quelltext aus der Benutzung sofort erkennen kann welchen Typ sie hat. Entsprechend gibt es Systeme Variablen und Typen zu kennzeichnen wie Präfixe oder Postfixe die für bestimmte Typen stehen. „d“ z.B. für den Fließkommatyp double und „i“ für den Ganzzahltyp int. Doch zum einen sind das nur Vereinbarungen unter Programmierern, keine Eigenschaft der Sprache, und zum anderen würden die auch funktionieren, wenn de Compiler zwischen Groß-/Kleinschreibung nicht unterscheidet. So bleibt der Fehler, der vor allem dann zuschlägt, wenn die Namen komplexer werden, was bei den vielen Bibliotheksfunktionen, die Sprachen heute haben, fast zwangsläufig der Fall ist. Damit Benutzer es wirklich schwer haben, wechseln in diesen dann oft Groß- und Kleinschreibung innehab eines Worts ab.

Seltsamerweise übernam das System von „caee sensitive“ viele moderne Sprachen, die sonst viele der Altlasten von „C“ abgeschafft haben. C gilt eigentlich als „Superassembler“. Eine sehr hardwarenahe Sprache die viele Dinge erlaubt die in anderen Sprachen verboten sind, aber auch daher sehr fehleranfällig ist. Die meisten Sprachen, welchee die Syntaxelemente von C übernommen haben, besserten hier nach, hoben sie Sicherheit an und von der C-Syntax leiten sich viele Sprachen ab wie Java, Javascript. Aber sie alle haben komischerweise die Unterscheidung von Groß- Kleinschreibung übernommen. So eben auch Python und das obwohl diese Sprache sowohl syntaktisch wie auch vom Programmiermodell gar nichts mit C zu tun hat.

Kleiner Ausflug zur KI und KD

Okay, bis hierhin sind nur Programmierer betroffen und das sind ja immer weniger. Angesichts von KI wird das Programmieren auch weiter abnehmen, auch wenn ich bisher den Eindruck habe, das „KI“ eher als „KD“ nämlich „künstliche Dummheit“ abgekürzt werden sollte – KI Systeme können sprachlich tolle Texte erstellen wenn man ihnen einige Fragen oder eine Einführung vorgibt, die SEO-optimiert sind, nur die Fakten darin stimmen nicht, oder sie erzeugen wie ich selbst mal ausprobiert hab,e bei der Umsetzung von „Text to Image“ aus einem Text der „Dinosaur“ enthält Saurier die irgendwie an den T-Rex erinnern (andere Dinosaurier kennt das System wohl nicht), aber drei Armpaare haben.

Mich erinnert vor allem die KI die Texte schreibt, an einige Menschen die mir ab und an schreiben wir schrecklich meine Sprache ist. Deren Aussage kann ich oft so zusammenfassen „Ich kann nicht beurteilen, ob das was sie schreiben stimmt, aber sie haben so viele Sprachfehler, das ich davon ausgehen muss das der Text auch nicht fachlich korrekt ist“, oder wie ich in einem Wort es auf den Punkt bringe: „Deutschlehrer“ – können die deutsche Sprache perfekt, aber sonst nichts, die Eunuchen in der Wissenschaft. (Wissen wie es geht, aber können es nicht).

Groß/Kleinschreibung in Betriebssystemen

Aber ich schweife ab, wo war ich, ach ja, bei der Bedeutung für jeden. Nun ist nicht nur C mit diesem „Feature“ der Unterscheidung von Groß- / Kleinschreibung versehen, sondern auch UNIX als Betriebssystem (übrigens wie C Groß geschrieben, obwohl alle Befehle in Kleinbuchstaben sind) und das unterscheidet auch zwischen Groß- und Kleinschreibung. Da von UNIX das weit verbreitete Betriebssystem Linux abstammt, hat es dies geerbt. Wer nun nicht gerade einen Bastelcomputer wie den Raspberry Pi hat oder einer 5 Prozent der deutschen User ist, die Linux als primäres Betriebssystem installiert haben, dem könnte das egal sein, aber dazu noch mehr. Was bedeutet das? Nun zum einen führen schon kleine Schreibfehler zu einer Fehlermeldung. Mit dem Befehl „ls“ listet man das Verzeichnis, „LS“ oder „lS“ oder „Ls“ ergeben eine Fehlermeldung – lästig, aber wenn man weiß das man alles kleinschreiben muss, geht es, außer die Programmierer unterscheiden bei Parametern auch nach Groß-/Kleinschreibung, das als ein Parameter „-D“ angehängt nicht das gleiche wie „-d“ ist (ja und es gibt solche Beispiele wo beides genutzt wird!).

Lustiger wird es, wenn man eine Datei mehrmals ablegt, denn für Linux ist eine Datei mit dem Namen „Mein Text“ nicht das gleiche wie „mein text“. Man kann so problemlos mehrere Dateien in unterschiedlicher Schreibweise anlegen – Nutzen? Tja also für mich ist da keiner da. Selbst die Hilfefunktion des Betriebssystems hat diese Macke. Unter UNIX/Linux kann ich, wenn ich nicht mehr genau weiß wie etwas heißt, die Autovervollständigen-Funktion nutzen. Da kam ich erst gestern damit ins Gehege. Testprogramme für einen neuen Sensor wurden abgelegt im Verzeichnis „Environment_Sensor_HAT_Code“. Das ist ein langer Name, also tippe ich meist nur den ersten Buchstaben ein und drücke auf Tab um ihn vervollständigen zu lassen. Beim Eintippen eines kleinen „e“ findet die aber nichts, weil das Verzeichnis mit einem großen „E“ anfängt. Wahrscheinlich wieder ein Fall von KI , äh KD.

Ja selbst als Websurfer kommt man damit in Berührung. Die meisten Webserver weltweit setzen Linux ein. Die Namen von Webseiten bilden Dateinamen ab und sind so sensitiv für Groß/Kleinschiebung. Also mein Blog heißt z.B. „https://www.bernd-leitenberger.de/blog/“ , tippt jemand dagegen „https://www.bernd-leitenberger.de/Blog/“ ein, so bekommt er eine Fehlermeldung. Nett, nicht wahr – deswegen haben alle meine älteren Seiten nur Dateinamen in Kleinbuchstaben und obwohl inzwischen Umlaute in Domainnamen und Seitennamen erlaubt sind, verzichte ich drauf, das macht im Zweifelsfall nur Ärger. Immerhin, bei den Domainnamen selbst ist die Schreibweise egal, also wenn ihr HTTPS://WWW.BERND-LEITENBERGER.DE bei euch eingebt so kommt ihr auf die richtige Webpräsenz, wobei, da dann in der Adressleiste der Name in Kleinbuchstaben steht ich nicht weiß ob da nicht eine DNS-Funktion mithalf. Immerhin reduziert das die Möglichkeiten von Leuten Geld zu verdienen indem sie auf Tippfehler bei wichtigen Domains setzen. Bei den Webseiten selbst wo ihr also auf den Linux Server meines Hosters zurückgreift ist die Groß- / Kleinschreibung dann doch relevant, also die Indexseite ist index.shtml und nicht Index.shtml.

Fazit

So, eigentlich sollte das ein kurzer Blog werden. Er ist durch einige Ausflüge in andere Bereiche und Abschweifen zur Künstlichen Dummheit doch etwas lang geworden. Was bleibt als Fazit? Ich habe manchmal wirklich das Gefühl das vieles was Ritchie in C und UNIX eingebaut hat ein Scherz war, ja Programmierer lieben derbe Scherze, bringen durch Programme Wechselplattenlaufwerke zum tanzen oder Drucken Tausende Seiten Papier ohne ein einziges Zeichen. Die Unterscheidung von Groß- / Kleinschreibung bringt keinerlei Vorteile, anders als andere C-Features über die man diskutieren kann, und sie widerspricht dem menschlichen denken. Dort sind zwei Dinge, die gleich geschrieben werden und sich nur in Groß- und Kleinschreibung unterscheiden eben ein und dasselbe.

13 thoughts on “Was an mir vorbeigegangen ist … Groß-/Kleinschreibung

  1. C ist eindeutig die schlampigste Programmiersprache, und dadurch die Ursache für die meisten Sicherheitslücken. Einige davon kommen auf das Konto Groß- und Kkeinschreibung.

    Wenn man sieht wie leicht sich in einigen Spielen die KI austricksen lässt, ist KI wohl eher die Abkürzung für künstliche Idiotie.

  2. Ob man einen Unterschied bei Groß- und Kleinschreibung als relevant betrachtet hängt stark von der persönlichen Sozialisierung ab. Ich bin aus Mathe und Physik gewohnt, daß ‚x‘ und ‚X‘ bzw. mA und MA _immer_ unterschiedliche Dinge bezeichnen.
    C hat das aus der Algol Tradition übernommen.
    In Algol war das aber nicht notwendigerweise Groß/Kleinschreibung. Es wurden einfach zwei verschiedene Zeichensätze verlangt, und ein Wechsel des Zeichensatzes war immer eine Wortgrenze. Es war einfach gewünscht, daß man einen Datentyp A und eine Variable a gleichzeitig haben konnte.
    Da Groß/Kleinschreibung nicht immer verfügbar war, gab es alternativ die Möglichkeit Schlüsselworte und DatenTypen durch Einrahmen mit single Quote oder durch beginnen eines Wortes mit einem Punkt ‚.‘ auszuzeichnen. Nannte sich Stropping Regime.
    Daher kommt auch der alte Coding Guide daß Symbole für den Präprozessor ausschließlich in Großbuchstaben, und Symbole die nicht vom Präprozessor angefasst werden ausschließlich in Kleinbuchstaben zu schreiben sind. CamelCase ist ein späterer Einfluß aus Sprachen und Systemen, die keinen Unterstrich als Worttrenner hatten.

    MfG

  3. Dein Argument, dass Groß- und Kleinschreibung die gleiche Bedeutung hat, stimmt für Deutsch und Englisch, aber nicht für alle Sprachen. Bei einem türkischen Bezeichner in der Programmiersprache z.B. wäre die Bedeutung unterschiedlich, wenn man ein großes I in ASCII in ein kleines verwandelt – die Entsprechung wäre im Türkischen ein kleines i ohne den i-Punkt, wofür man Unicode bräuchte.
    Was neuere Programmiersprachen angeht, ist vermutlich ein Argument für die Groß-/Klein Unterscheidung, dass das die Mehrzahl der Programmierer so gewohnt ist.

    1. Programmiersprachen sind aber alle in englisch, auch neuere. Schon bei Nicht-ASCII Zeichen wird problematisch (wer laos Umlaute benutzt bekommt sehr kryptische Fehler) geschweige den andere Sprachen oder Nicht-Lateinische Buchstaben. Ich möchte nicht sagen das hier die Diskussion ins „Off-Topic“ abrutscht, aber mit natürlichen Sprachen hat das Thema nichts zu tun und es wäre hilfreich für eine Diskussion wenn man auch Programmiersprachen aus eigener erfahrung kennt.

      1. He, wir haben seinerzeit dem C64 ein deutsches Basic verpaßt! (Bankswitching, d.h. das BASIC ROM ins RAM spiegeln, modifizieren und dann umschalten machts möglich).

        Hat immer für hervorragende Verwirrung gesorgt 🙂

        1. Ich habe auch mal so ein Programm geschrieben für Turbo Pascal. Das nahm einen Quelltext mit deutschen Schlüsselwörtern entgegen und übersetzte ihn in den englischen Text der dann compilierbar war. Ich habe davon sogar mal ein Exemplar verkauft. Das ändern des .com Files in dem ja alle Schlüsselworte drin stehen habe ich mich allerdings nicht getraut. Heute ginge das weil ich inzwischen den Quelltext des Compilers habe.

          1. Der Charme unseres Hacks war ja, daß die Übersetzungen im ROM ersetzt wurden durch entsprechende Worte im gespiegelten RAM.

            D.h. man konnte ein x-beliebiges Basic Programm laden, das dann auf dem Bildschirm entsprechend mit „deutschem Basic“ angezeigt und ausgeführt wurde. Das betraf natürlich alle Befehle, ein Programm von z.B. Floppy hat man also nicht mit „load xxxx“ sondern eben mit „lade xxxx“ geladen. Und natürlich andersrum auch; ein Programm in „deutschem Basic“ abgespeichert, wurde dann auf einem anderen Rechner im gewohnten englischen Basic angezeigt.

            Klar, es war ein hack aus Jux, aber alleine die Gesichter der Leute, die das nicht glauben wollten, und dann doch gesehen haben, sind mir lange im Gedächtnis geblieben 🙂

  4. Ist „Sie war stets gut zu Vögeln“ das Gleiche wie „Sie war stets gut zu vögeln“?
    Bei Unterscheidung von Klein- und Großschreibung erweitert das auch beim Programmieren die Ausdrucksfähigkeit.

      1. Ich lerne Python noch, aber ich sehe auch, das der Vergleich abwegig ist.
        Programmiersprachen, haben nichts mit Sprache unter Menschen zu tun.

  5. Verstehe hier das Problem nicht. Keywords sind üblicherweise immer kleingeschrieben. Das ist auch konsequent so und gut so. Sehe keinerlei Vorteil wenn es auch nur die Möglichkeit gäbe wenn Keywords (teilweise) großgeschrieben werden könnten. Eher im Gegenteil, die Lesbarkeit würde stark leiden.

    1. Vorsicht, das ist bei von C abgeleiteten Sprachen so.

      Modula-2/3, Elan, Algol 68, Fortran und ich meine auch Algol 60 hatten groß geschriebene Schlüsselworte.
      Wobei man in Algol 68 alternativ ein Stropping Regime:
      – Keywords beginnen mit Punkt (Dot, ‚.‘) oder
      – Keywords sind in single Quotes (‚) eingeschlossen
      verwenden konnte.

      1. Es ist bei quasi allen relevanten Programmiersprachen so. Die von dir angeführten Beispiele sind allenfalls historisch interessant. Groß-/Kleinschreibungsbesonderheiten bei derart antiken Sprachen ist in etwa so relevant wie ein Vergleich der römischen Majuskelschrift der dem was du heute in Schullateinbüchern findest.

        Um mein obiges Posting auch mal zu konkretisieren: Ob nun klein oder groß geschrieben ist mir letztlich egal, auch wenn ich klein bevorzuge, weil ich eben keine Shift-Taste brauche. Wirklich wichtig ist, dass es innerhalb der Sprache einheitlich ist.
        Bernd hat ja nahegelegt das es der Sprache egal sein soll ob beispielsweise ein Keyword nun groß- oder kleingeschrieben (oder gar gemischt) werden kann. Das fände ich furchtbar zu lesen.
        Schönes Beispiel ist „string“ aus C#. Da kann man ja eben „string“ oder „String“ schreiben (genauer: System.String, üblicherweise steht aber eh ein „using System“ am Anfang).
        Wenn man ich da mal Quellcode vor der Nase hab in dem das wild durcheinander genutzt wird empfinde ich das als extrem irritierend.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.