>Info zum Stichwort Programmiersprache | >diskutieren | >Permalink 
wuming schrieb am 20.3. 2010 um 00:39:43 Uhr über

Programmiersprache


Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf mit, ihn zu verbessern, und entferne anschließend diese Markierung.

Quelltext eines Programms in der objektorientierten Programmiersprache Ruby.Eine Programmiersprache ist eine Notation für Computerprogramme. Sie stellt ein Programm während seiner Entwicklung dar und übermittelt es zur Ausführung an das Rechensystem. Da nur die Maschinensprache vom Rechner unmittelbar ausführbar ist, müssen Programme, die in anderen Programmiersprachen geschrieben sind, in eine äquivalente Folge von Maschinenbefehlen übersetzt werden.

Programmiersprachen sollen die Programmierung nicht nur ermöglichen, sondern auch erleichtern. So hat sich die Entwicklung der Programmiersprachen im Spannungsfeld von Übersetzbarkeit und Bequemlichkeit (Lesbarkeit, Knappheit, Sicherheit etc.) vollzogen. Dieses Spannungsfeld besteht auch zwischen Universalität und Anwendungsorientierung. Je näher eine Programmiersprache an der Anwendung ist, desto bequemer und leichter ist sie dort anzuwenden, desto ungeeigneter ist sie in anderen Anwendungen.

Inhaltsverzeichnis [Verbergen]
1 Übersicht
1.1 Panorama
2 Typsystem
3 Implementation von Programmiersprachen
3.1 Frontend
3.2 Compiler und Entwurfsphilosophie
3.3 Befehle
4 Geschichte
4.1 Sprachgenerationen
5 Programmierparadigmen
5.1 Imperative Programmiersprachen und deklarative Programmiersprachen
5.2 Objektorientierte Programmiersprachen
6 Trivia
6.1 Hello World
7 Siehe auch
8 Literatur
9 Weblinks
10 Einzelnachweise


Übersicht [Bearbeiten]
Die durch eine Programmiersprache ausgedrückte Beschreibung heißt Quelltext (oder auch Quell- oder Programmcode). Der Quelltext wird in die Maschinensprache des Computers, auf dem das Programm ausgeführt werden soll, übersetzt. Im Gegensatz zur Assemblersprache oder zu Hochsprachen ist die Maschinensprache ein für Menschen schwer lesbarer Binärcode. Statt in Maschinensprache zu programmieren werden meist Hilfsprogramme – sogenannte Assembler – verwendet, um in einer lesbareren (Assembler-)Sprache zu programmieren. Wird von Maschinensprache gesprochen, wird heute meist die Assemblersprache gemeint.

Die Übersetzung in Maschinensprache kann entweder vor der Ausführung durch einen Compiler oderzur Laufzeit – durch einen Interpreter oder JIT-Compiler geschehen. Oft wird eine Kombination aus beiden Varianten gewählt, bei der zuerst der Quelltext der eigentlichen Programmiersprache in einen Zwischencode übersetzt wird, welcher dann zur Laufzeit von einer Laufzeitumgebung durch einen Interpreter oder JIT-Compiler in den eigentlichen Maschinencode überführt wird. Dieses Prinzip hat den Vorteil, dass derselbe Zwischencode auf verschiedenen Plattformen ausführbar ist. Beispiele für einen solchen Zwischencode sind der Java-Bytecode sowie die Common Intermediate Language.

Ein anderes Hilfsprogramm, der Linker, erlaubt es zudem, ein Programm um bereits übersetzte Unterprogramme zu ergänzen.

Fast immer ist es die Ein-/Ausgabe-Programmierung, die so als erstes dem gewöhnlichen Programmierer abgenommen wird, danach kommen mathematische Unterprogramme, deren Definition einigermaßen klar ist.

Von dort zu einer einfachen höheren oder problemorientierten Sprache zu gelangen, ist kein großer Schritt mehr; Fortran beispielsweise bietet zunächst nur die Möglichkeit, einfach geformte arithmetische Ausdrücke in Folgen von Maschinenbefehlen zu übersetzen. So gab es schon bald eine große Zahl an Spezialsprachen für die verschiedensten Anwendungsgebiete. Damit steigt die Effizienz der Programmierer und die Portabilität der Programme; dafür nimmt man eine anfänglich erheblich geringere Leistungsfähigkeit der erzeugten Programme in Kauf. Manche Sprachen sind so erfolgreich, dass sie wachsen und breitere Anwendung finden; immer wieder sind auch Sprachen mit dem Anspruch entworfen worden, Mehrzweck- und Breitbandsprachen zu sein, oft mit bescheidenem Erfolg (PL/1, Ada, Algol 68).

