Home Computer Programmiersprachen Site Map counter

Eine kleine Geschichte der wichtigsten Programmiersprachen.

Einleitung

Mein Aufsatz Entwicklung der Programmiersprachen behandelt dieses Thema schon unter dem Aspekt der Weiteentwicklung und der Tendenzen immer mehr mit einer Sprache zu erreichen. Dieser Artikel behandelt die reine geschichtliche Entwicklung. Dies kann natürlich nur einige, aber prominente Vertreter der Programmiersprachen umfassen. Speziell auf C und Pascal geht der Artikel "Warum C nicht meine Lieblingssprache ist" ein

Das erste Programm das man normalerweise schreibt ist eines das nur "Hallo Welt!" Gefolgt von einem Zeilenumbruch am Bildschirm ausgibt. Ich werde dieses Programm jeweils in den Programmiersprachen beilegen, damit man auch etwas von der Syntax mitbekommt.

Die Anfänge: Programmierer als Drahtstöpsler

ENIAC Seit es Computer gibt müssen diese auch programmiert werden. Bei den ersten Computern war dies nur durch Hardwareverbindungen möglich. Dazu wurden die Computer programmiert, in dem zwischen den einzelnen Verbindungen Leitungen geschlossen wurden. Nuer die Daten befanden sich im Speicher. So bei dem allerersten Computern ENIAC und MANIAC. In einem Wochenschau-Bericht 1947 über ENIAC heißt es: "Dieser Computer kann die Flugbahn eines Geschosses die in Zweieinhalb Sekunden durchlaufen wird in Eineinhalb Sekunden berechnen. Die Programmierung dauert Eineinhalb Tage". Es ist leider nicht übermittelt ob dies satirisch oder ernst gemeint war....

Das lag auch daran das erst 1949 sich die vom Mathematiker von Neumann beschriebene Architektur durchsetzte die des auch heute noch gibt: Speicher der Daten und Programme aufnimmt. Damit mussten nicht neue Leitungen gelegt werden sondern ein Programm in einem Speicher (der allerdings auch erst mal begrenzt war) abgelegt werden. Ein solches Programm kann man sich als eine Signalfolge von 0 en und 1 en vorstellen die wiederum bestimmte Verbindungen im Rechenwerk schalteten wodurch dieses das machte was man programmiert hatte. Doch schon 1945/46 entwickelte Zuse eine höhere Programmiersprache die er Plan-Kalkül nannte. Da er nicht nur Europäer sondern auch Deutscher war, konnte er diese Sprache nicht in den USA, wo damals schon mehr Rechner entstanden durchsetzen. Dabei war Plan-Kalkül durchaus modern. So kannte es bedingte Verzweigungen die bei ENIAC aufgrund der direkten Hardwareverdrahtung nicht möglich waren.

Das Hexadezimalsystem und Maschinensprache

Der nächste Schritt war die Programmierung eines Computers diesen Vorgang der Eingabe zu Vereinfachen. Anstatt 0 en und 1 en einzutippen gab man ganze Gruppen, kodiert als Ziffern ein. Zuerst 3 Bits - die man mit den Zahlen 0 bis 7 kodieren konnte (Oktettcode) und später 4 Bits - kodiert durch die Ziffern 0 bis 9 und die Buchstaben A bis F (Hexadezimalsystem). Der Grund war, das jeweils zwei dieser Gruppen ein Byte ergaben: Bis Anfang der siebziger Jahre war ein Byte nur 6 Bit breit - das reichte für die Großbuchstaben, Zahlen und einige Sonderzeichen (Auch ein Grund warum alte Programmiersprachen wie COBOL und FORTRAN nur Befehle in Großbuchstaben verdauen) und später nutzte man 8 Bit für ein Byte.

Hexadezimalzahlen gibt es auch heute noch , je nach Sprachen haben Sie eine besondere Notation, in C z.B. durch Vorstellen von "0x", in Pascal durch ein "$", in machen BASIC Dialekten durch ein "&" und in Assembler durch ein "H" am Ende. Ältere Sprachen wie C kennen auch noch den Oktettcode.

Mit diesem System war es nun möglich die Eingabearbeit erheblich zu vereinfachen. Denn anstatt acht Schaltern mussten nur noch zwei Zahlen eingegeben werden. Trotzdem sehr benutzerfreundlich war dies nicht, wer wusste denn schon was hinter den einzelnen Werten stand?

Assembler

Die allererste Programmiersprache (entstanden um 1952) im heutigen Sinn war daher Assembler: ein Assembler ist nichts anderes als ein Programm welches für die Befehle, die ein Computer versteht - und deren Befehlsworte jeweils einen bestimmten Code haben - Worte vorsieht, die sich ein Mensch merkten kann. Assembler ist daher für jeden Prozessor spezifisch. Dies ist heute vielleicht nicht mehr so von Bedeutung, da es nur noch wenige Prozessoren gibt, die weit verbreitet sind, doch in der Frühzeit des PC's gab es sehr viele Rechner mit unterschiedlichen Prozessoren. Jeder hatte eine eigene Programmiersprache. Manchmal waren diese sogar unterschiedlich, obwohl die Prozessoren zueinander kompatibel waren.

Ein Beispiel: Die folgenden Bytes (alles in Hexadezimal)

21 00 10 11 00 20 19 22 00 30

