try-catch: Was ist eine Programmiersprache?

Welche Sprachen sprechen Sie? Natürlich Deutsch, wahrscheinlich Englisch, vielleicht auch ein wenig Spanisch und ein paar Wörter Französisch. Ich spreche Java, VHDL, HTML, kannte auch früher etwas VB – da bin ich aber total aus der Übung – und ein paar Brocken CSS. Gerade lerne ich TypeScript, aber mehr so als Hobby. Programmiersprachen sind ein Thema, das viele verschiedene Facetten besitzt und für Außenstehende sehr undurchsichtig ist. Trotzdem haben sie eine große Bedeutung für die Arbeit der Programmierer. In diesem Artikel erfahren Sie alles über Programmiersprachen, was Sie wissen sollten.

Wozu gibt es Programmiersprachen?

Das, was der Computer eigentlich an Befehlen verarbeiten kann, ist sehr schwer lesbar und kaum verständlich. Deswegen verwenden die Codierer ein Hilfskonstrukt: die Programmiersprache. Sie liefert eine Grammatik (Syntax), in der man seine Software-Beschreibung verfassen kann. Weil durch die Regeln dieser Sprache die Befehle eindeutig werden, kann man sie später auch für den Rechner übersetzen. Der Vorteil ist, dass man den Code sehr viel leichter lesen, verstehen und verfassen kann, als es bei den primitiven Computerbefehlen der Fall ist. Dadurch kann man die Software-Mechanismen leichter begreifen, Algorithmen schneller verfassen, Fehler leichter finden, mit anderen besser über den Code reden und sogar teilweise Dinge im Programm analog zu real existierenden Gegenständen und Konzepten benennen. Der Nachteil ist, dass man weniger Kontrolle über die tatsächliche Ausführung hat. Man ist deshalb angewiesen auf die Performance-Optimierungen der im Hintergrund arbeitenden Werkzeuge. Manchmal ist es dadurch auch schwer nachzuvollziehen, warum sich der Computer gerade auf eine bestimmte Art und Weise verhält. Insgesamt überwiegen aber die Vorteile massiv.

Muss man Programmiersprachen wirklich lernen?

Leider ja. Programmiersprachen nähern sich zwar immer mehr unserer natürlichen Sprache an, aber sie haben noch längst nicht das gleiche Niveau erreicht. Trotzdem gibt es einen kleinen Trost: Wer schon eine Sprache kann, der kann ähnliche Sprachen sehr leicht dazulernen, denn das Schwierige sind nicht unbedingt die Regeln an sich, sondern das gesamte Konzept. 
Es gibt jedoch einige Bestandteile, die man sich einprägen muss. Dazu gehören

  • Schlüsselwörter/Keywords: Das sind Wörter, die im Code etwas bestimmtes markieren oder auslösen.
  • Sonderzeichen: Ähnlich wie Schlüsselwörter können auch bestimmte Zeichen für eine Aufgabe im Code reserviert sein.
  • Platzierung von Informationen im Text: Manchmal muss man darauf achten, wo man etwas im Text platziert, weil der Computer bestimmte Dinge an festen Stellen im Text sucht.
  • Aufbau aus mehreren Texten: Damit man die Übersicht behalten kann und das Programm strukturiert ist, muss man Abschnitte des Codes über mehrere Texte verteilen. Hier muss darauf geachtet werden, welche Teile voneinander wissen sollen.
  • Verhalten der Ausführung: Als Coder muss man sich genau vorstellen können, welche Teile des Codes wann ausgeführt werden. Dazu gehört auch das Wissen über Gleichzeitigkeit, Reihenfolgen und das temporäre Sperren von Bereichen.
  • Konventionen: Das sind Regeln in der Formatierung des Codes, die zwar keine Pflicht sind, aber sehr nachdrückliche Empfehlungen. Man sollte sie kennen, denn sie erleichtern einem Team das gemeinsame Arbeiten an einer Software.

Die Sprache erlaubt es mir, Mist zu bauen…

Eine Programmiersprache lässt dem Codierer jedoch auch gewisse Freiheiten. Dazu gehören nicht nur die Reihenfolge der Befehle und die Auswahl der Eingaben, sondern auch frei wählbare Namen. Man kann zum Beispiel Code-Abschnitte benennen, um sie später besser finden zu können und um zu wissen, was sie machen, ohne sie genau anschauen zu müssen. Auch gerade gehaltene Daten kann man mit Namen versehen. Dadurch fällt es leichter zu verstehen, was die Befehle machen.
Ein Beispiel: Ich möchte im Code zwei Zahlen nach dem Komma abrunden und dann addieren. Ohne frei wählbare Namen sähe das beispielsweise so aus:

int z = Math.round(x) + Math.round(y);

Mit frei wählbaren Namen erhält man hingegen:

int summe = rundeAbUndAddiere(ersterSummand, zweiterSummand);

