Zum Inhalt springen

Programmiersprache

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 21. April 2006 um 13:21 Uhr durch Jpp (Diskussion | Beiträge) (Revert: 4GL (deutsche Version) ist schon aus der Überschrift verlinkt). Sie kann sich erheblich von der aktuellen Version unterscheiden.
Der Quelltext wird in einem speziellen, zum Programmieren gedachten Editor bearbeitet.

Eine Programmiersprache ist eine formale Sprache zur Erstellung von Verarbeitungsanweisungen für Rechnersysteme. Programmiersprachen drücken Berechnungen sowohl in einer für einen Computer, als auch in einer für den Menschen lesbaren und verständlichen Form aus. Sie sind notwendig, da die natürlichen Sprachen für eine genügend detaillierte und präzise Beschreibung von Computerberechnungen zu vieldeutig sind.

Die durch eine Programmiersprache ausgedrückte, von einem Menschen lesbare Beschreibung heißt Quelltext (oder auch Quellcode/Programmcode) (Beispiel "Hallo Welt!"). Den Arbeitsprozess diese Computerprogramme zu erstellen, nennt man Programmieren. Er wird durch Programmierer vorgenommen. Der entstandene Quelltext muss schließlich in eine Anweisungsfolge für den Computer, die Maschinensprache übersetzt werden. Dies ist vergleichbar mit dem Übersetzen von natürlichen Sprachen, jedoch ist dieser Arbeitsschritt durch die Verwendung von Programmiersprachen mittels eines Übersetzungsprogramms automatisierbar. Das Endprodukt dieser Übersetzung nennt man Computerprogramm. Je nachdem, ob diese Übersetzung vor oder während der Ausführung des Computerprogramms erfolgt, unterscheidet man zwischen kompilierenden oder interpretierenden Übersetzungsprogrammen.

Es existieren verschiedene Meinungen, welche Eigenschaften eine Programmiersprache besitzen sollte. Allgemein wird jedoch akzeptiert, dass zumindest die grundlegende mathematische Arithmetik ausgedrückt werden können sollte. Oft erscheint der von der Programmiersprache vorgegebene Programmierstil und die Zweckgebundenheit der Programmiersprache wichtig. Eine theoretische Erkenntnis ist die notwendige Eigenschaft der Turing-Vollständigkeit, falls sie die volle Funktionalität des Computers ausnutzen soll; dies kann bis hin zum sich selbst verändernden Programm dienen.

Form und Funktion

Programmiersprachen dienen der Informationsverarbeitung und richten sich deshalb in Form und Funktion als Sprache an die Struktur und Bedeutung von Information. Die genauere linguistische Betrachtung dieser Aspekte ist Aufgabe der Semiotik.

Die äußere Form, in der sich eine Programmiersprache dem Programmierer repräsentiert, bezeichnet man als Syntax. Die meisten Programmiersprachen sind textbasiert. Der Quelltext besteht aus Wörtern und Trennzeichen, ganz ähnlich zu geschriebenen natürlichen Sprachen. Es sind jedoch auch andere Repräsentationen von Programmiersprachen denkbar. So werden häufig zur Gestaltung von graphischen Benutzerschnittstellen visuelle Symbole verwendet. Ähnlich zu einem Notenblatt in der Musik ergibt sich aus den einzelnen Symbolen mit ihren individuellen Bedeutungen ein Dokument, das eine Gesamtheit beschreibt.

Die Bedeutung eines speziellen Symbols in einer Programmiersprache nennt man dessen Semantik. Syntax und Semantik kann man der Spezifikation, teilweise auch der Dokumentation der Programmiersprache entnehmen. Die syntaktische Definition einer Sprache wird meist in der formalen Notation Backus-Naur-Form angegeben. Eine vollständig formal semantische Spezifikation einer Programmiersprache in einem einzigen Kalkül ist gegenwärtig Forschungsgegenstand.

