Programmiersprachen

Das ist ein Thema, mit dem man sich viele Feinde machen kann.
Wer im Land X aufgewachsen ist, für den ist seine Muttersprache X eine einfach zu erlernende Sprache, und er wird sicher kaum verstehen, warum jemand mit dem Erlernen seiner Muttersprache Probleme hat und warum jemand so etwas komplexes wie die Sprache Y lernen und anwenden will.

Es gibt verschiedene Klassifizierung für Programmiersprachen.
Lassen wir mal das „X ist die Beste und Y ist ...“ weg, dann sehe ich folgende Einteilungen:

Bei der Nutzung gibt es
- Script-Sprachen, zum Beispiel Perl, Python, Apple-Script, REXX und viele andere mehr.
Es sind Interpreter-Sprachen mit mächtigen Zeichenketten-Manipulations-Funktionen und dienen als „Klebstoff“ zwischen Anwendungs- und Systemprogrammen.

- Spezial Script-Sprachen, zum Beispiel php (für den Apache WebServer) oder PL/SQL (für Oracle Datenbanken). Sie entsprechen den Script-Sprachen, nur laufen sie in sehr speziellen Umgebungen.

Ob Javascript eine Spezial Script-Sprache ist, oder doch zu den normalen Script-Sprachen gehört? Entstanden ist Javascript für Interaktionen im Web-Browser, sie wird jedoch mittlerweile in einigen weiteren Bereichen, z.B. dem Report-Generator BIRT, verwendet, deshalb trifft die Aussage „sehr spezielle Umgebung“ nicht mehr zu.

Welche Scriptsprache in einem Projekt genutzt wird, ist abhängig von der Umgebung. Sind mehrere Anwendungen in einem Unix System zu verbinden, dürfte PHP nicht die erste Wahl sein.

- Die „normalen“ Programmiersprachen, C, C++, Basic, Pascal, Java, Cobol, Lisp, Fortran, C#…

Lisp (Autocad und vor allem Emacs) und Basic (viele Microsoft Produkte) könnten auch bei den Spezial Script-Sprachen aufgeführt werden, aber sie sind als eigenständige Programmiersprachen entstanden.

Bei der Art der Ausführung gibt es einen Unterschied, Interpreter- und Compiler-Sprachen.

Der Unterschied ist nicht, ob nativer Maschinencode erzeugt wird, sondern ob eine Syntax-Prüfung und vielleicht einige Optimierungen vor der Ausführung stattfinden. Muss einmalig nach der Programmerstellung ein Compiler aufgerufen werden und merkt dieser, falls ein Variablenname falsch geschrieben wurde, ist es eine Compiler-Sprache. Viele Compiler-Sprachen erzeugen eine Zwischencode, der von einer Laufzeitumgebung interpretiert wird, oder was als „nativ“ erscheint, läuft in einer virtuellen Maschine und wird dort interpretiert. Einige Interpreter-Sprachen erzeugen zur Laufzeit nativen Maschinen-Code, um zum Beispiel Schleifen schneller abarbeiten zu können.

Es gibt Prozedurale, Funktionale, Objekt-Orientierte Programmiersprachen, es gibt Sprachen für Künstliche Intelligenz, …

Im kommerziellen Umfeld sind aber meist Prozedurale Sprachen (Fortran, Cobol, C, REXX, …), Objekt-Orientierte Sprachen (Smalltalk, ...) und Prozedurale Sprachen mit Objekt-Orientierten Erweiterungen (C++, Java., Python, ...) zu finden. 

Bei Variablen gibt es verschiedene Datentypen, zum Beispiel Ganzzahl, Datumswerte, Zeichenketten, Strukturen und Objekte. Bei einige Sprachen wird bei einer Zuweisung in Variablen der Datentypen streng geprüft, bei anderen weniger stark, es gibt, insbesondere bei Script-Sprachen auch solche, bei denen alles eine Zeichenkette ist.

Wichtig ist die Art der Speicherverwaltung.
Interpreter-Sprachen haben immer eine automatische Speicherverwaltung, Befehle zum Allokieren und Freigeben von Speicherbereichen findet man hier nicht.
Bei den Compiler-Sprachen gibt es auch solche mit einer automatischen Speicherverwaltung (Java, Basic), bei anderen muss der Programmierer selber Speicher anfordern und wieder freigeben (C, Pascal) und schliesslich gibt es Programmiersprachen, bei denen die Speicherbelegung beim Übersetzen, also wenn der Compiler arbeitet, festgelegt wird (Cobol).

Hat der Programmierer die Speicherverwaltung selber in der Hand, kann er hoch optimierte Programme schreiben, aber auch schlimme Fehler (Buffer Overflow, Memory Leak) einbauen.
Bei der automatischen Speicherverwaltung kann dieses nicht passiert, aber irgendwann muss das Programm seinen Speicher aufräumen, und es kann eine Verzögerung im Programmablauf geben.
Bei Sprachen ohne Speicherverwaltung kann das alles nicht passieren, aber wenn für ein Array oder eine Zeichenkette nicht ausreichend Speicher eingeplant war, bricht das Programm ab.

Für die Systemprogrammierung und bei ausreichenden Tests bietet Programmiersprachen mit „manueller“ Speicherverwaltung grosse Vorteile, deshalb werden Betriebssysteme in C oder C++ geschrieben.
Bei der Anwendungsentwicklung, wo auch kurz vor der Auslieferung ein Bugfix eingebaut werden muss, oder wo um auf eine Marktanforderung eine schnelle Anpassung der Anwendung erfordert, ist aber die Gefahr, durch einen Buffer Overflow oder ein Memory Leak die Sicherheit der Anwendung zu gefährden, zu gross.

Für Anwendungsentwicklung sollte deshalb die Entscheidung zwischen COBOL und einer Sprache mit automatischer Speicherverwaltung, also Java, Basic oder C# fallen.
Steht der Durchsatz, also grossen Datenvolumen in einem Batch-Lauf oder sehr viele Anwender in Online-Betrieb, im Vordergrund, spielt COBOL seine Vorteile aus. Geht es um einen geringeren Aufwand bei der Entwicklung, sind Java, Basis oder C# klar im Vorteil.