sagen wohl niemanden etwas. Sie stehen für die folgenden Befehle des Prozessors Z80:

21 00 10  LD  HL,1000H
11 00 20  LD  DE,2000H

19        ADD HL,DE
22 00 30  LD (3000H),HL
25        END

Das ist schon besser verständlich, in Normalsprache heißt es folgendes:

- Lade den Wert 1000H in das Prozessorregister "HL"
- Lade den Wert 2000H in das Prozessorregister "DE"
- Addiere die beiden Register HL und DE, das Ergebnis ist danach in HL
- Speichere das Ergebnis in der Speicherstelle 3000H im Speicher ab.

Das ganze ist also eine einfach Ganzzahladdition. Sie hätten wahrscheinlich geschrieben "Ergebnis = &1000+&2000". So benötigt schon eine Addition 4 Rechenschritte, zum Trost ist aber schon ein Z80 Prozessor (obgleich schon veraltet) so schnell, das er bei 4 MHz 250.000 dieser Rechenschritte pro Sekunde ausführen kann. (H und & stehen für die Notation der hexadezimalen Zahlen in Assembler und BASIC). Weiterhin bietet der Assembler an für Speicherzellen Namen zu vergeben und Adressen für Sprünge zu berechnen, so das er auch hier eine Erleichterung brachte.

Assembler hielt sich relativ lange. Denn mit Assembler konnte man das Maximum aus dem Rechner herausholen. In Zeiten, wo Speicherkapazität und Rechenleistung noch begrenzt waren war dies ein wichtiges Kriterium. Allerdings ist auch bei Assembler ein grundlegendes Problem noch nicht gelöst: das testen der Programme. Zum Testen musste man mit einem speziellen Programm das zu untersuchende Programm laden und an der Stelle wo man den Fehler vermutete Haltepunkte setzen oder schrittweise den Programmablauf verfolgen. Besonders komfortabel war dies nicht. Zudem konnten selbst dann noch Befehle den ganzen Rechner zum Absturz bringen. Ein Nachteil war weiterhin, das es nicht den Assembler gab - und auch heute noch gibt. Er ist spezifisch für jeden Prozessor. So hat ein Pentium einen anderen Befehlssatz als ein Power PC Prozessor oder ein Alpha Chip. Ja es gibt sogar kleine - aber in bestimmten Gebieten wichtige - Unterschiede in einer Familie z.B. zwischen den Prozessoren Pentium 4, Pentium III und Athlon was die Fließkommabefehle angeht.

Hallo Welt in Z80 Assembler:

        org     100H
bdos    equ     00005h

start:  ld      de,hallowelt
        ld      c,9
        call    bdos
        rst     0

hallowelt: defs  "Hallo Welt!",13,10,"$"
           end   start

FORTRAN

CDC 6600Die erste höhere Programmiersprache war FORTRAN. FORTRAN entstand von 1953-1954 unter der Leitung von John Backus. Bei FORTRAN handelt es sich um die Abkürzung für "FORmula TRANslator". Und damit ist die Sprache recht gut charakterisiert. Damals wurden die meisten Computer für wissenschaftliche Zwecke benutzt. Es ging dabei um mathematische Rechnungen und die konnte man in FORTRAN gut eingeben. Weil sie aber die erste Programmiersprache war hatte sie auch ein paar Schwächen. Man hatte keine Ahnung wie eine "Grammatik" einer Programmiersprache aussehen soll und so ist die von FORTRAN sehr widersprüchlich und nicht leicht verständlich. Besonders verhängnisvoll war das Variablen ein Leerzeichen enthalten können. Das öffnete Missverständnissen Tür und Tor. Der erste FORTRAN Compiler brauchte dann auch 20 Mahnjahre zur Programmierung.

Das Alter von FORTRAN erkannt man auch an den Einschränkungen - Nur Großbuchstaben waren zulässig, Variablennamen nur max. 6 Zeichen lang und eine Zeile hatte eine feste Struktur:

Programmtext dürfte z.B. nur in den Spalten 7-72 einer Zeile vorhanden sein, Sprung Labels nur in den Stellen 1-5. Das lag daran das man Programme damals auf Lochkarten stanzte: Oben eine 80 spaltige Zeile mit Schreibmaschinentext (damit man es lesen konnte) unten Löcher die von einem Lochkartenleser ausgewertet wurden. Für jede Programmzeile brauchte man eine Lochkarte - größere Programme erforderten einen Helfer der beim Tragen der Karten ins Rechenzentrum half...

FORTRAN hatte zuerst keine Möglichkeit ein Programm zu strukturieren. Stattdessen sprang man wild im Quelltext zu Zeilennummern mit dem berüchtigten GOTO Befehl. Weiterhin konnte man in FORTRAN zwar toll die Explosion einer Wasserstoffbombe berechnen, aber nicht mit Texten arbeiten. Aufgrund dessen, das sie aber die erste Programmiersprache war setzte sie sich breit durch. Dann schlug das Schicksal zu. Man begann einen Standard zu erarbeiten, der es ermöglichen sollte das man Programme für Computer A auch auf Computer B laufen lassen konnte, d.h. alle sollten dasselbe FORTRAN verstehen. Wann immer man so etwas macht kann man sich einem Sicher sein: es dauert ewig. Weil sich die Vertreter von verschiedenen Herstellern nicht einigen können. So entwickelte sich FORTRAN sehr langsam weiter. Erst 1966 gab es den ersten Standard FORTRAN IV oder FORTRAN 66. Die einfachsten Elemente strukturierter Programmierung wurden erst 1977 im nächsten Standard aufgenommen. Und 1990 sorgte der bislang letzte FORTRAN Standard für so fortschrittliche Dinge wie Abkehr vom starren Lochkarten-Konzept, Groß- und Kleinschreibung, Prozeduren, Namen anstatt Zeilennummern und CASE Abfragen. Bedenkt man das Pascal dies schon 1970 hatte zeigt dies auch wie eifrig Ausschüsse arbeiten....