Die Intention des Programmierers über die Gesamtheit des Computerprogramms nennt man Pragmatik. Mit dem Analogon des Notenblatts beschrieben, beabsichtigte der Komponist beispielsweise eine Hymne oder einen Popsong zu schaffen. Die Softwaretechnik hilft dabei dem Programmierer diesen Zweck eines Computerprogramms zu realisieren.

Imperative Programmiersprachen

Die derzeit am häufigsten verwendeten, imperativen Programmiersprachen halten eine spezielle Unterscheidung in Form und Funktion für Befehle (oft auch Anweisungen genannt) und Daten und deren Wiederverwendung bereit. Dieser Programmieransatz ist nicht unbedingt notwendig, da ein Computer diese Strukturen prinzipiell nicht unterscheiden kann, hat sich jedoch historisch durchgesetzt.

Befehle

Ein Computer ist keine starre, nur auf eine Aufgabe spezialisierte Rechenmaschine. Vielmehr wird durch Einzelaktion in Mikroebene angegeben, wie der Computer mit welchen Daten zu verfahren hat. Imperative Programmiersprachen bilden dieses Konzept auf Makroebene durch Befehle ab. Durch die Reihenfolge der Befehle ist die zeitliche Abfolge vorgegeben. Um reagierende Programme schreiben zu können, gibt es Sprungbefehle, die die Abfolge der Befehle dynamisch verändern.

Befehle lassen sich semantisch nach dem EVA-Prinzip einteilen.

  • Eingabe- oder Ausgabebefehle lesen Daten von der Tastatur, von einer Datei oder aus anderen Quellen ein oder sie geben sie auf den Monitor, auf einen Drucker oder in eine Datei aus.
  • Berechnungen verändern Daten oder sie kombinieren Daten neu. Dies können auch mathematische Berechnungen, wie Addition oder Multiplikation sein.
  • Kontrollstrukturen entscheiden aufgrund der vorliegenden Daten, welche Befehle als nächstes ausgeführt werden. Insbesondere kann eine Befehlsfolge wiederholt werden.

Daten

Als Daten werden im Allgemeinen alle im Rechner kodierten Zeichen bezeichnet, die keine Befehle darstellen und eine Bedeutung besitzen. Auch der Aufbau der Daten folgt syntaktischen Regeln. Mit so genannten Variablen kann man bequem auf die Daten zugreifen. Um die Zeichenketten der Daten mit ihrer (semantischen) Bedeutung nutzen zu können, muss man diese Bedeutung durch die Angabe eines Datentyps angeben. Zumeist besteht im Rahmen des Typsystems auch die Möglichkeit neue Typen zu vereinbaren.

Deklarative Programmiersprachen

Einen zu den imperativen Programmiersprachen konträren Ansatz verfolgen die deklarativen Programmiersprachen. Dabei beschreibt der Programmierer, welche Bedingungen ein Programm erfüllen muss. Wie etwas zu geschehen hat, ist Aufgabe des Übersetzungsprogramms. Oder anders gesagt: Der Programmierer gibt an, welches Ergebnis gewünscht ist. Die Problemlösung wird dem Computer überlassen.

Programmtexte sind dabei nicht die einzige Möglichkeit, einem Computer mitzuteilen, welche Aufgabe er erfüllen soll. Aus der Sicht der theoretischen Informatik ist ein Programm lediglich ein Schlüssel, mit dessen Hilfe die universelle Maschine, die ein Allzweckcomputer ist, auf eine spezielle Maschinenfunktion eingestellt wird. Da die Menge der berechenbaren Funktionen abzählbar unendlich ist, kann jede abzählbar unendliche Menge als Programmiersprache dienen.

Im Extremfall reicht bereits die Angabe einer einzigen natürlichen Zahl , um die gewünschte Maschinenfunktion zu spezifizieren. (Daher ist dieses ein Programm und die einfachste Programmiersprache der Welt). Das ist keine große Einschränkung, d.h. es sind auch andere Arten von Programmen vorstellbar, deren Form nicht die einer abzählbaren Kette von Zeichen ist. Es könnten auch graphische Objekte sein. Schon gar nicht muss ein Programm eine explizite Liste von Anweisungsschritten enthalten (Imperative Programmierung), die Idee führt u.a. zur deklarativen Programmierung.