Panorama [Bearbeiten]
Die Bedeutung von Programmiersprachen für die Informatik drückt sich in der Vielfalt der Ausprägungen und der Breite der Anwendungen aus.

Maschinensprache, Assemblersprachen oder C erlauben eine hardwarenahe Programmierung.
CNC-Programmiersprachen dienen der Erzeugung von Steuerungsinformationen für Werkzeugmaschinen.
Datenbanksprachen sind für den Einsatz in und die Abfrage von Datenbanken gedacht.
Skriptsprachen dienen zur einfachen Steuerung von Rechnern, wie bei der Stapelverarbeitung.
Sprachen mit visuellen Programmierumgebungen erleichtern die graphische Gestaltung von Benutzeroberflächen.
Esoterische Programmiersprachen sind experimentelle Sprachen mit teilweise interessanten Konzepten.
Typsystem [Bearbeiten]
siehe Hauptartikel: Typsystem

Variablen sind mit einem Namen versehene Orte im Speicher, die einen Wert aufnehmen können. Um die Art des abgelegten Wertes festzulegen, muss in vielen Programmiersprachen der Variablen ein Datentyp zugewiesen werden. Häufige Datentypen sind Ganz- und Gleitkommazahlen oder auch Zeichenketten.

Es wird zwischen typisierten und typenlosen Sprachen unterschieden. In typisierten Sprachen (zum Beispiel C++ oder Java) wird der Inhalt der Variable durch einen Datentyp festgelegt. So gibt es für Ganz- und Gleitkommazahlen verschiedene Datentypen, die sich durch ihren Wertebereich unterscheiden. Sie können vorzeichenlos oder vorzeichenbehaftet sein. Nach aufsteigendem Wertebereich sind dies zum Beispiel: Short, Integer oder Long. Datentypen für Gleitkommazahlen sind zum Beispiel Float oder Double. Einzelne Zeichen können im Datentyp Char gespeichert werden. Für Zeichenketten steht der Datentyp String zur Verfügung.

Die typisierten Sprachen können anhand des Zeitpunkts der Typüberprüfung unterschieden werden. Findet die Typüberprüfung bereits bei der Übersetzung des Programms statt, spricht man von statischer Typisierung. Findet die Typprüfung zur Laufzeit statt, spricht man von dynamischer Typisierung. Erkennt eine Programmiersprache Typfehler spätestens zur Laufzeit, wird sie als typsicher bezeichnet.

Bei statischer Typprüfung ist der Programmierer versucht, diese zu umgehen, oder sie wird nicht vollständig durchgesetzt (zum jetzigen Stand der Technik muss es in jeder statischen Sprache eine Möglichkeit geben, typlose Daten zu erzeugen oder zwischen Typen zu wechselnetwa wenn Daten vom Massenspeicher gelesen werden). In Sprachen mit dynamischer Typprüfung werden manche Typfehler erst gefunden, wenn es zu spät ist. Soll der Datentyp einer Variablen geändert werden, ist eine expliziter Befehl zur Umwandlung nötig.

Die typenlosen Sprachen (zum Beispiel JavaScript oder Prolog) verfügen, im Gegensatz zu den typisierten Sprachen, über keine differenzierten Datentypen. Der Datentyp einer Variablen wird erst zur Laufzeit festgelegt. Wird einer Variablen ein Wert eines anderen Typs zugewiesen, findet eine Umwandlung der Variablen in den neuen Typ statt. Die typenlosen Sprachen behandeln oftmals alle Einheiten als Zeichenketten und kennen für zusammengesetzte Daten eine allgemeine Liste.

Durch die Festlegung des Datentyps werden vor allem zwei Zwecke verfolgt:

Deskriptive Typangaben erleichtern die Programmierung und entlasten die Notation. Beim Zugriff auf ein Feld mit einem Index kann die Speicherstelle, an der sich der abgefragte Wert befindet, abhängig vom verwendeten Datentyp berechnet werden.
Präskriptive Typangaben schließen bestimmte Operationen aus. Es kann zum Beispiel das Einhalten von Feldgrenzen geprüft werden, um einen Zugriff über die Feldgrenzen hinaus zu verhindern.
Nach Strachey sollte das Typsystem im Mittelpunkt der Definition einer Programmiersprache stehen.

Die Definition von Daten erfolgt im Allgemeinen durch die Angabe einer konkreten Spezifikation zur Datenhaltung und der dazu nötigen Operationen. Diese konkrete Spezifikation legt das allgemeine Verhalten der Operationen fest und abstrahiert damit von der konkreten Implementation der Datenstruktur (s. a. Deklaration).