Auch der untere Code ist für Laien noch nicht so leicht zu verstehen, aber immerhin kann man sich denken, was in etwa passiert. Das große Problem ist, dass viele mit dieser Freiheit nicht umzugehen wissen. Schlechte Programmierer können Namen wählen, die missverständlich, komplett unverständlich oder schlicht falsch sind. Für obiges Beispiel wären sehr schlechte Namen:

int s = raua(x, y);
int xyz = roundDownUndAdd(bla, blub);
int zahl = addiere(one, two);

Komische Abkürzungen, ein Mischmasch aus Deutsch und Englisch oder einfach falsche Bezeichnungen („addiere“ ist nicht das, was der Code macht – er rundet ab und addiert) führen leider immer wieder dazu, dass man Fehler nicht findet, neue Probleme erzeugt und ewig braucht, um Code zu verstehen. Der Programmierer ist als Autor jedoch verantwortlich, dass der Text nicht nur korrekt ausgeführt wird, sondern auch von anderen Codierern verstanden werden kann. Das ist sehr wichtig, um als Team gleichzeitig an einer Software zu arbeiten, um selber Fehler zu erkennen und um seinen eigenen Code noch nach einem Jahr verstehen zu können.

Wie haben sich Programmiersprachen im Laufe der Zeit entwickelt?

Die ersten Computer waren eben nur das: Computer, also Rechner. Sie konnten nur mehr oder weniger primitive Berechnungen durchführen wie „addiere 1 zu 3“ oder „gibt mir die Quadratwurzel zu 16“. Solche Berechnungen hat man miteinander verkettet und so komplexere Aufgaben erledigt. Der Code dazu sah in etwa so aus:

45 4c ea 81 02 d0 42 00 00 00

oder so

10001010100110011101010100000010000001011011000010000000000000000000000000

Nun. Das ist Maschinensprache. Das sind die Befehle, die ein Prozessor verarbeitet. Man spricht hier von einer Programmiersprache der ersten Generation. Weil man damit kaum arbeiten kann führte man das hier ein:

ADDI #1, #3, r37
SQRT #16, r74

Das ist Assembler, eine Sprache der zweiten Generation. Man ersetzte die Zahlen durch Kürzel und Symbole. Die Befehle blieben jedoch so primitiv wie in der Maschinensprache. Früher, so in den 50er und 60er Jahren, war die Auswahl der Befehle noch ziemlich eingeschränkt. Alle Möglichkeiten für einen Befehl haben auf eine Lochkarte im halben DIN-A5-Format gepasst. Dort hat man mit einer speziellen Schreibmaschine die Löcher ausgestanzt, sodass der Rechner mit einer Stiftleiste die Karte einlesen konnte. Ein Koffer voller Karten war dann ein Programm.
Teilweise programmiert man heutige Mikrocontroller noch immer in Assembler. Allerdings werden die Daten jetzt natürlich digital vorgehalten und es gibt sehr viel mehr Arten von Befehlen – auch welche, die sehr viele Aufgaben auf einmal erledigen.

1 + 3
SQRT(16)

Mit „FORTRAN“ wurde Ende der 50er Jahre die erste Höhere Programmiersprache veröffentlicht. Sie bot dem Codierer schon sehr viel bis dato unbekannten Komfort. Zum Beispiel konnte man bestimmten Abschnitten und Variablen Namen geben, was in Assembler ja überhaupt nicht möglich war. Darüber hinaus fügte man auch noch weiteren Komfort hinzu, etwa die automatische Zuweisung von Speicherzellen. So muss sich der Programmierer keine Gedanken mehr darüber machen, in welcher Zelle welche Daten liegen – er benutzt einfach die Namen der Daten.
Die dritte Generation war geboren. Viele der heutigen Sprachen entsprechen formell auch dieser Stufe, zum Beispiel „C++“ und „Java“.
Damit man sich der menschlichen Sprache immer mehr annähert, hat man auch hier nicht Halt gemacht:

SELECT birthday FROM employee WHERE lastname IS "Dinkelhuber"

SQL ist ein Beispiel für die vierte Generation. Der Code hier liest sich eigentlich schon wie ein englischer Satz. Zwar gibt es immer noch Beschränkungen in der Formulierung („SELECT – FROM – WHERE“ muss in dieser Reihenfolge mit diesen Schlüsselwörtern verwendet werden und „birthday“ und „lastname“ müssen als Spalten in der Tabelle „employee“ vorhanden sein), aber ich würde behaupten, dass auch ein Laie weiß, was der Code macht. Das Besondere ist aber, dass man keinen algorithmischen Ansatz mehr hat, also keine Berechnung mehr beschreibt, sondern einfach bestimmte Informationen anfragt und die Eigenschaften der benötigten Informationen beschreibt.
Die fünfte Generation der Programmiersprachen möchte ganz abstrakt logische Probleme lösen. Das ganze geht schon sehr in Richtung Künstliche Intelligenz. Ich gebe in den Computer ein, wer wessen Elternteil ist, ich definiere für den Computer, was Großeltern sind und dann kann ich ihm die Frage stellen, wer wessen Großelternteil ist:

parent ( ’ Elizabeth ’ , ’ Queen Mum ’) .
parent ( ’ Elizabeth ’ , ’ George ’) .
parent ( ’ Charles ’ , ’ Elizabeth ’) .
parent ( ’ William ’ , ’ Charles ’) .

grandparent (X , Z ) : -
parent (X , Y ) ,
parent (Y , Z ) .
? - grandparent (X , Y ) .
X = ’ Charles ’ ,
Y = ’ Queen Mum ’ ;
X = ’ Charles ’ ,
Y = ’ George ’ ;
X = ’ William ’ ,
Y = ’ Elizabeth ’.

Das hier ist „Prolog“. Die Programmierung erfolgt über Bekanntgabe von Fakten und die Definition von Konzepten. Würde ich alle Fakten und Konzepte der Welt ganz stumpf eingeben, dann könnte ich dem Computer die Frage stellen „Was ist das nahrhafteste Gericht, das ich mit den Resten aus meinem Kühlschrank kochen kann?“ und würde einfach so die richtige Antwort erhalten. Eine aktuelle Anwendung ist beispielsweise die Abfrage einer Bahn-Verbindung für eine bestimmte Strecke.
Man beachte: Derzeit (anno 2018) schreiben wir kommerzielle Software in Sprachen der dritten Generation mit Einstreuungen der vierten Generation (z.B. Java + SQL).

Welche Arten von Programmiersprachen gibt es?

Es gibt unzählige Arten von Programmiersprachen und in jeder Kategorie wiederum unzählige Beispiele. Wichtig ist es eigentlich nur zu verstehen, dass es für jede Aufgabe eine eigene Kategorie an spezialisierten Sprachen gibt. Trotzdem möchte ich Ihnen ein paar Beispiele nennen:

  • Aufbau von grafischen Oberflächen und Anzeigen (CSS, Angular…)
  • Beschreibung von Algorithmen und Datenverarbeitung (Java, C++, C#, .NET…)
  • Beschreibung von Datenstrukturen (HTML, XML…)
  • Konfiguration und Abfrage von Datenbanken (SQL…)
  • Beschreibung von mathematischen Funktionen, ihre Berechnung und die Anzeige von Graphen (Matlab, Octave, Mathematica…)
  • Berechnen von Statistiken und ihre Darstellung (R…)
  • Beschreibung von Hardware-Komponenten und Test auf ihre logische Korrektheit (VHDL, Verilog…)

Oft kann man mathematisch beweisen, dass all diese Sprachen exakt genau gleich viel können (Turing-Vollständigkeit). Trotzdem entwickelt man Programmiersprachen, die an ihren Einsatzzweck angepasst sind, sodass man wesentlich gemütlicher Arbeiten kann.
Ein weiterer Bereich sind sogenannte „Esoterische Programmiersprachen“. Es gibt sie aus Spaß, zum Experimentieren oder um Rekorde aufzustellen. Besonders beliebte Vertreter sind „Brainfuck“ und „Shakespeare“.

Wie können Programmiersprachen helfen, besser mit Codierern zu kommunizieren?

Das war ein langer Artikel, oder? Falls Sie einfach nur zum Finale gescrollt haben: ich kann es verstehen. Falls nicht: Gratulation, Sie wissen jetzt für einen Nicht-Programmierer sehr viel über Programmiersprachen und können auf der nächsten Firmenfeier den Respekt der Nerds gewinnen!
Aber was können Sie aus diesem Text mitnehmen? Codierer sprechen oft ähnlich wie die Programmiersprache, die sie einsetzen. Vielleicht haben Sie auch schon Sätze gehört wie

„Ach, da fliegt wieder eine EXCEPTION.“

oder

„Das Feature wäre für mich nur, den ELSE-Teil der IF-Abfrage zu entfernen.“

Bitte nehmen Sie ihnen das nicht übel. Sie sind mit dem Kopf einfach voll und ganz im Programm und haben den totalen Tunnelblick. Das kommt daher, weil man sich sehr konzentrieren und viel Cognitive Load aufbauen muss, um überhaupt etwas über den Code sagen zu können. Vielleicht würde es helfen, wenn Sie sich eine Liste mit Schlüsselwörtern der verwendeten Programmiersprache bereitlegen. Dadurch würden Sie die Aussagen zumindest ein wenig besser verstehen. Weisen Sie den Programmierer aber deutlich darauf hin, wenn er sich Ihnen gegenüber zu fachlich ausdrückt! Es ist nämlich seine Aufgabe, Dinge in normale Sprache für Sie und andere Kollegen zu übersetzen.

Quellen:

https://de.wikipedia.org/wiki/Programmiersprache

http://www.info-wsf.de/index.php/Programmiersprachen

https://en.wikipedia.org/wiki/List_of_Java_keywords

Schreibe einen Kommentar

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