Die Art der formulierten Bedingungen unterteilen die deklarativen Programmiersprachen in logische Programmiersprachen, die mathematische Logik benutzen und funktionale Programmiersprachen, die dafür mathematische Funktionen einsetzen. Deklarative Programmiersprachen haben keine große Popularität und sind oftmals im akademischen Bereich zu finden.

Geschichte

Grace Hopper entwickelte den ersten Compiler und gilt als "Grandma COBOL"

Hauptartikel: Geschichte der Programmiersprachen

In den 1950er Jahren wurden in den USA die ersten drei weiter verbreiteten, praktisch eingesetzten höheren Programmiersprachen entwickelt. Dabei verfolgten diese sowohl imperative als auch deklarativ-funktionale Ansätze.

Die Entwicklung von Algol 60 läutete eine fruchtbare Phase vieler neuer Konzepte, wie das der prozeduralen Programmierung ein. Der Bedarf an neuen Programmiersprachen wurde durch den schnellen Fortschritt der Computertechnik gesteigert. In dieser Phase entstanden die bis heute populärsten Programmiersprachen: BASIC und C.

In der Nachfolgezeit ab 1980 konnten sich die neu entwickelten logischen Programmiersprachen nicht gegen die Weiterentwicklung traditioneller Konzepte in Form des objektorientierten Programmierens durchsetzen. Das in den 1990er Jahren immer schneller wachsende Internet forderte seinen Tribut beispielsweise in Form von neuen Skriptsprachen für die Entwicklung von Webserver-Anwendungen.

Derzeit schreitet die Integration der Konzepte der letzten Jahrzehnte voran. Größere Beachtung findet so beispielsweise der Aspekt der Codesicherheit in Form von virtuellen Maschinen.

Klassifizierungen

Programmiersprachen lassen sich in verschiedener Hinsicht klassifizieren. Häufig ist die Unterteilung nach Programmierparadigmen, nach Sprachgenerationen oder Anwendungsgebieten.

Anwendungsgebiete

Programmierparadigmen

Vorlage:Paradigmen in Programmiersprachen Ein Programmierparadigma ist das einer Programmiersprache zugrundeliegende Prinzip. Grundlegend sind die Paradigmen der imperativen und der deklarativen Programmierung. Alle weiteren Paradigmen sind Verfeinerungen dieser Prinzipien. Eine Programmiersprache kann mehreren Paradigmen gehorchen.

Hauptartikel: Programmierparadigma

Sprachgenerationen

Programmiersprachen werden in verschiedene Generationen eingeteilt, um damit zum einen die geschichtliche Entwicklung nachzuzeichnen. Andererseits ist dies ein Ansatz, die Sprachgenerationen als semantische Level zu verstehen. Damit wird der Abstraktionsgrad von der zugrunde liegenden Technik mit jeder Generation erhöht. Die 1. Generation erfordert damit genaueste Kenntnis über die Funktionsweise der zu programmierenden Maschine, während in den höheren Generationen die Beschreibung des Problems wichtiger wird. Wie es letztlich zu lösen ist, soll in den Verantwortungsbereich des Rechners überführt werden.

1. Generation: Maschinensprache sind die direkt auf einem Prozessor ausführbaren binäre Zahlencodes, die die Befehle darstellen. Die Eingabe erfolgt direkt in binärer 0-1-Form. Die direkte Programmierung in einer Maschinensprache wird heute kaum noch verwendet.

Beispiel: Es soll die Addition „3 + 4“ durchgeführt werden. Der Prozessor hat für die Operation „addiere“ den festgelegten Code 00011010. 0011 und 0100 ist die Codierung der Operanden 3 und 4 im Dualsystem. Damit weist die folgende Folge in Maschinensprache den Rechner an, die Addition auszuführen: 00011010 0011 0100.

2. Generation: Assembler ersetzen die Zahlencodes der Maschinensprache durch symbolische Bezeichner (Mnemonics). Eine Assembleranweisung wird in genau einen Maschinenbefehl umgesetzt. Der Anteil der Assemblerprogrammierung ist sehr gering.