Implementation von Programmiersprachen [Bearbeiten]
siehe Hauptartikel: Übersetzerbau

Der Übersetzungsvorgang kann als eine Folge von Transformationen (Phasen) dargestellt werden, die ein Quellprogramm stufenweise in ein Objektprogramm umwandeln. Das Quellprogramm ist dabei eine Zeichenfolge, die einer (kontextfreien) Grammatik genügt (der Syntax einer Programmiersprache).

Frontend [Bearbeiten]
Als Frontend bezeichnet man die analytischen Phasen, die hauptsächlich von der Programmiersprache bestimmt sind.

Die Symbolerkennung (Scanner) liest die Eingabe und erkennt dabei für die Programmiersprache relevante Zeichenfolgen, z. B. „3.1415“ (Zahl), „if“ (Schlüsselwort), „MainWindow“ (Bezeichner), „+“ (Operator), „{“ (Sonderzeichen). Die Bezeichner und Literale werden dabei in einer Symboltabelle abgelegt bzw. nachgesehen.
Die Phrasenerkennung (Parser) berechnet aus den vom Scanner gefundenen Symbolen den passenden Ableitungsbaum.
Der Ableitungsbaum wird zum Abstract Syntax Tree (AST) bereinigt. Dieser stellt aber zunächst nur ein äußeres Gerüst des Programmes dar.
Die semantische Analyse ergänzt den AST durch Informationen aus der Symboltabelle und aus dem Kontext (den übergeordneten Knoten). Zugleich werden die zahlreichen „Kontextbedingungen“ überprüft, die ein korrektes Programm erfüllen muss. So ergänzt wird der AST zur Interndarstellung des Programmes (Programmbaum).
Compiler und Entwurfsphilosophie [Bearbeiten]
In Bezug auf die Art und den Zeitpunkt der Übersetzung können drei Gruppen von Sprachen unterschieden werden:

Wird ein Programmtext als Ganzes übersetzt, spricht man in Bezug auf den Übersetzungsmechanismus von einem Compiler. Der Compiler selbst ist ein Programm, welches als Dateneingabe den Programmtext bekommt und als Datenausgabe den Maschinencode liefert, der vom Prozessor ausgeführt wird (z. B. Objectcode, EXE-Datei).
Wenn der Programmtext während der Ausführung übersetzt wird, spricht man von einer interpretierten Sprache. Das Programm wird in einer Laufzeitumgebung (z. B. JVM oder .NET CLR) ausgeführt.
Als Zwischenstufe existiert die Just-in-time-Kompilierung, wobei der Programmtext direkt vor jedem Programmlauf neu übersetzt wird.
Es existieren verschiedene Meinungen, welche Eigenschaften eine Programmiersprache besitzen sollte. Allgemein wird jedoch akzeptiert, dass die grundlegende mathematische Arithmetik ausgedrückt werden soll und dass Schleifen und Verzweigungen, manchmal auch in Form von Sprüngen, notwendig sind, da sonst nicht alles Berechenbare berechnet werden kann.

Oft ist der von der Programmiersprache vorgegebene Programmierstil und die Zweckgebundenheit der Programmiersprache wichtig. Einige wenige Sprachen bieten gestalterische Freiheiten bis hin zum sich selbst verändernden Programm: dazu gehört Maschinensprache und auch LISP. Eine theoretische Erkenntnis ist die notwendige Eigenschaft der Turing-Vollständigkeit.

Befehle [Bearbeiten]
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. Durch die Reihenfolge der Befehle ist die zeitliche Abfolge vorgegeben. Das Steuerwerk enthält eine Menge von Mikroprogrammen, die jeweils aus einer Liste von Steuersignalen bestehen, die das Verhalten von Prozessorelementen – zum Beispiel der ALU und den Registernregeln. Bei manchen Prozessoren können die Mikroprogramme auch nachträglich geändert werden. Man könnte die Mikroprogramme als Firmware der CPU bezeichnen. Imperative Programmiersprachen bilden dieses Konzept auf Makroebene durch Befehle ab.

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 oder kombinieren Daten neu.
Kontrollstrukturen
entscheiden aufgrund der vorliegenden Daten, welche Befehle als nächstes ausgeführt werden.
Deklarationen
reservieren Speicherplatz für Variablen oder Datenstrukturen unter einem frei wählbaren Namen. Über diesen Namen können sie später angesprochen werden.
Geschichte [Bearbeiten]

Grace Hopper entwickelte den ersten Compiler und gilt als „Grandma COBOLsiehe Hauptartikel: Geschichte der Programmiersprachen

Zur Vorgeschichte der Programmiersprachen kann man von praktischer Seite die zahlreichen Notationen zählen, die sowohl in der Fernmeldetechnik (Morsekode) als auch zur Steuerung von Maschinen (Jacquard-Webstuhl) entwickelt worden waren; dann die Assemblersprachen der ersten Rechner, die doch nur deren Weiterententwicklung waren. Von theoretischer Seite zählen dazu die vielen Präzisierungen des Algorithmusbegriffs, von denen der λ-Kalkül die bei weitem bedeutendste ist. Auch Zuses Plankalkül gehört hierhin, denn er ist dem minimalistischen Ansatz der Theoretiker verpflichtet (Bit als Grundbaustein).

In einer ersten Phase wurden ab Mitte der 1950er Jahre unzählige Sprachen[1] entwickelt, die praktisch an gegebenen Aufgaben und Mitteln orientiert waren. Seit der Entwicklung von Algol 60 (1958-1963) ist die Aufgabe des Übersetzerbaus in der praktischen Informatik etabliert und wird zunächst mit Schwerpunkt Syntax (-erkennung, Parser) intensiv bearbeitet. Auf der praktischen Seite wurden erweiterte Datentypen wie Verbunde, Zeichenketten und Zeiger eingeführt (konsequent z. B. in Algol 68).

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. Neuere integrierte, visuelle Entwicklungsumgebungen haben deutliche Fortschritte gebracht, was Aufwand an Zeit, Kosten angeht. Bedienoberflächen lassen sich meist visuell gestalten, Codefragmente sind per Klick direkt erreichbar. Dokumentation zu anderen Programmteilen und Bibliotheken ist direkt einsehbar, meist gibt es sogar lookup-Funktionalität, die noch während des Schreibens herausfindet, welche Symbole an dieser Stelle erlaubt sind und entsprechende Vorschläge macht (Autovervollständigen).

Neben der mittlerweile etablierten objektorientierten Programmierung ist die Model Driven Architecture ein weiterer Ansatz zur Verbesserung der Software-Entwicklung, in der Programme aus syntaktisch und semantisch formal spezifizierten Modellen generiert werden. Diese Techniken markieren gleichzeitig den Übergang von einer eher handwerklichen, individuellen Kunst zu einem industriell organisierten Prozess.

Sprachgenerationen [Bearbeiten]
Man hat die Maschinen-, Assembler- und höheren Programmiersprachen auch als Sprachen der ersten bis dritten Generation bezeichnet; auch in Analogie zu den gleichzeitigen Hardwaregenerationen. Als vierte Generation wurden verschiedenste Systeme beworben, die mit Programmgeneratoren und Hilfsprogrammen z. B. zur Gestaltung von Bildschirmmasken (screen painter) ausgestattet waren. Die Sprache der fünften Generation schließlich sollte in den 1980er Jahren im Sinne des Fifth Generation Computing Concurrent-Prolog sein.

Programmierparadigmen [Bearbeiten]
Paradigmen in Programmiersprachen (Auswahl) Name funktional imperativ objektorientiert deklarativ logisch nebenläufig
Ada X X X X
C X
Prolog X X
Scheme X X (X) X (X)
Haskell X (X) X (X)
Programmierparadigmen dienen der Klassifikation von Programmiersprachen. Grundlegend sind die Paradigmen der imperativen und der deklarativen Programmierung. Eine Programmiersprache kann mehreren Paradigmen gehorchen.

Imperative Programmiersprachen und deklarative Programmiersprachen [Bearbeiten]
Ein in einer imperativen Programmiersprache geschriebenes Programm besteht aus einer Folge von Anweisungen. Sie werden unterschieden in Befehle und Daten. Dies ist nicht unbedingt notwendig, da ein Computer diese Strukturen prinzipiell nicht unterscheiden kann, hat sich jedoch historisch durchgesetzt.

Einen anderen Ansatz verfolgen die deklarativen Programmiersprachen. Dabei beschreibt der Programmierer, welche Bedingungen die Ausgabe des Programms erfüllen muss. Wie die Ausgabe berechnet wird, legt der Übersetzer fest. Ein Beispiel ist die Datenbankabfragesprache SQL.

Ein Programm muss nicht unbedingt eine Liste von Anweisungsen enthalten. Stattdessen können grafische Programmieransätze, zum Beispiel wie bei der in der Automatisierung verwendeten Plattform STEP 7, angeboten werden.

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.


Entwicklungslinien in der Programmiersprachenentwicklung Objektorientierte Programmiersprachen [Bearbeiten]
siehe Hauptartikel: Objektorientierte Programmierung

Hier werden Daten und Befehle, die auf diese Daten angewendet werden können, in Objekten zusammengefasst. Objektorientierung wird im Rahmen der Objektorientierten Programmierung verwendet, um die Komplexität der entstehenden Programme zu verringern. Der Begriff existiert aber auch für andere Aspekte der Softwareentwicklung, wie die Objektorientierte Analyse und Design von Software.

Das Konzept der objektorientierten Programmierung kann dabei helfen, Programmcode zu modularisieren. Modularisierte Quelltexte sind leichter zu warten und können in anderen Projekten wiederverwendet werden. Objekte sollen Dinge der realen Welt modellieren (Abstraktion).

Die Bausteine, aus denen ein objektorientiertes Programm besteht, werden als Objekte bezeichnet. Die Konzeption dieser Objekte erfolgt dabei in der Regel auf Basis der folgenden Paradigmen:[2]

Feedback
Es steht die Kopplung als Index für den Grad des Feedback.
Datenkapselung
Als Datenkapselung bezeichnet man in der Programmierung das Verbergen von Implementierungsdetails.
Vererbung
Vererbung heißt vereinfacht, dass eine abgeleitete Klasse die Methoden und Attribute der Basisklasse ebenfalls besitzt, also erbt.
Trivia [Bearbeiten]
Hello World [Bearbeiten]
Ein beliebter Einstieg in eine Programmiersprache ist es, mit ihr den Text Hello World (oder deutschHallo Welt“) auf den Bildschirm oder einem anderen Ausgabegerät auszugeben (siehe Hallo-Welt-Programm). Entsprechend gibt es Listen und eigene Webseiten[3], die Lösungen in verschiedenen Programmiersprachen gegenüberstellen.

Siehe auch [Bearbeiten]
Liste der Programmiersprachen
Liste von Web-Programmiersprachen
Literatur [Bearbeiten]
Friedrich Ludwig Bauer, Hans Wössner: Algorithmische Sprache und Programmentwicklung. Springer, Berlin 11981, 21984, ISBN 3-540-12962-6.
Peter A. Henning, Holger Vogelsang: Handbuch Programmiersprachen. Softwareentwicklung zum Lernen und Nachschlagen. Hanser, München 2007, ISBN 3-446-40558-5, 978-3-446-40558-5.
Kenneth C. Louden: Programmiersprachen: Grundlagen, Konzepte, Entwurf. Internat. Thomson Publ., Bonn, Albany [u. a.] 1994, ISBN 3-929821-03-6.
John C. Reynolds: Theories of Programming Languages. Cambridge Univ. Press, Cambridge 1998, ISBN 0-521-59414-6.
Peter van Roy, Seif Haridi: Concepts, Techniques, and Models of Computer Programming. Mass.: MIT Press, Cambridge 2004, ISBN 0-262-22069-5.
2. ed.Michael L. Scott: Programming language pragmatics. 2. Auflage. Elsevier, Morgan Kaufmann, Amsterdam 2006, ISBN 0-12-633951-1.
Weblinks [Bearbeiten]
Wiktionary: Programmiersprache – Bedeutungserklärungen, Wortherkunft, Synonyme, Übersetzungen und Grammatik
Wikibooks: Programmierung – Lern- und Lehrmaterialien
99 Bottles of Beer: Ein Programm in hunderten von Programmiersprachen bzw. Dialekten (englisch)
Literate Programs Ein Wiki mit Beispielen in vielen Sprachen (englisch)
Einzelnachweise [Bearbeiten]
Um 1965 zählte man 1700, vgl. ISWIM.
Peter A. Henning, Holger Vogelsang: Taschenbuch Programmiersprachen. Fachbuchverlag im Carl Hanser Verlag, Leipzig 2007, ISBN 978-3-446-40744-2.
Auflistung von Hello-World-Programmen nach Programmiersprachen

Vonhttp://de.wikipedia.org/wiki/Programmiersprache
Kategorien: Programmiersprache | Compilerbau


   User-Bewertung: -2
Tolle englische Texte gibts im englischen Blaster

Dein Name:
Deine Assoziationen zu »Programmiersprache«:
Hier nichts eingeben, sonst wird der Text nicht gespeichert:
Hier das stehen lassen, sonst wird der Text nicht gespeichert:
 Konfiguration | Web-Blaster | Statistik | »Programmiersprache« | Hilfe | Startseite 
0.0258 (0.0027, 0.0215) sek. –– 861399518