Der grundsätzliche Nachteil von FORTRAN war das man in dieser Sprache sehr unübersichtliche Programme, so genannten Spagetti-Code erstellte. Oder wie ein Programmierer sagte "C verleitet dazu schlecht strukturierte Programme zu schreiben, aber FORTRAN verstärkt diese Angewohnheit noch". Wohl auch deswegen dachte sich Backus, er müsste der Welt noch etwas gutes tun und erarbeitete die noch heute gültige Backus-Naur Form in der man die Grammatik von höheren Sprachen beschreiben kann. Beginnend mit ALGOL verwendeten alle Sprachen diese Grammatik und dies erleichterte auch den Entwirf eines Übersetzungsprogrammes (Compiler). Nald gab es Tools für das Parsen von Quelltext und das erkennen von Bezeichnern / Zahlen etc.

PROGRAM

PRINT *, "Hello World"
END PROGRAM

COBOL

IBM System 360-91COBOL war die erste Sprache die sich ein Komitee ausdachte. Sie hatte einige Vorläufer. So arbeitete Grace Hopper an der Sprache FLOW-MATIC, deren Prinzipien auch in COBOL einflossen. Ihre Entwicklung wurde sehr bald von IBM aufgegriffen und ab 1959 von einem gemeinsamen Komitee weitergeleitet. 1960 erschien der erste Entwurf. COBOL steht für COmmon Business Orientated Language. Das Ziel von COBOL war es wohl eine sehr leicht lesbare Sprache zu schaffen - zumindest wenn man das mit dem starren System von definierten Bedeutungen von Lochkartenspalten und GROSSBUCHSTABEN konnte. COBOL hat nur eine Aufgabe: Die Verarbeitung von Daten, Texten, Buchungen. COBOL setzte sich daher sehr schnell durch im Bankenbereich oder bei der Verwaltung. Mit COBOL kann man z.B. sehr einfach Zahlen formatieren, ausgeben, sortieren.

Aber COBOL ist extrem textlastig. Bevor überhaupt mal eine Zeile ausführbarer Code kommt ist schon eine halbe Seite an Definitionen zu schreiben. Mathematische Operationen haben Namen (MOVE ZERO TO XYZ; MULTIPLY XYZ BY 5....). (Schauen Sie auf das Beispiel!) Dazu kommen unzählige Parameter bei Befehlen. Vielleicht wollte man eine Programmiersprache haben die man leicht lesen konnte oder die sogar Kaufleute verstehen konnten, auf jeden Fall hatte man es damit übertrieben.

Genauso wenig wie bei FORTRAN gab es bei COBOL Ansätze für die Strukturierte Programmierung, ja das GOTO brauchte man sogar noch häufiger, denn es gab keine echten Unterprogramme mit Rücksprüngen.

Auch COBOL wurde standardisiert: Dem Standard von 1960 folgten der von 1968. COBOL 74 und 85 erweiterten die Sprache, allerdings wie bei FORTRAN bleibt COBOL im Vergleich zu anderen Sprachen auf ein Gebiet beschränkt. Noch heute ist es aber im Bankenbereich anzutreffen und der Jahrtausendbug beruht auf der COBOL Angewohnheit Zahlen als BCD Ziffern und nicht binär zu speichern - so sparte man sich die Jahrhundertziffern...

00001  IDENTIFICAL DIVISION.
00002  PROGRAM-ID HELLO.
00004  ENVIROMENT DIVISION.
00005  CONFIGURATION SECTION.
00006  SOURCE-COMPUTER IBM-PC.
00008  OBJECT-COMPUTER IBM-PC.
00010  INPUT-OUTPUT SECTION.
00011  FILE-CONTROL.
00012  SELECT AUSGABE ASSIGN TO SI.
00013  DATA DIVISION.
00014  FILE-SECTION.
00015  FD AUSGABE
00016  LABEL RECORD OMITTED.
00017  01 DATA RECORD ZEILE PICTURE X(80).
00018  WORKING STORAGE SECTION.
00019  PROCEDURE DIVISION
00020  BEGIN.
00021  OPEN OUTPUT AUSGABE.
00022  MOVE "HELLO WORLD!" TO ZEILE.
00023  CLOSE AUSGABE

ALGOL

