3. Ein Blick über den Tellerrand

Es gibt eine Unzahl von Programmiersprachen, die nach vielen Kriterien eingeteilt werden können, z.B.

  • prozedural, funktional, deklarativ, (objektorientiert)
  • kompiliert, interpretiert, bytecode-kompiliert
  • low-level, high-level

Im (unrealistischen) “Idealfall” läuft ein prozedurales Programm Zeile für Zeile durch den Code, und es kommt in jeder Zeile dem Ergebnis durch Manipulation von Daten ein Stück näher. C arbeitet bevorzugt prozedural.

Funktionale Programmierung verzichtet im Idealfall vollständig auf die Seiteneffekte, auf denen das prozedurale Paradigma basiert, das Programm kommt durch verschachtelte Funktionsaufrufe zu seinem Ergebnis. In Python erlauben Funktionen wie map, filter und reduce, aber auch list comprehensions funktionales Programmieren. In C ist funktionales Programmieren aufgrund des Fehlens einer automatischen Speicherverwaltung (und auch eines vernünftigen eingebauten Sequenztyps) eher schwierig.

Idee der deklarativen Programmierung ist, durch eine Spezifikation des Wissens über das Problem der Rechner in die Lage zu versetzen, es lösen zu können. Normales Python bietet ebensowenig wie C eingebaute Mechanismen, um sich in diesem Paradigma zu bewegen.

Objektorientierung ist eine Art Erweiterung des prozeduralen Paradigmas. Zentraler Gedanke ist, Daten mit den auf ihnen operierenden “Methoden” in einer Einheit zu verbinden und dabei eine bessere Kapselung von Details der Implementation zu sorgen.

Komplierte Sprachen werden vor der Ausführung in Maschinencode verwandelt, interpretierte Sprachen dagegen werden von einem “Laufzeitsystem” ausgeführt, das das Programm wie geschrieben liest und die Kommandos sozusagen “on the fly” der Maschine vermittelt.

Bytecode-kompilierte Sprachen erzeugen Code für eine Maschine, die es in Wirklichkeit gar nicht gibt, die aber mittels eines Laufzeitsystems (Emulator, Bytecode-Interpreter) wiederum “on the fly” der realen Maschine vermittelt werden können.

Low-level heißt, dass sich die Sprache relativ nah an der eigentlichen Architektur der Maschine orientiert, die Maschinensprache sozusagen nur mit etwas “syntaktischem Zucker” überstreut.

High-level heißt, dass das, was die Maschine wirklich kann, erstmal nicht interessiert und sich das Design der Sprache an den Bedürfnissen der Problemlösung orientiert.

Alle diese Klassifikationen hinken – z.B. gibt es Mischformen, und für viele Sprachen existieren sowohl Compiler als auch Interpreter.

Ein paar bekannte oder originelle Sprachen

Basic: Prozedural, viele Dialekte, heute vor allem von Microsoft propagiert.

C++: Populäre objektorientierte Sprache, die etwas unter ihren C-Wurzeln leidet.

C#: Java-C-Chimäre von Microsoft.

COBOL: The teaching of COBOL should be made a criminal offense (Dijkstra).

Java: Verschönerung von C++, ziemlich gelungen, immer noch hip.

Javascript: Skriptsprache für lustige Effekte im HTML-Browser. Hat mit Java ziemlich wenig zu tun.

LISP: Die Mutter aller KI-Sprachen, funktional, meistens interpretiert, lebt als Scheme und Elisp weiter.

FORTRAN: Uralt, prozedural, schlimm. NatWis mögen es.

Ruby: Objektorientierte Skriptsprache, quasi eine Fortschreibung von Python zu mehr Reinheit der Ideen.

Pascal: Lehrsprache, prozedural, meistens kompiliert, “C mit Fesseln”; ein wenig aus der Mode.

Perl: Von einem Sprachwiss. entworfene Skriptsprache; vielseitig, chaotisch, bunt.

Prolog: Die KI-ste aller Sprachen: Deklarativ, meistens interpretiert.

Smalltalk: Die reine Lehre der Objektorientierung.

Übungen zu diesem Abschnitt

Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen

(1)

Sucht im Netz nach Code in einer der hier diskutierten Programmiersprachen (nach Möglichkeit einer, die ihr nicht kennt). Seht, was ihr davon versteht.


Markus Demleitner

Copyright Notice