Informatik - Skript zum Unterricht
(II) Software
2. Programmiersprachen
2.1 Definition
Um einen Computer zu programmieren, muss ein gemeinsamer Code gefunden werden, auf dessen Basis man mit der Maschine kommuniziert. Je mehr man sich der Sprache des Rechners nähert, um so schwieriger und umständlicher wird im Allgemeinen die Kommunikation.
Eine Programmiersprache ist eine formale Sprache, die es ermöglicht, einen Algorithmus (d.h. eine Folge von Anweisungen zur Lösung eines Problems) in eine für den Computer verständlichen Form zu formulieren.
Seit der Geburtsstunde der Computer haben sich die Programmiersprachen stark entwickelt, von vollständig maschinenabhängigen Sprachen bis zu maschinenunabhängigen Sprachen wie z.B. Java.
2.2 Generationen der Programmiersprachen
Zur Programmierung werden 5 verschiedene Generationen von Programmiersprachen unterschieden:
- 1. Programme in Maschinensprache bestehen aus Maschinenbefehlen, die als Folge von Nullen und Einsen (Low, Hight) im Computer dargestellt werden. Die umständliche Eingabe Tausender von einzelnen Bits wird häufig abgekürzt durch die Eingabe der äquivalenten Hexadezimalzahlen z.B. 63 B1 0C statt 0110 0011 1011 0001 0000 1100 usw. Bei Fehleingaben wird die Fehlersuche allerdings sehr zeitaufwändig und schwierig. Maschinensprachen gelten immer nur für Mikroprozessoren des gleichen Typs und arbeiten außergewöhnlich schnell.
- 2. Programmiersprachen, bei denen die Bitkombinationen der Maschinenbefehle durch ein leicht zu merkendes Symbolwort (Mnemonics) ausgedrückt werden, nennt man Assembler. Dann steht im Quellkode beispielsweise statt der Hexadezimalzahl 7D die Anweisung MOV A L oder LD A , L was bedeutet, dass das Byte aus dem L - Register ins A - Register bewegt wird (move = engl.: bewegen bzw. load = engl. laden). Auch solche Assemblersprachen gelten immer nur für einen einzigen Mikroprozessortyp.
- 3. Höhere oder Problemorientierte Programmiersprachen erlauben es, die Anweisungen für den Computer so zu beschreiben, dass man keine Maschinenbefehle mehr verwenden muss. Man ist dadurch unabhängig vom Mikroprozessortyp und die Programme können auf jedem Rechner ablaufen. Als die bekanntesten Beispiele mögen hier die Programmiersprachen BASIC, PASCAL oder FORTRAN ausreichen, welche für die verschiedenen Computertypen zur Verfügung stehen.
- 4. Sprachen der 4. Generation nennt man Deskriptive Programmiersprachen. Hier gibt der Anwender nur noch den Verarbeitungsbefehl ein, ohne dass er den Lösungsweg in Form eines Algorithmus beschreiben muss. Diese Sprachen sind immer auf ein bestimmtes Anwendungsgebiet zugeschnitten; z.B. SQL für relationale Datenbanken oder ADF, CSP, DMS (IBM), Natural, Oracle usw.
- 5. Im Bereich der Künstlichen Intelligenz findet man Programmiersprachen zur Erstellung von Expertensystemen. Hierunter fallen Objektorientierte Programmiersprachen wie z.B. C++, C#, Visual Basic, Oberon oder Delphi. Auch funktionale Sprachen wie LISP und logische Sprachen wie Prolog zählt man zur 5. Generation. Hier programmiert man keine Befehle die nacheinander ablaufen, sondern man gibt an was passieren soll, wenn bestimmte Ereignisse (Events) im Programmablauf eintreten. Die Objekte, die auf die Events reagieren, können Dialogelemente sein, Eingabefelder, Befehlsschaltflächen, Kontrollkästen, Bildlaufleisten usw. Über geeignete Methoden werden deren Attribute kontrolliert verändert oder z.B. gesperrt.
Maschinen- bzw. Assemblersprachen haben folgende Eigenschaften:
- Einzelschritt entspricht einem Grundbefehl, der direkt durch die CPU ausgeführt werden kann
- Kenntnisse der internen CPU-Organisation erforderlich
- relativ schwierige und fehleranfällige Programmierung
Höhere Programmiersprachen haben folgende Eigenschaften:
- komplexere Einzelschritte
- (in der Regel) kürzeres Programm
- zuverlässiger, besser lesbar
- aufgaben- bzw. problemorientiert, z.B. für technisch-wissenschaftliche oder kaufmännische Aufgaben
Eine weiter Klassifizierung ergibt sich durch unterschiedliche Paradigmen in den Programmiersprachen:
Imperatives Paradigma (Prozedurales Paradigma):
Ein Programm besteht aus einer Folge von Anweisungen zur Manipulation von Daten, welche das gewünschte Ergebnis liefern (die meisten traditionellen Programmiersprachen).
Deklaratives Paradigma:
Der Programmierer muss beschreiben "Was ist zu lösen?" und nicht "Wie ist das Problem zu lösen?". Das System selber implementiert einen allgemeinen Problemlöser, der die vom Benutzer formulierten Aufgaben löst.
Funktionales Paradigma:
Funktionen mit Input und Output bilden die primitiven Programmierkonstrukte; ein Programm besteht demnach aus einer Menge von verschachtelten Funktionen.
Objektorientiertes Paradigma:
Im Unterschied zum imperativen Paradigma, sind in objekt-orientierten Programmiersprachen Daten aktive Objekte mit Methoden zur Manipulation der Daten. Ein Programm besteht aus einer Menge von Objekten, welche gegenseitig Nachrichten austauschen (Methoden aufrufen).
2.3 Grundversionen der Programmiersprachen
Es werden drei Grundversionen unterscheiden:
Assembler | Es hat sich für das Übersetzungsprogramm von Mnemonics (Assemblersprache) zurück in Maschinensprache (leider) ebenfalls das Fachwort Assembler eingebürgert. |
Interpreter | Dies sind Übersetzer, die nach dem Start eines
Quellprogramms jeweils eine einzige Anweisung bzw. Deklaration in
Maschinenbefehle übersetzen, die Syntax prüfen und sofort
ausführen. Erst dann wird die nächste Anweisung bearbeitet (Beispiel: QBasic). Vorteil: Man kann ein Programm bis zu Fehlerstelle im Quelltext testen. Nachteil: Da immer nur eine Zeile übersetzt wird, liegt das Programm nie komplett übersetzt vor. Man muss bei jedem Start den Quelltext neu übersetzen, was sehr lange dauert. Der Interpreter muss dazu ständig im Speicher verbleiben. |
Compiler | Ein Compiler (zu Deutsch: Übersetzer) ist ein Programm, das
in einer Sprache A (Quellsprache) dargestellte Quelltexte in äquivalente
Programme in einer anderen Sprache B (Zielsprache) übersetzt. Die
Quellsprache ist im Allgemeinen eine höhere Programmiersprache. Die
Zielsprache ist in den meisten Fällen eine Maschinensprache, deren Befehle
direkt vom Computer ausgeführt werden können. Die Zielmaschine eines Compilers muss nicht unbedingt die Maschinensprache eines Computers sein, sondern kann auch eine abstrakte/virtuelle Maschine sein. Das kompilierte Programm wird dann von einem so genannten Interpreter für diese abstrakte Maschine interpretiert. Compiler übersetzen ein fehlerfreies Quelltextprogramm komplett auf einmal in die Zielsprache und können das Ergebnis auf Datenträger oder in den RAM als selbstständig lauffähiges Maschinenspracheprogramm ablegen (Beispiel: Turbo-Pascal). Vorteil: Sie brauchen das Programm nur ein einziges mal zu übersetzen; anschließend läuft es als ausführbare Datei (EXE, exequte) - in Maschinensprache - sehr schnell ab. Nachteil: Ein Maschinenspracheprogramm ist nicht mehr ohne weiteres zu verändern. Außerdem ? und das ist das Problem ? übersetzt ein Compiler Ihr Programm nur dann, wenn es fertig durchdacht ist und - von Logikfehlern abgesehen - fehlerfrei vorliegt. Testen von Programmteilen ist für Ungeübte fast nicht möglich. |
2.4 Historische Entwicklung der Programmiersprachen
Jahr | Sprache |
1954 | FORTRAN(1921 entwickelt) |
1958 | ALGOL |
1959 | COBOL, ALGOL 60 |
1960 | BASIC |
1962 | APL, LISP |
1964 | SNOBOL, PL/1 |
1967 | SIMULA |
1968 | ALGOL 68 Pascal, PL/M (PL/1 für Mikrocomputer) |
1972 | C, PROLOG |
1976 | Smalltalk, SQL |
1977 | MODULA |
1978 | ADA |
1979 | VAL, ELAN |
1982 | C++ |
1983 | Turbo Pascal |
1986 | Oberon |
1990 | JAVA |
1991 | Visual Basic, Python |
1992 | Perl |
1995 | Delphi |
2000 | C#, .net |