Sowohl FORTRAN als auch COBOL waren Sprachen die zu unübersichtlichen Programmen verleiteten. Daher ging man von 1958-1962 in Europa dazu über eine neue Sprache zu schaffen. Ziel war es die Grundsätze der Strukturierten Programmierung umzusetzen. Was ist damit gemeint? Nun ein Programm sollte so aussehen wie man es umgangssprachlich denken würde. Wenn man eine Datei einliest würde man vielleicht so formulieren "Lese Daten ein solange bis Du an das Ende kommst". In COBOL oder FORTRAN wurde daraus eine IF Abfrage mit dem Sprung zu einer Zeilennummer - Einer Zahl die nichts aussagt. In Algol gab es zum ersten mal die drei grundlegenden Schleifen die man braucht um ohne wilde Sprunge ein Programm zu schrieben: Die FOR Schleife (abzählend), WHILE Schleife (Bedingung für Abbruch vor dem Start bekannt) und REPEAT Schleife (Bedienung am Ende der Schleife bekannt). Algol hatte Vorteile wie FORTRAN auf dem Bereich mathematischer Operationen, war jedoch auf dem Gebiet der Zeichenverarbeitung schwach.

Algol ist ein Kunstname und bedeutet "Algorithmic Language". Damit sollte zum Ausdruck gebracht werden, das man anders als bei FORTRAN und COBOL in dieser Sprache Algorithmen leicht umsetzen kann ohne das berühmte GOTO. Algol selbst war nicht sehr erfolgreich. Es gab nach dem ersten Standard 1960 noch einen zweiten, Algol 68. Doch danach starb die Sprache leise aus. Man kann darüber spekulieren warum. Es gab mit Sicherheit zwei Gründe. Zum einen war Algol wie FORTRAN stark auf numerischem Gebiet, aber schwach bei der Zeichenverarbeitung, zum zweiten kam Algol aus Europa. Es wurde von den großen Computerherstellern in Amerika einfach nicht ernst genommen. Dabei hat Algol sehr viel eingeführt was heute Elemente einer prozeduralen Programmiersprache sind.

Sie war die erste Programmiersprache die in der Backus-Naur Form als Grammatik definiert wurde. Man machte sich nicht nur Gedanken wie eine Sprache menschlich lesbar ist sondern auch wie ein Compiler sie effizient umsetzen konnte. Trotzdem war sie einfacher verständlich als FORTRAN oder COBOL. Sie kehrte von dem Lochkartenformat ab und verwandte zum ersten mal auch Kleinbuchstaben und einige Sonderzeichen, wodurch der Quelltext lesbarer wurde.

BEGIN
  FILE F (KIND=REMOTE);
  BCDIC ARRAY E [0:11];
  REPLACE E BY 'HELLO WORLD!';
  WHILE TRUE DO
  BEGIN
    WRITE (F, *, E);
  END;
END.

Pascal

Einer der bei der Schöpfung von Algol beteiligten war Niklaus Wirth. Er wollte eine Programmiersprache schaffen, die anders als die bisherigen Studenten zum richtigen Programmieren erziehen sollte. Das bedeutete das diese Sprache eine sehr logische, aber auch starre Struktur hatte. Man musste konsequent Daten von Codeteilen trennen, Blöcke waren durch Begin und end gekennzeichnet. Pascal Programme sind dadurch sehr gut lesbar und effizient durch Compiler überprüfbar, die wiederum auf Programmfehler hinweisen können. Die erste Version von Pascal erschien 1970 auf dem Supercomputer CDC 6600.

Vieles übernahm Wirth von Algol, ergänzte aber einiges auch. So hat Pascal vollwertige String-Routinen. Er führte zwei Konzepte ein, die sich als sehr wichtig herausstellten:

Strukturierung der Daten: Bislang gab es nur Datentypen die der Computer selbst darstellte wie Zeichen, Ganzzahlen oder Fließkommazahlen. In Pascal konnte man zusammengesetzte Daten (aus verschiedenen einfachen Datentypen), Teilbereiche (Buchstaben nur von A bis Z) oder Mengen (Herz, Karo ,Pik, Kreuz) definieren und sich damit mehr der abstrakten Um weil nähern.

Das zweite war das Konzept der Stapelmaschine, nach der später sogar die PDP-11 gebaut wurde und die heute Teil jedes Mikrocomputers war. Das Problem eines Stapelspeichers löste das Problem das bisher alle Programmiersprachen hatten, wenn sie Unterprogramme aufriefen und diese wenn möglich ihrer eigenen Variablen haben sollten. Diese wurden nun lokal auf einem Stack angelegt und nach Prozedurende dort wieder freigegeben.

Daneben erfand Wirth als erster - vor allem um Pascal schneller verbreiten zu können - das Konzept der virtuellen Maschine. Dabei übersetzt der Compiler Pascal in einen einfacheren Bytecode, der dann wiederum maschinenspezifisch interpretiert wird. Der Vorteil ist, das dieser Bytecode auf allen Systemen der gleiche ist und man so Pascal sehr schnell an ein neues System anpassen konnte. Er wollte damit dem Schicksal entgehen das Algol als europäische Sprache hatte. Pascal war auch erfolgreich, jedoch machte Wirth einen Fehler: Als er neue Konzepte entwickelte, die Daten noch abstrakter machten und es erlaubten ein Programm zu modularisieren schuf er eine neue Sprache: Modula-2 und einige Jahre später als Objektorientierten Ansatz Oberon. Er hätte gut getan Pascal zu verbessern, denn keines seiner beiden folgenden Kindern war auch nur im Ansatz so erfolgreich wie Pascal. Pascal hätte das Zeug gehabt das zu sein, was heute C ist, denn es ist leichter zu erlenen, genauso leistungsfähig (es gab für die Supercomputer von CDC und Cray zuerst Pascal Compiler, erst später folgte C). Aber: Nikolaus Wirth dachte an eine akademische Lehrsprache und nicht an den praktischen Einsatz. Es fehlen in Pascal zwei wesentliche Dinge:

Stattdessen erweiterten Hersteller Pascal weiter. Im PC Bereich ist aus dem guten alten Pascal "Delphi" geworden, mit den besten Elementen aus Modula, C++ und Smalltalk. Delphi ist zwar kommerziell nicht so erfolgreich, auch weil es heute der einzige Pascal Dialekt ist der noch intensiv gepflegt ist, aber es war die erste Srpache in der man schnell grafische Anwendungen entwickeln konnte (Rapid Application Development). Sowohl Java wie auch später C# machten Anleihen von Delphi.

Program HelloWorld;

begin
  Writeln('Hello World!');
end.

BASIC

CPC 464 HeimcomputerSchon vor Niklaus Wirth verfolgten J. Kemeny und T. Kurtz den Ansatz eine Programmiersprache zu erfinden die man leicht lernen konnte. Damit sollten Programmierer an leistungsfähigere Sprachen herangeführt werden, bei BASIC muss man von der Syntax her sofort an FORTRAN denken. BASIC steht für Beginners All Symbolic Instruction Code. Der ursprüngliche Sprachkern war sehr einfach und umfasste keine Elemente zur Strukturierten Programmierung, keine echten Prozeduren, keine differenzierten Datentypen... Kurzum alles was es schon bei Algol gab. Dafür war BASIC sehr einfach zu erlernen und sehr kompakt. Es war aber unmöglich in dieser Sprache größere Programme zu schreiben. BASIC war ursprünglich interpretiert. Dadurch ist es für Benutzer umgänglicher, da sie einfach Befehle eintippen und ausprobieren können.

BASIC fristete lange Zeit ein Nischendasein. Für die Lehre wurde Pascal eingesetzt, denn damit lernten die Studenten die Elemente der strukturieren Programmierung und konnten nicht nur wie bei BASIC zu FORTRAN wechseln. Erst 10 Jahre nach seiner Erfindung setzte sich BASIC durch - durch die aufkommenden Heimcomputer. Privatpersonen sollten eine einfache Sprache lernen, anders als Studenten. Vor allem aber waren deren Ressourcen begrenzt: Heimcomputer hatten in den achtziger Jahren 16-64 KByte Speicher. Einen einfachen BASIC Interpreter bekam man in einem 8 KByte großen ROM unter, einen komfortablen in 16-32 KByte, das waren Systemanforderungen die von keiner anderen Programmiersprache erreicht werden konnten.

Mit dem Aussterben der Heimcomputer 15 Jahre später versank auch BASIC in der Versenkung. Einzig allein Microsoft entwickelte die Sprache weiter, hat allerdings auch jetzt vor, die Entwicklung zugunsten von C# einschlafen lassen.

10 PRINT "Hello World"
20 END

Smalltalk

1Xerox Star programmiert mit smalltalk969 schuf die durch ihre Fotokopierer reich gewordene Firma Xerox den Xerox PARC bei Palo Alto. In diesem Forschungsinstitut durften junge Wissenschaftler ohne die Verpflichtung, dass etwas vernünftiges herauskommen sollte, ihren Ideen nachgehen. Und es sollten dort Dinge erfunden werden welche die Computertechnik revolutionieren würden. Das wohl bekannteste was der Xerox Parc hervorbrachte war die grafische Benutzeroberfläche, die Apple für den MAC lizenzierte und Microsoft kopierte. Dort entstand von 1969-1970 aber auch Smalltalk. Smalltalk ist eine Programmiersprache, die völlig objektorientiert ist.

Gab es bisher schon den Ansatz in Pascal, Daten abstrakter zu behandeln so ist die Objektorientierung die logische Fortentwicklung: Objekte sind Daten mit Methoden (Code) um sie zu bearbeiten, konvertieren oder auszugeben. D.h. Code ist ohne die Daten nicht mehr vorstellbar. Beides ist zu einer Einheit verschmolzen. Es gab dies schon vorher bei der Sprache Simula, doch bei Smalltalk setzte man dies radikal um. Alles ist ein Objekt. Es gibt keine einfachen Datentypen, ja der Typ einer Variable kann geändert werden, Kontrollstrukturen sind Objekte, alles agiert mit Hilfe von Botschaften. Der Name entstand dadurch, dass Programme in Smalltalk sehr wenig Code benötigen, man also "nicht viel reden" muss.

Wie Pascal setzte man auf das Konzept der virtuellen Maschine, um Code schnell auszutauschen. Eine virtuelle Maschine ist eine Zwischeninterpreter der den Smalltalk Code in Maschinencode umsetzt. Will man Smalltalk auf einem neuen Computer implementieren, so muss man nur die virtuelle Maschine anpassen, nicht mehr die ganze Sprache. Nach einem ersten Entwurf 1972 gab es den ersten Standard 1980, mit Smalltalk 80, der 1983 den letzten Feinschliff erhielt.

Die Syntax von Smalltalk lehnte sich an Sätze in natürlichen Sprachen an. Leider orientierte man sich nicht an schon existierenden Programmiersprachen, was der Verbreitung der Sprache nicht gerade förderte. Trotzdem war Smalltalk erfolgreich und galt als DIE objektorientierte Programmiersprache, bis Java aufkam, bei der Entwickler den Vorteil hatten nicht eine neue Syntax lernen zu müssen, sondern viel von C übernehmen zu können.

