Von A wie Assembler bis V wie Visual Basic

Eine kleine Geschichte der Programmiersprachen

Bernhard Steppan arbeitet als leitender Berater und Softwarearchitekt bei syracom Consulting in Wiesbaden sowie als Publizist. Er hat 100+ Artikel und zahlreiche Bücher über C++ und Java verfasst. Er betreibt mehrere Websites, unter anderem http://steppan.net, http://artouro.org und http://tourbine.com
Assembler, C, C++, C#, COBOL, Fortran, Java, Pascal, Visual Basic – das ist nur ein Teil der Programmiersprachen. Wir zeigen, warum es so viele verschiedene Sprachen gibt und worin sie sich unterscheiden.
Die Entwicklung der Programmiersprachen verlief in den vergangenen Jahrzehnten hochdynamisch. Viele Anwendungen, die auf inzwischen veralteten Sprachen basieren, sind heute noch in Betrieb - ein Problem für Unternehmen.
Die Entwicklung der Programmiersprachen verlief in den vergangenen Jahrzehnten hochdynamisch. Viele Anwendungen, die auf inzwischen veralteten Sprachen basieren, sind heute noch in Betrieb - ein Problem für Unternehmen.
Foto: whiteMocca - shutterstock.com

Die Entwicklung der Programmiersprachen ist eng mit der Maschinensprache eines Computers verbunden. Wie der Name bereits sagt, enthält diese Sprache Befehle, die eine Maschine ausführen kann. Damit sind Mikroprozessoren gemeint, die in einem Computer verbaut sind (CPU, Festplattensteuerung etc.). Diese Prozessoren gehorchen speziellen Maschinenbefehlen. Sie werden zu einem binären Maschinenprogramm zusammengefasst, das der Computer Befehl für Befehl ausführen kann. Solche Programme sind für den Menschen schwer zu lesen und noch weit schwerer zu entwickeln.

Um diese Entwicklung zu erleichtern, hat man Programmiersprachen, Texteditoren und Übersetzungsprogramme erfunden. Die erste derartige Programmiersprache erschien im Jahr 1948 und nennt sich Assembler-Sprache. Der Programmierer schreibt ein Assembler-Programm in einem Texteditor und speichert es als textuelle Datei. Diese Datei kann der Computer noch nicht direkt ausführen. Dazu bedarf es eines Hilfsprogramms namens Assembler. Er übersetzt die komplette Datei, den sogenannten Quellcode, in ein Maschinenprogramm (siehe folgende Abbildung). Erst dieses (binäre) Maschinenprogramm kann der Computer ausführen.

Der Compiler übersetzt den Assembler-Quellcode in ein Maschinenprogramm.
Der Compiler übersetzt den Assembler-Quellcode in ein Maschinenprogramm.
Foto: Bernhard Steppan/Wikipedia

Der Assembler-Quellcode ist leichter zu verstehen als ein Maschinenprogramm. Er besteht aus einer Reihe kleinteiliger Befehle. Erst sehr viele dieser Befehle ergeben eine größere Programmfunktion. Schon ein einfaches Hallo-Welt-Programm ist daher deutlich länger als eines in einer Hochsprache wie Pascal (siehe folgende Abbildung). Ein großes Assembler-Programm zu schreiben, dauert sehr lange. Es ist zudem an einen bestimmten Prozessor gebunden und im Vergleich zu Hochsprachen wie Pascal schlechter lesbar. Diesen Nachteilen steht entgegen, dass Assembler-Programme bei guter Programmierung oftmals schneller ablaufen und meist weniger Haupt- sowie Festplattenspeicher benötigen.

Ein Assembler-Programm besteht aus vielen kleinteiligen Befehlen. Im Vergleich zu einem funktional gleichwertigen Pascal-Programm ist es deutlich länger.
Ein Assembler-Programm besteht aus vielen kleinteiligen Befehlen. Im Vergleich zu einem funktional gleichwertigen Pascal-Programm ist es deutlich länger.
Foto: Bernhard Steppan/Wikipedia

Trotz der unbestrittenen Vorteile der Assembler-Sprache waren deren Nachteile wie schlechte Lesbarkeit und Wartbarkeit, mangelhafte Entwicklerproduktivität und vor allem die Abhängigkeit von einer bestimmten Hardware (Mikroprozessor) so eklatant, dass sich schon ein paar Jahre später Sprachen der zweiten Generation entwickelten. Zu diesen ersten Hochsprachen gehörten Fortran und COBOL. Fortran wurde von der IBM ab 1954 mit dem Ziel entwickelt, eine leistungsstarke, hardwareunabhängige Sprache für naturwissenschaftliche Zwecke zu schaffen. Der Name ist Programm: Fortran ist die Kurzform von Formula Translation und beschreibt den Kerngedanken der Sprache schon sehr gut, die Übersetzung von Formeln.

