Programmiersprache
[[pl:J%EAzyk programowania]]
Eine Programmiersprache ist eine künstliche Schriftsprache zur Kommunikation zwischen Mensch und Computersystem. Diese vermittelt (zumindest im Falle von imperativen Programmierprachen) dem Computersystem durch von einem Menschen geschriebenen Text genaue Angaben zu einer Kette von internen Verarbeitungsschritten, deren Daten, Struktur und deren Verlauf in Abhängigkeit von internen oder externen Ereignissen.
Da der digitale Computer intern nur Werte von 0 und 1 verarbeitet, ist es sehr unhandlich und mühsam, die vielen Formen von Informationsverarbeitung in reinen Werten von Null und Eins anzugeben (zu kodieren). Daher hat sich schnell ein Übersetzungsmechanismus etabliert, der häufig verwendete Zahlen und Zeichen und häufig verwendete grundlegende Operationen in abkürzender symbolischer Schriftsprache angibt. Eine weitere technische Einrichtung übersetzt dann diese Angaben in interne Daten, einfachste Datenänderungsbefehle und Kontrollanweisungen, die der Computer dann schließlich ausführt.
Wird ein Programmtext als Ganzes übersetzt, spricht man in bezug auf den Übersetzungsmechanismus von einem Compiler. Der Compiler ist selbst ein Programm, welches als Dateneingabe den menschenlesbaren Programmtext bekommt und als Datenausgabe den einen Code liefert, der direkt von dem jeweiligen Prozessor verstanden wird (Objectcode, EXE-Datei) oder in einer Laufzeitumgebung (z.B. JVM oder .NET) ausgeführt wird. Wird ein Programmtext hingegen jeweils Schritt für Schritt übersetzt und jeweils ein übersetzter Schritt sofort ausgeführt, spricht man von einem Interpreter. Interpretierte Programme laufen meist langsamer als compilierte Programme.
Eine Ansammlung der in einer Programmiersprache aufgeschriebenen Anweisungen nennt man allgemein Programm, Code oder Quelltext. (Quelltext betont besonders die Menschenlesbarkeit). Dieser wird meist von professionellen Programmierern verfasst und seine Herstellung ist ein technischer Schaffensprozess.
Elemente einer Programmiersprache
Jede Programmiersprache hält Vereinbarungen bzgl. Syntax, Vokabular und Bedeutung bereit für:
- Daten und Datenstrukturen
- Befehle und Befehlsgruppen
- Bezugnahmemechanismen und Wiederverwendung
- zumeist eine primäre Designphilosophie
Daten und Datenstrukturen. Um die üblichen Arten von Informationen im Computer abbilden zu können, müssen Möglichkeiten zur Definition von Daten oder Datenstrukturen bereitstehen. Hierbei muß zwischen typsicheren (z.B. C++ oder Java) und typenlosen Sprachen (z.B. JavaScript, Tcl oder Prolog)unterschieden werden. Bei typsicheren Sprachen sind dies entweder vordefinierte Einheiten für einzelne Zahlen (Byte, Integer, Word, etc.) und Zeichen (Char) oder auch zusammengesetzte für Daten, Wörter, Text, sensorische Information und so weiter. Zumeist besteht auch die Möglichkeit zusammengesetzte Objekte oder Strukturen aufzubauen und als neuen Typ zu vereinbaren (etwa Arrays, Listen, Stacks, ganze Dateien). Die typenlosen Sprachen behandeln oftmals alle Einheiten als Zeichenketten und kennen für zusammengesetzte Daten eine allgemeine Liste.
Befehle und Befehlsstrukturen. Konzeptionell ist ein programmierbarer Rechner weit mehr als eine Sammlung von Daten und auch keine starre Rechenmaschine. Vielmehr wird angegeben wie der Computer mit variablen internen oder externen Daten zu verfahren hat. Elementare Anweisungen geben über Schlüsselwörter (reserved words) an, WANN WAS WIE geändert werden soll. Jede Sprache enthält eine WENN-DANN-artige Anweisung, die letztlich zusammen mit dem Sprungbefehl (GOTO)) die Universalität bereitstellt, um allgemein auf vielfältigste Fälle reagierende Programme schreiben zu können. Falls Konstrukte für Schleifen mit Bedingungen (Bedinung zuerst, dann Anweisungsgruppe, Anweisungsgruppe und dann Bedingung) zur Verfügung stehen kann auf den Sprungbefehl vollständig verzichtet werden. Niklaus Wirth hat dies mit der Pascal gezeigt.
Bezugnahmemechanismen und Wiederverwendung. Der Kern der Bezugnahme ist die Benennung von Speicherplatz als sog. Variable. Weitere Bezugnahmen sind Zeiger auf solche Variablen oder Variablengruppen. Auch Befehlsgruppen werden im Programm per Namensaufruf als Prozedur oder Funktionsaufruf verfügbar gemacht. Auf diese Weise wird durch Symbole einerseits eine große Variabilität erreicht und durch Referenz auf vorhandene Programm- oder Datenteile andererseits ein hohes Maß an Wiederverwendbarkeit erreicht. Viele anwendungsbezogene Sprachen integrieren typische Aufgaben als aufrufbare Befehle.
Designphilosophie. Für die obengenannten Zwecke hat jede Sprache meist eine besondere Philosophie entwickelt. Es wird der eine oder andere Aspekt besonders betont. Mehr Datenstrukturen oder Freiheit in der Notation oder Raffinesse, was Zeigerstrukturen angeht.
Die meisten Sprachen sind Sprachen, die gute Funktionalität bieten aber auch ein hohes Maß an Disziplin bezüglich Fehlerfreiheit fordern. Programmiersprachen sind nicht fehlertolerant; was durch Hilfen aber abgemildert ist. Einige wenige Sprachen bieten große gestalterische Freiheiten bis hin zum sich selbstverändernden Programm: dazu gehört Maschinensprache und auch LISP.
Die Entwicklung von Programmiersprachen selbst ist eine Aufgabe der Informatik. Die syntaktische Definition einer Sprache wird meist in Backus-Naur Form angegeben, einer formalen Notation.
Geschichte
Anfänge. Erste Arbeiten stammen bereits von Lady Ada, Countess of Lovelace (1815-1852)(Assistentin von Charles Babbage), die als erste das Prinzip der variablen Programmierbarkeit erkannte. Dies entwickelte sich erst spürbar weiter mit Entwicklung der ersten elektronischen Rechenmaschinen und der Verwendung der booleschen Algebra. Meilensteine sind ab ca. 1940 die Entwicklung von Konrad Zuses Plankalkül, die Konzeption der Von-Neumann Maschine und die ersten Sprachen in Amerika: FORTRAN(1954, John Backus), COBOL (1959, Grace Hopper?), LISP (1959, McCarthy) und weitere (s.Tabelle). Inzwischen ist eine riesige Zahl von Sprachen entstanden und es gibt einen evolutionären Prozess mit gegenseitiger Adaptierung. Eine wichtige Rolle spielen dabei auch die Standardisierungs-Organisationen (ISO). Die vorgenannten Sprachen existieren bis heute.
Zeittafel
- 1840~ --'Erstes Programm' (Ada Lovelace)
- 1947 -- Plankalkül (Konrad Zuse)
- 1954 -- FORTRAN (John Backus)
- 1959 -- LISP (McCarthy)
- 1959 -- COBOL (Grace Hopper)
- 1960 -- BASIC (Kemmeny, Kurtz)
- 1967 -- Mumps (Barnett)
- 1971 -- Pascal (Niklas Wirth, Kathleen Jensen)
- 1972 -- C (Dennis Ritchie, Ken Thompson)
- 1975 -- Prolog (Colmerauer et. al.)
- 1980 -- Smalltalk
- 1980 -- ADA
- 1987 -- Perl
- 1995 -- Delphi (=Visuelle IDE (integrierte Entwicklungsumgebung) Pascal basiert) (Inprise Inc.)
- 1995 -- Programmiersprache Java
siehe Zeittafel II, Entwicklung der Programmiersprachen (ausführlich)
Die Entwicklung hat dahin geführt, dass die Universalisten am weitesten verbreitet sind, d.h. diejenigen Sprachen (wie C,C++), die weitestgehend alle wichtigen Aspekte integriert haben. Hierzu gehören auch neuere Konzeptionen der objektorientierten Programmierung, die Daten-, Prozedur- und Referenzaspekte in dem einzigen Konzept des Objekts vereinigt.
Aktuelle Entwicklungen. Neuere integrierte, visuelle Entwicklungsumgebungen haben deutliche Fortschritte gebracht, was Aufwand an Zeit, Kosten (und Nerven) angeht. Bedienoberflächen lassen sich meist interaktiv gestalten und Codefragmente sind per Klick direkt erreichbar. Weitere Arbeitserleichterungen sind vorgefertigte Komponenten und Softwarebibliotheken mit wiederverwendbarem Code. Dazu kann objekt-orientierte Methodik auch die Komplexität von Programmen erheblich reduzieren. Diese Techniken markieren gleichzeitig den Übergang von einer eher 'handwerklichen' Kunst zu einem mehr industriell organisierten Prozess.
Besondere Ausprägungen
Maschinensprache: Der direkt auf einem Prozessor ausführbare Code. Sein Umfang ist architekturabhängig.
Assemblersprachen: Assemblersprachen gehören immer direkt zu ihrer entsprechenden Maschinensprache. Die Maschinenbefehle werden jedoch in einer lesbaren Form geschrieben. Weiter wird mittels Symbolen adressiert, die absoluten Adressen werden vom Assembler errechnet. Auch können symbolische Konstanten benutzt werden.
Datenstrukturen: LISP verwendet als konzeptionelle Hauptstruktur Listen. Auch das Programm ist eine Liste von Befehlen, die andere Listen verändern. FORTH verwendet als konzeptionelle Hauptstruktur Stacks und Stackoperationen.
Logische Sprachen: Prolog orientiert sich in bezug auf Daten- und Evaluationsmechanismus an mathematischer Logik.
Prozedurale Sprachen: BASIC, C, COBOL, FORTRAN, Pascal, PL/1 sind Vertreter der prozeduralen Familie, in der Anweisungen hintereinander abgearbeitet werden.
Objektorientierte Sprachen: Smalltalk, Eiffel, Modula-3, C++, Java und Oberon (?) sind objektorientierte Sprachen. Die Datenstrukturen befinden sich bei ihnen in Objektklassen, zu denen auch der jeweilige (auf die Datenstruktur zugreifende) Code (Methoden) gehört. Dadurch wird eine hohe Lokalität erreicht. Objektklassen lassen sich mittels Vererbung erweitern.
Funktionale Sprachen: APL ?. LISP, ML, Scheme, Sather, Haskell
regelbasierte Sprachen: Bei regelbasierten Sprachen wie OPS-5 werden Regeln gegen eine Datenmenge auf ihre Instanziierbarkeit geprüft. Aus allen Regelinstanziierungen wird eine (mehrere, alle) ausgewählt und die zur Regel gehörenden Anweisungen werden ausgeführt.
Anwendungsbezogene Sprachen und Systeme: Datenbanksysteme: dBase, SQL
Liste der Programmiersprachen
- Ada
- Algol
- APL
- Assembler (Maschinensprache)
- awk (awk, gawk, mawk, nawk)
- BASIC (True BASIC, VB (Visual Basic), VBA (VB for Applications), VBScript, ...)
- bash
- BCPL
- C (C, Visual C)
- C++ (C++, Visual C++)
- C#
- COBOL
- Delphi
- Eiffel
- FORTH
- FORTRAN
- Haskell
- Java
- JavaScript (JScript, ECMAScript, DHTML)
- Kylix
- lex (flex)
- LISP
- Logo
- Miranda
- ML
- Modula (Modula, Modula-2, Modula-3)
- Mumps
- Mycin (E-Mycin)
- Oberon
- Objective-C
- Pascal (Turbo Pascal)
- perl
- PHP
- PL/I
- Prolog (Arity Prolog, Turbo Prolog)
- Python
- RPG
- Ruby
- Sather
- Scheme
- Self
- Shell (bash, csh)
- Simula
- Smalltalk
- SNOBOL4
- SQL
- Tcl
- yacc (Bison)
- Visual xx (Visuelle Versionen einzelner Sprachen)
Alternativen
Programmiersprachen sind nicht die einzige Möglichkeit komplexe Abläufe für den Computer aufzubereiten. Andere Konzeptionen sind etwa Datenbanken und Tabellenkalkulation, oder im hardwarenahen Bereich Speicherprogrammierbare Steuerungen.
Programmieren
Programmieren ist eine anspruchsvolle Tätigkeit und erfordert Disziplin, Ausdauer, abstraktes Denkvermögen, Kreativität und hohe Lernbereitschaft. Unterschiedlichste Aufgaben müssen in die Symbole der Programmiersprache transferiert werden. Das Programmieren als dieses reine Codieren ist nur ein Teil der Tätigkeit eines guten Programmierers, der zum gesamten Softwareentwicklungsprozess beitragen können sollte: Analyse, Entwurf, Prototyping, Realisation, Testung, Einführung, Dokumentation, Konsolidierung. Nicht unerheblichen Aufwand nimmt auch das sog. Debuggen ein, dt. Fehlersuche.
Berufe: Softwareentwickler, Anwendungsentwickler, Systemprogrammierer, Organisationsprogrammmierer,..
Ausblick
Ausblick: Künstliche Intelligenz
siehe auch Datenbanksysteme, Software, Softwareengineering, Algorithmus siehe auch Informatik
Websites:
- Virtual Museum of Computing (Linksammlung)
- Sammlung von 2350 Programmiersprachen