Die Sprache hätte sich sicher auch besser durchgesetzt, wenn die Benutzer nicht ein sehr benutzerfreundliches System sich ausgedacht hätten. Smalltalk erforderte eine grafische Oberfläche mit Fenstern für die Klassendefinitionen, den Debugger und das Transscript Fenster in dem man Smalltalk Programme startete oder einfach Ausdrücke auswertete. In Zeiten in denen Programmierung bedeutete: Editieren -> Programm speichern -> Compiler Starten -> Linker starten -> Programmausführen, jeweils mit unterschiedlichen Programmen von der Kommandozeile aus war dies enorm progressiv. Doch als Rechner mit solchen Oberflächen sich durchsetzten, die dazu nötige Hardware entsprechend preiswert war, stand Java schon vor der Tür. Smalltalk war seiner Zeit einfach 10-15 Jahre voraus. Es gibt die Geschichte, dass Steven Jobs, als er den Xerox PARC besuchte und die in Smalltalk entwickelte Oberfläche sah, fragte "Kann man auch Pixelweise anstatt zeilenweise scrollen?". Der Entwickler änderte den Smalltalk-Code und das System konnte ohne runter zu fahren dann Pixelweise scrollen. Mir ist keine andere Programmiersprache bekannt in der dies möglich wäre (Bei Java kann man während ein Programm läuft dieses ändern, aber nicht das Java Kernsystem).

Transscript show: 'Hello World!'; cr.

C

Compaq Deskpro 285-25Die Erfinder von C - Kerningham und Ritchie gehören innerhalb der Computerwelt wohl sicher zu den meistgehassten Persönlichkeiten. Beide entwickelten während der sechziger Jahre aus der Sprache BCPL über den Zwischenschritt "B" diese Sprache "C". Gedacht war diese ursprünglich um die Entwicklung von UNIX portabel zu gestalten und einen Ersatz für Assembler zu haben.

Dadurch hat C Features die sehr hardwarenah sind. Es gibt keine Datentypen die nicht auf der Maschine selbst implementiert sind, schon damals entwickelte Standards wie Call-by-Reference Schnittstellen wurden weggelassen, stattdessen ein Präprozessor eingeführt, der ohne Typprüfung Texte ersetzte und die gesamte Syntax war ein erheblicher Rückschritt gegenüber allen bisherigen Versuchen, Text leserlich zu gestalten. Viele Programmierer weigern sich aufgrund der Mängel C daher als höhere Programmiersprache zu betrachten und sehen es mehr als eine Art "Super-Assembler" an. Betrachtet man C unter diesem Aspekt: Ersatz von Assembler in der Systemprogrammierung, so macht sein Einsatz Sinn. Zumal verschiedene maschinennahe Operatoren es erlaubten selbst bei "dummen" Compilern schnellen Code zu erzeugen.

Das wäre nicht so schlimm gewesen, wäre C nur benutzt worden um darin Betriebssysteme zu entwickeln, anstatt in Assembler. Doch da UNIX in diesem System entstand und sich UNIX sehr schnell durchsetzte so setzte sich auch C durch. Je größer Systeme werden, desto stärker treten die Mängel von C zu tage: Mangelnde Syntax und Typprüfungen, kein modulares Design. Der Vorteil der kryptischen Schreibweise, die dazu diente Compilern das Denken abzunehmen, verlor an Bedeutung wenn Compiler selbstständig Ausdrücke optimieren. Doch dann hatte sich C schon sehr weit verbreitet. Weiterhin spricht die Sprache Programmierer an, die Pascal für langatmig halten und eine Vorliebe für sehr kurze, aber prägnante Ausdrücke haben. Diese Architektur findet man auch in UNIX mit Systemprogrammen mit sehr vielen Kommandozeilenparametern und Skriptsprachen wie Perl, die eine noch mehr auf Operatoren aufbauende Syntax haben.

Nach der ersten Version von 1971 gab es einen Standard 1978, der nach seinen Erfindern K&R benannte C Standard. Ein ANSI Gremium versuchte 1989 die schlimmsten Mängel von C zu beseitigen und seitdem gab es einige Verbesserungen wie "Better C " oder den neuen ANSI Standard von 1999. Weil Programme aber portabel bleiben müssen, sind wesentliche Mängel von C geblieben. Die Windows Update Funktion verdankt einen Großteil ihrer Arbeit C, denn eine grundlegende Sicherheitslücke ist, dass die C Standardroutinen für die Stringbehandlung keine Prüfung haben ob ein String den man zuweisen will überhaupt in den Platz passt, denn man reserviert hat. Ist dies nicht der Fall, überschreibt er Code und so kann man in Betriebssysteme Schadcode einschleusen und zur Ausführung bringen. Heute versuchen Compiler von Microsoft und der GCC mit einigen Tricks diese Nachteile von C zu kaschieren - das man diese gefährlichen Spracheeigenschaften aber abschafft, daran dachte niemand. Genauso wenig, wie das eine Zuweisung in einer IF Abfrage sehr gefährlich sein kann. Auch diese ist nur in C erlaubt und führt dazu dass das Programm nicht das tut was man meint, was es tun sollte (meist ein Leichtsinnsfehler, wenn man "=" für Zuweisung und "==" für Vergleich verwechselt).