Während Assembler-Programme mittels eines Assemblers zu einem Maschinenprogramm übersetzt werden, nutzt Fortran hierfür einen sogenannten Compiler. Der geänderte Name drückt schon aus, dass dieses Übersetzungsprogramm den Leistungsumfang eines Assemblers deutlich übersteigt. Ein Compiler übersetzt nicht nur den Quellcode einer Hochsprache in Maschinencode. Er optimiert hierbei das Programm auf maximale Geschwindigkeit und minimalen Speicherbedarf.

Mit anderen Worten: Der Compiler ist dazu ausgelegt, ein hocheffizientes Maschinenprogramm zu erzeugen. Warum war das so wichtig? Anfang der 1950er Jahre verfügten die damaligen Rechner im Vergleich zu den heutigen Computern nur über vergleichsweise leistungsschwache Prozessoren und extrem wenig Speicherplatz. Hätten die Compiler keine hocheffizienten Maschinenprogramme erzeugen können, hätten sich die ersten höheren Programmiersprachen vermutlich nicht so schnell durchgesetzt.

Vom Assembler zu den ersten Hochsprachen

Der Grundgedanke, der zu Fortran führte, hat Ende der 1950er Jahre auch zu der Programmiersprache COBOL inspiriert. Auch hier standen der Gedanke an Hardwareunabhängigkeit und die fachliche Problemstellung im Vordergrund. Im Unterschied zu Fortran sollten damit aber keine naturwissenschaftlichen, sondern betriebswirtschaftliche Programme entwickelt werden, daher auch der Name COBOL.

Die Abkürzung steht für "Common Business Oriented Language". COBOL lehnt sich stark an die natürliche Sprache an und ist im Vergleich zu Fortran auf die Verarbeitung großer Datenmengen ausgelegt. Die Sprache hat sich bald nach ihrer Einführung zu einer der meist genutzten Programmiersprachen entwickelt und ist heute immer noch weit verbreitet.

Stammbaum der wichtigsten Programmiersprachen.
Stammbaum der wichtigsten Programmiersprachen.
Foto: Bernhard Steppan/Wikipedia

Die beiden Sprachen Fortran und COBOL wiesen anfangs eine Reihe von Defiziten auf, die erst nach und nach behoben werden konnten. Sie führten oftmals zu schlecht strukturierten und schwer zu pflegenden Programmen. Da die Anwendungen im Laufe der Jahre immer komplexer wurden, benötigten die Entwickler auch immer länger für die Programmierung, was zum Scheitern von diversen Projekten aufgrund der Überschreitung des Kostenrahmens führte.

Die steigende Zahl der gescheiterten Projekte löste Mitte der 1960er Jahre die erste Softwarekrise aus. Es gab verschiedene Ansätze, diese Krise zu überwinden. Neben verbesserten Entwicklungsprozessen und der Einführung bewährter Programmierbibliotheken entstanden auch weitere Programmiersprachen, die die Entwicklung kostengünstigerer Programme erlauben sollten.

Allen voran muss man hier die Programmiersprachen Pascal und C hervorheben. Pascal wurde von Niklaus Wirth 1971 auf der Grundlage der Programmiersprache Algol 68 entwickelt. Die Sprache wurde anfangs weniger für kommerzielle Anwendungen eingesetzt. Stattdessen verbreitete sie sich stark an Hochschulen, weil sie sich gut zum Erlernen der strukturierten Programmierung eignete.

Ein weiteres Plus von Pascal ist die strenge Typisierung. Das bedeutet, dass Variablen bereits bei der Übersetzung mittels Compiler einem festen Datentyp zuordnet sind, der nachträglich nicht geändert werden kann. Die Merkmale von Pascal führten dazu, dass die Programme sauberer aufgebaut werden konnten und Fehler schon im Ansatz vermieden wurden. Das fördert die Entwicklung leicht wartbarer, robuster Programme.

Etwa zur selben Zeit wie Pascal entwickelte Dennis Ritchie an den Bell Labs die Programmiersprache mit dem minimalistischen Namen C. Sie basiert auf dem Vorläufer, der Programmiersprache B, daher ihr Name. C wurde zur besseren Programmierung des Betriebssystems Unix geschaffen und verbreitete sich entsprechend schnell in der Systemprogrammierung.

Da C eine universelle Programmiersprache ist, hat sich die Sprache aber auch für die Anwendungsentwicklung durchgesetzt. C-Programme sind entsprechend ihrem Einsatzzweck auf Portabilität und Effizienz getrimmt. Sie laufen dank der einfachen Syntax und der ausgereiften Compiler in der Regel sehr schnell ab. Die Kehrseite der Medaille sind einige sicherheitskritische Funktionen, die die Entwicklung leicht wartbarer, robuster Programme nicht gerade erleichtern.