Beispiel: Es soll die Addition „3 + 4“ durchgeführt werden. Der für den Prozessor geeignete Assembler hat den Bezeichner ADD für die Operation „addiere“ festgelegt. R0 und R1 sind die Speicherzellen in der die Operanden 3 und 4 stehen. Damit weist der folgende Befehl im Assembler den Rechner an, die Addition auszuführen: ADD R0 R1.

3. Generation: Höhere Programmiersprachen (High Level Languages) führen Konzepte, wie Variablen ein, um leichter verständlichen Quelltext schreiben zu können. Sprachen der 3. Generation sind weitgehend maschinenunabhängig. Die meisten praktisch eingesetzten Programmiersprachen sind höhere Programmiersprachen.

Beispiel: Es soll die Addition „3 + 4“ durchgeführt werden. In der höheren Programmiersprache C wird direkt die mathematische Arithmetik für die Operation „addiere“ unterstützt. Es ist dafür eine Variable Summe vom Datentyp int nötig. Damit weist der folgende Programmcode in C den Rechner an, die Addition auszuführen: int Summe; Summe = 3 + 4;.

Objektorientierte Sprachen sind ebenfalls Sprachen der 3. Generation. Um jedoch ihre konzeptionelle Sonderrolle zu betonen, werden sie in der Literatur oft als „OO-Generation“ bezeichnet.

4. Generation: Viertgenerationssprachen bieten einfache Sprachmittel zur Auslösung komplexer Operationen. Zumeist sind sie dabei an eine bestimmte Anwendung, wie Informationsgewinnung und Listenerzeugung gebunden.

Beispiel: Es sollen aus einer Datensammlung alle Kundendaten herausgefunden werden. Falls die Daten in einer geeigneten Datenbankanwendung erfasst sind, kann mit der Sprache SQL die Aktion folgendermaßen erreicht werden: SELECT kunden FROM datenbank. Dasselbe Ergebnis ist mit einer Hochsprache nur durch eine Beschreibung von Einzelaktionen (Öffnen von Dateien etc.) zu erzielen.

Mit Natural wurde ab 1979 von der Firma Software AG die erste Programmiersprache der 4. Generation zur Erstellung vollumfänglicher kommerzieller Anwendungessysteme angeboten, für die der Begriff 4. Generation geprägt wurde und die auch heute noch weit verbreitet ist. NATURAL ist als Programmiersprache Teil einer umfassenden interaktiven Entwicklungsumgebung. Wesentliches Merkmal der Sprachen der 4. Generation ist die Abstraktionsebene, in der das Problem formuliert wird. Verlangen Höhere Programmiersprachen noch das Programmieren von prozeduralen technischen Einzelschritten, wird in Sprachen der 4. Generation die Anforderung eher problemnah formuliert und vom System in beliebigen Umgebungen unter Nutzung der technischen Möglichkeiten zur Ausführung gebracht. Weitere Merkmale sind: integrierte Gestaltung der Nutzeroberfläche, Listenerzeugung, Datenbankzugriff.


5. Generation: (Very High Level Language, VHLL) Sprachen der 5. Generation gestatten das Beschreiben von Sachverhalten und Problemen. Sie kommen vor allem im Bereich der KI (künstliche Intelligenz) zum Einsatz. Die Wahl des Problemlösungsweges kann (entsprechend dem Sprachkonzept) dem jeweiligen System (weitgehend) überlassen werden. Bekanntestes Beispiel für eine Sprache der 5. Generation ist PROLOG.

Siehe auch

Literatur

  • Kenneth C. Louden: Programmiersprachen: Grundlagen, Konzepte, Entwurf. Internat. Thomson Publ., Bonn, Albany [u.a.] 1994, ISBN 3-929821-03-6
Wiktionary: Programmiersprache – Bedeutungserklärungen, Wortherkunft, Synonyme, Übersetzungen
Wikibooks: Programmieren – Lern- und Lehrmaterialien