C hätte sich sicher nicht durchgesetzt wäre nicht UNIX als Betriebssystem lange Zeit kostenlos verteilt worden und daher an den Universitäten die schon immer nicht viel Geld für Software hatten als Betriebssystem eingesetzt worden. Damit begann die Benachteiligung anderer Programmiersprachen: Systemaufrufen waren auf die Datentypen und Funktionsweise von C ausgerichtet und andere Programmiersprachen mussten diese erst nachbilden - das kostete Zeit und bedeute einen Nachteil. Bei Windows setzte sich dieser Trend fort, auch hier sind alle Systemaufrufe auf C ausgerichtet. So konnte sich C wie ein Krebsgeschwür in der Informatik ausbreiten. Die Syntax wurde "weitervererbt" an C++, Java, C#, PHP, JavaScript ....

#include <stdio.h>

int main()

{
    printf("Hello World!\n");
    return 0;
}

C++

Etwa 1982/3 machte sich Bjarne Stroustrup daran auf Grundlage von C eine objektorientierte Erweiterung "C mit Klassen" zu entwickeln. Diese wurde 1987 offiziell zu C++. Er hatte aus dem Fehler von Niklaus Wirth gelernt und implementierte C++ so, das C als Untermenge enthalten war. D.h. ein C Programmierer musste nichts neues lernen und konnte mit seinem C++ Compiler alte C Programme übersetzen. Damit blieb aber auch das grundsätzliche Problem von C - die unlesbare Syntax und die mangelhafte Typprüfung. Für C++ stellte er einige Reihe von Ergänzungen zur Verfügung die es erlaubten die meisten Probleme zu umschiffen.

Soweit so gut, leider ist C++ inzwischen eine Sprache geworden die Featuritis leidet: Die gesamte Syntax ist so komplex, es gibt so viele Möglichkeiten mit Sprachmitteln ein und dasselbe zu erreichen, das selbst Bjarne Stroustrup zugibt, das man nach Möglichkeit nur mit einem Subset arbeiten sollte, den man beherrscht anstatt Jahre zu verschwenden um den ganzen Sprachumfang sich anzueignen. Diese teilt C++ auch mit anderen Programmiersprachen wie ADA, doch anders als diese ist eben C++ abwärtskompatibel zu C. Das führt dazu dass es Entwicklungssysteme für grafische Oberflächen in C++ gibt in denen der Code vor Makros und Pointer strotzt wie bei Visual Studio und andere die einen objektorientierten Ansatz haben, der mehr Java ähnelt wie beim CBuilder.

Das grundsätzliche Problem von Konstrukten die fehleranfällig sind blieb jedoch. C++ hat sich wie C in weiten Bereichen der Anwendungsentwicklung durchgesetzt. C++ hat eine Chance gehabt und vertan: Nämlich eine Trennung durchzuführen: Anstatt C als Untermenge von C++ zu implementieren hätte man sich auch C++ als Alternative etablieren können - und dann eben die Fehler von C aus der Sprache heraus schmeißen können. Der Erfolg den Java hatte zeigt dass es genügend Leute gab, die auf eine solche Sprache gewartet haben.

#include <iostream.h>

class Hello {
    public:
    Hello ()
    {
        cout << "Hello world!" << endl;
    }

};


int main()

{
    Hello();
    return 0;

}

Java / C#

1991 gingen einige Programmierer bei Sun daran eine Sprache zu kreieren - angeblich um implementationsabhängigen Details bei der Programmierung von Mikrocontroller auszuweichen. Heraus kam Java, benannt nach der Lieblingskaffeesorte der Entwickler. Java ist wie C++ eine Sprache die auf der grundsätzlichen Syntax von C aufbaut - damit gewinnt man gleich einen großen Kreis von Programmierern, die nichts neues lernen wollen. Anders als bei C++ ist dies Sprache jedoch rein objektorientiert, die Prozeduren Elemente von C entfielen vollständig. Java basiert wie Smalltalk oder Wirths erster Pascal Implementierung auf einer virtuellen Maschine, dadurch entfallen auch alle Implementierungsdetails die auf Eigenschaften der Hardware aufbauen wie der in C so gefährliche Zeiger.

Java wäre sicher nur eine von vielen Programmiersprachen geblieben wenn es nicht zwei wesentliche Vorteile hätte, die mit dem aufkommenden Internet an Bedeutung gewannen:

1995 erschien die erste Version von Java, die bald einen Hype erlebte. Nach Übernahme des Komponentenmodells von Objekt Pascal folgte im Jahre 2000 die Version Java 2. Der Boom hat sich inzwischen von Desktop Applikationen auf Server Anwendungen verlagert, weil Java als interpretierte Programmiersprache langsamer als C oder Pascal ist. Besonders bei grafischen Oberflächen merkt man dies deutlich, weil hier Java nicht direkt auf das Betriebssystem aufsetzt. Für Applikationen, die nur auf einem System laufen übersetzt man daher Java in Maschinencode.

public class HelloWorld

{
    public static void main(String[] args)
    {
        System.out.println("Hello World!");
    }
}

Als Microsoft einen eigenen Java Compiler für Windows vorstellten, "erweiterten" sie diesen so, dass der erzeugte Code nur unter Windows lief. Sun, Schöpfer von Java lizensierte zwar die Sprache bereitwillig, achtete aber darauf, dass die Sprache portabel blieb und verklagte Microsoft - und bekam recht. Darauf hin stelle Microsoft die Entwicklung von Java ein und begann mit der Entwicklung einer eigenen Sprache: C#. C# ist mehr als eine Sprache, es ist ein eigenes System. Neben verschiedenen Detailverbesserungen wo man einiges nachrüstete was man in Java besser machen könnte indem z.B. bei Delphi Anleihen gemacht wurden achtete man vor allem darauf, dass C# für Entwickler und Anwender attraktiv ist. In C# kann man Windows Anwendungen schreiben die schnell sind und wie Windows Anwendungen aussehen, obwohl die Sprache wie Java interpretiert ist. C# steht auf eine eigene Umgebung .NET auf welche auch andere Sprachen unterstützt wie Delphi .NET, Visual Basic oder Visual C++. In der Praxis ist C# mit Windows verheiratet. Das einzige ernst zu nehmende Projekt Mono, dass es versucht auf Linux umzusetzen hängt Jahre hinter der Windows Version hinterher.

Technisch unterscheidet C# und Java heute wenig. C# hat dazu geführt, dass Java in den Versionen 5 und 6 erheblich nachgerüstet hat was Bedienungsfreundlichkeit angeht. Vielmehr sind es zwei sehr ähnliche Sprachen von Konkurrenten im Computermarkt. Die Ähnlichkeit zu Java zeigt schon das Hello World Programm:

class HelloWorld
{
  static void Main()
  {
    System.Console.WriteLine("Hello World!");
  }
}

Java hat in den letzten Jahren an Boden verloren. Interaktive Webseiten setzen heute Multimediainhalte ein, die man besser mit Flash programmieren kann oder nutzen Javascript, das im Browser ausgeführt wird.  Daneben scheint Java nach neueren Untersuchungen (2012) immer mehr zur Hauptquelle für Schadsoftware zu weden, sodass Computerzeitschriften dazu raten, es komplett abzuschalten.

Epilog

Als ich 1986 mit Pascal mich für die zweite höhere Programmiersprache interessierte, habe ich mich auch über andere Programmiersprachen informiert. Damals gab es ca. 100 Programmiersprachen. Inzwischen gehen Schätzungen (Ich glaube niemand weiß die genaue Zahl ) von 1000 aus. Es ist klar das dieser Artikel nur einige Sprachen beleuchten kann. Neben historischen Bedeutungen und der Wichtigkeit spielt natürlich auch die Sprachkenntnis des Autors eine Rolle. So wären LISP, PROLOG, PL/1 und ADA sicher auch einen Eintrag wert, doch der Autor hat zu wenig Kenntnis von diesen Sprachen um mit Sachkunde über sie zu referieren.

In vielen Gebieten muss sich auch noch Zeigen welche Sprache sich durchsetzt, so wird heute zur Web Programmierung ein ganzes Sammelsurium an Sprachen und Technologien eingesetzt: Von universellen Sprachen (Java, Python, Ruby) über Scriptsprachen (Pearl, PHP, JavaScript) zu Microsoft spezifischen Technologien (ADO, DCOM, ActiveX, VB Script, C#). Es ist zu erwarten das innerhalb der nächsten Jahre viele Sprachen in diesem Bereich verschwinden werden. Genauso wie heute niemand mehr über Sprachen wie PL/1, LOGO, FORTH und COMAL redet, die aktuell waren als der Autor von 15-19 Jahren seine ersten Erfahrungen in BASIC, Assembler und Pascal machte.

Artikel zuletzt geändert am 19.9.2012

Zum Thema Computer ist auch von mir ein Buch erschienen. "Computergeschichte(n)" beinhaltet, das was der Titel aussagt: einzelne Episoden aus der Frühzeit des PC. Es sind Episoden aus den Lebensäufen von Ed Roberts, Bill Gates, Steve Jobs, Stephen Wozniak, Gary Kildall, Adam Osborne, Jack Tramiel und Chuck Peddle und wie sie den PC schufen.

Das Buch wird abgerundet durch eine kurze Erklärung der Computertechnik vor dem PC, sowie einer Zusammenfassung was danach geschah, als die Claims abgesteckt waren. Ich habe versucht ein Buch zu schreiben, dass sie dahingehend von anderen Büchern abhebt, dass es nicht nur Geschichte erzählt sondern auch erklärt warum bestimmte Produkte erfolgreich waren, also auf die Technik eingeht.

Die 2014 erschienene zweite Auflage wurde aktualisiert und leicht erweitert. Die umfangreichste Änderung ist ein 60 Seiten starkes Kapitel über Seymour Cray und die von ihm entworfenen Supercomputer. Bedingt durch Preissenkungen bei Neuauflagen ist es mit 19,90 Euro trotz gestiegenem Umfang um 5 Euro billiger als die erste Auflage. Es ist auch als e-Book für 10,99 Euro erschienen.

Mehr über das Buch auf dieser eigenen Seite.


© des Textes: Bernd Leitenberger. Jede Veröffentlichung dieses Textes im Ganzen oder in Auszügen darf nur mit Zustimmung des Urhebers erfolgen.
Sitemap Kontakt Neues Hier werben Bücher vom Autor Buchempfehlungen Top 99