Eine Programmiersprache ist eine formale Sprache, die zur Erstellung von Verarbeitungsanweisungen für Rechnersysteme verwendet wird. Sie richtet sich deshalb in Form und Funktion als Sprache an die Struktur und Bedeutung von Information. Programmiersprachen dienen der Informationsverarbeitung. Die genauere linguistische Betrachtung dieser Aspekte ist die Aufgabe der Semiotik. 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.
Die Berechnungen in einem Computer können so in einer für den Menschen lesbaren und verständlichen Form notiert werden. Programmiersprachen sind notwendig, da die natürlichen Sprachen oder natürliche Zahlen (s. u.) für eine genügend detaillierte und präzise Beschreibung von algorithmischen Computerberechnungen zu vieldeutig und nicht formal genug sind oder nicht für den Menschen verständlich sind. Die Entwicklung von Programmiersprachen selbst ist eine Aufgabe der Informatik. Die syntaktische Definition einer Sprache wird meist in der formalen Notation Backus-Naur-Form sowie Kontextbedingungen angegeben. Eine vollständige Spezifikation einer Programmiersprache in einem einzigen Kalkül ist Forschungsgebiet und erst ansatzweise gelungen.
Programmieren mit einer Programmiersprache 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 Kodieren ist nur ein Teil der Tätigkeit eines guten Programmierers, der zum gesamten Softwareentwicklungsprozess beitragen können sollte: Analyse, Entwurf, Prototyping, Realisation, Testen, Einweisung, Dokumentation, Konsolidierung. Erheblichen Aufwand nimmt auch das so genannte Debuggen ein, also die Diagnose oder Fehlersuche. Fehler sind dann im Grundkonzept, entweder bei der Definition der Anforderungen an die Software, oder bei der Entwicklung des Softwaredesigns, auf dessen Grundlage das Programm entwickelt wird. Fehler bei der Anforderungsdefinition beruhen oft auf mangelnder Kenntnis des Fachgebietes, für das die Software geschrieben wird oder auf Missverständnissen zwischen Nutzern und Entwicklern. Fehler direkt im Softwaredesign hingegen sind oft auf mangelnde Erfahrung der Softwareentwickler oder auf Folgefehler durch Fehler in der Anforderungsspezifikation zurückzuführen. In anderen Fällen ist das Design historisch gewachsen und wird mit der Zeit unübersichtlich, was wiederum zu Designfehlern bei Weiterentwicklungen des Programms führen kann. Vielen Programmierern ist das Softwaredesign auch lästig, sodass oftmals ohne richtiges Konzept direkt entwickelt wird, was dann insbesondere bei steigendem Komplexitätsgrad der Software unweigerlich zu Designfehlern führt. Sowohl für Fehler in der Anforderungsdefinition als auch im Softwaredesign kommen darüber hinaus vielfach Kosten- oder Zeitdruck in Frage.
Die Geschichte der Programmiersprachen
Die Geschichte der Programmiersprachen beginnt bereits im 19. Jahrhundert und ist in ihren Anfängen stark durch die Mathematik und durch Ingenieurswissenschaften geprägt. Ab wann eine Programmiersprache vorliegt, ist tatsächlich nicht eindeutig zu bewerten.
Als erste Arbeit im Bereich der Programmierung gilt eine Vorschrift für die Berechnung von Bernoulli-Zahlen, die Ada Lovelace in den Jahren 1842/1843 für die mechanische Analytical Engine von Charles Babbage erstellte. Dieses Programm konnte zu ihrer Zeit nur von Hand ausgeführt werden, denn wegen Fertigungsproblemen gab es im 19. Jahrhundert keine funktionsfähige Maschine.
Der Lambda-Kalkül wurde von Alonzo Church und Stephen Kleene in den 1930er Jahren entwickelt. Es wurde schon früh nachgewiesen, dass der Lambda-Kalkül eine universelle Programmiersprache ist. Damit hätten sich schon damals theoretisch ebenso mächtige Programme schreiben lassen, wie heute in jeder modernen Programmiersprache. Allein die Hardware in Form eines Computers fehlte.
Mit Fertigstellung der ersten elektronischen Rechenmaschinen und der Verwendung der booleschen Algebra ging es spürbar mit der Entwicklung von Programmiersprachen weiter. Hervorzuheben sind diesbezüglich etwa 1937 die Patente von Konrad Zuse, welche eine Computerarchitektur beschreiben, die später als Von-Neumann-Maschine bekannt wird. In den 1940er Jahren stellte Zuse dafür seine Programmiersprache Plankalkül fertig, in die Ideen aus dem Lambda-Kalkül einflossen.
In den 50er Jahren des letzten Jahrhunderts wurden in den USA die ersten drei weiter verbreiteten, praktisch eingesetzten höheren Programmiersprachen entwickelt: Die Älteste noch in weitem Gebrauch befindiche Sprache FORTRAN (FORmula TRANslator) wurde 1954 von John Backus et al. entworfen, 1959 kam LISP (LISt Processor) von John McCarthy et al. hinzu, das einen auf einer Seite in sich selbst beschreibbaren Kern aufweist und 1959 brachten Grace Hopper et al. COBOL (COmmon Business Oriented Language) für kommerzielle Anwendungen zur Welt. Die vorgenannten Sprachen existieren mit ihren Nachfolgern bis heute. Vor allem LISP beeinflusste die später an amerikanischen Universitäten entwickelten Programmiersprachen stark.
Der nächste größere Meilenstein wurde zwischen 1958 und 1960 gesetzt, als ein internationales Komitee während einer Tagungsreihe eine „neue Sprache für Algorithmen“ mit dem späteren Namen Algol 58 entwarf. Das Komitee beendete seine Entwicklung mit dem Revised Report on Algol 60 (ALGOrithmic Language). In den Bericht zur Tagung wurden viele Ideen aufgenommen, die zu dieser Zeit in der Fachgemeinschaft kursierten, und ebenso zwei Neuerungen: Zum einen die Backus-Naur Form (BNF) zur kontextfreien Beschreibung der Syntax der Programmiersprache. Nahezu alle folgenden Programmiersprachen benutzen die BNF, um die Syntax als kontextfreie Grammatik darzustellen. Zum anderen wurden Gültigkeitsbereiche erstmals definiert.
Obwohl Algol 60 sich aus politischen Gründen in Nordamerika nicht durchsetzte, hauptsächlich weil IBM eine Gegenentwicklung in Form von PL/I anbot, teilweise aber auch wegen der Entscheidung, die Ein- und Ausgabe nicht in die Sprachdefinition zu integrieren, wurde Algol in der Folgezeit zum Standard in der (west)europäischen Welt. Sie beeinflusste die Ausbildung einer ganzen Generation von Informatikern und das Design späterer Sprachen, insbesondere von Simula 67, Pascal und Scheme.
In der Folgezeit wurde eine große Zahl von Programmiersprachen entwickelt, da die Möglichkeit und der Bedarf durch den schnellen Fortschritt der Computertechnik (siehe auch: Digitaltechnik, Mikroelektronik) gegeben war. Den größten Erfolg hatten dabei Weiterentwicklungen der bereits vorhandenen Programmiersprachen, also in erster Linie „zustandswechselorientierte“ Konzepte. Beispielsweise wurde um 1964 BASIC (Beginner's All-purpose Symbolic Instruction Code) entwickelt, um Studenten den Einstieg in die Programmierung mit Algol und FORTRAN zu erleichtern. Diese BASIC-Schüler machten sie schließlich auch in dem Ende der 1970er Jahre entstehenden Heimcomputerbereich populär. Auch die Programmiersprache C, 1972 für das neu entwickelte Betriebssystem Unix entworfen, hat ihre Wurzeln in Algol. Sie setzte sich gegenüber BASIC für allgemeine Anwendungsprogramme durch; die grundlegenden funktionalen Teile (Kernel) vieler Betriebssysteme sind in C programmiert. Beide Sprachen haben bis heute viele Varianten nach sich gezogen.
Es entstanden in dieser Zeit jedoch auch neue Konzepte. Große Bedeutung erlangte das objektorientierte Programmieren, das Daten-, Prozedur- und Referenzaspekte in dem einzigen Konzept des Objekts vereinigt. Denkweise und Begriffe der Objektorientierung zeigten sich zuerst in Simula 67, einer Sprache für Simulationszwecke, die als erste Sprache (damals noch nicht so genannte) objektorientierte Verfahren einführte. Erzählt wird, dass ihre Entwickler Ole-Johan Dahl und Kristen Nygaard an Schiffssimulationen gearbeitet hatten. Dabei ergab sich durch die unüberschaubar vielen Parameterbeziehungen eine verwirrende Vielfalt an Möglichkeiten, wie sich die verschiedensten Attribute der unterschiedlichen Schiffe gegenseitig beeinflussen konnten. So kam bei ihnen die Idee auf, die unterschiedlichen Schiffstypen jeweils als eigenständige Objekte zu behandeln, wobei jede Klasse von Objekten für die eigenen Daten und das eigene Verhalten selbst zuständig war. 1962 trafen sie sich am Norwegian Computing Center in Oslo und erstellten eine erste formale Beschreibung der Sprache, die in München vorgestellt wurde. Ein erster Protoyp eines Simula Compilers lief bereits 1964. In den 1970er Jahren wurde Simula in der Praxis vielfach eingesetzt. Die objektorientierten Konzepte der Sprache hatte großen Einfluss auf die weitere Entwicklung von Programmiersprachen.
Während in Simula die neuen Konzepte noch von ihrer Implementierung nicht deutlich abgehoben wurden, wurde in der Folgezeit die Konzepte weiter entwickelt. Deren Begriffe und Verfahren wurden bereits seit den frühen 1970er Jahren im Xerox Palo Alto Research Center mit der Sprache Smalltalk verfeinert und konsequenter als in Simula umgesetzt. Smalltalk wurde schließlich in den 1980ern der Öffentlichkeit allgemein freigegeben. Smalltalk war als voll dynamisches System angelegt, bei dem man Objekte interaktiv erzeugen und ändern konnte – im Gegensatz zum vorher verwendeten System statischer Programme. Bemerkenswert auch gegenüber ihren Nachfolgern ist die Integration der Sprache in einer innovativen graphischen Benutzeroberfläche, die erstmals eine echte Interaktion ermöglichte.
Nachdem Niklaus Wirth bei seiner Mitarbeit an Algol enttäuscht war, entwickelte er Pascal zusammen mit Kathleen Jensen und setzte Pascal ab 1971 konsequent für die Lehre von Sprachkonzepten ein. Prolog von Alain Colmerauer, Phillipe Roussel, und Robert Kowalski begründete ab 1972 die logische Programmierung und wurde bis 1975 festgeschrieben.
In den 1970ern zeigte sich das Verteidigungsministerium der USA besorgt über die Anzahl von über 450 Programmiersprachen, die in seinen Projekten verwendet wurden. Viele der Programmiersprachen waren zudem nicht standardisiert, sondern vom Anbieter abhängig. Eine Arbeitsgruppe sollte diesen Dschungel lichten und eine Sprache finden, welche die militärischen Bedingungen des Ministeriums erfüllt. Viele existierende Sprachen wurden überprüft, doch 1977 kam die Arbeitsgruppe zum Entschluss, dass keine der vorhandenen Sprachen geeignet war. Nach Ausschreiben von vier Sprachentwürfen entschied man sich 1980 für die aus den besten Ideen der Entwürfe komponierte Sprache Ada. Dieser Entwurf wurde unter der Bezeichnung MIL-STD 1815 standardisiert, da 1815 die Namensgeberin Ada Lovelace geboren wurde. Das Verteidigungsministerium der USA schrieb zeitweilig vor, dass jedes Softwareprojekt mit einem Anteil von mehr als 30% neuem Code in Ada geschrieben werden musste. Um die Verbreitung des Standards zu unterstützen, finanzierte die US Air Force die Entwicklung des kostenfreien GNAT-Compilers. Die Anzahl verschiedener Programmiersprachen im Ministerium reduzierte sich schließlich auf 36.
Die objektorientierte Programmierung begann Mitte der 1980er Jahre populärer zu werden, hauptsächlich durch den Einfluss von C++, das als syntaktische Erweiterung der Sprache C konzipiert war. Bjarne Stroustrup hatte 1983 C++ vorgestellt. Viele existierende Programmiersprachen erhielten seit dieser Zeit objektorientierte Erweiterungen, wie Pascal oder LISP (siehe dazu die Abbildung). So wurde beispielsweise 1995 die Objektorientierung als Erweiterung in die neue Version Ada 95 aufgenommen. Weiter gefestigt wurde die Stellung der objektorientierten Programmierung durch die schnell wachsende Beliebtheit der grafischen Bedienoberflächen, die sich objektorientiert sehr einfach programmieren ließen.
Das Hinzufügen objektorientierter Erweiterungen zu Sprachen, die ursprünglich nicht dafür entworfen wurden, führte zu Problemen mit der Kompatibilität und Wartbarkeit von bereits geschriebenen Quelltext. Rein objektorientierte Sprachen wiederum fehlten prozedurale Programmiermöglichkeiten, an die sich viele Programmierer gewöhnt hatten. Um diese Lücke zu schließen, wurden verschiedene Versuche unternommen, neue objektorientierte Sprachen zu schaffen, die gleichzeitig eine prozedurale Programmierung erlauben. Die Programmiersprache Eiffel war ein früher Versuch in diese Richtung. Inzwischen wurde sie aber praktisch von Java verdrängt. Die an Java und C++ angelehnte Sprache C# verfolgt ähnliche Ziele wie Java.
Das schnelle Wachstum des Internets war eine neue Herausforderung. Allen voran die Hypertext Markup Language (HTML) ermöglichte dabei als Auszeichnungssprache das Aussehen des Internets zu gestalten. Das Internet bildete eine völlig neue Grundlage für die Erstellung von Softwaresystemen und damit auch für die Entwicklung neuartiger Programmiersprachen. Dass sie sich schon früh in Webbrowsern integrierte, zeichnet die Programmiersprache Java aus und begründete ihre Popularität. Auch setzten sich verschiedenste Skriptsprachen für die Entwicklung von Webserver-Anwendungen durch. Obwohl keine der Sprachen fundamentale Neuerungen im Sprachdesign mit sich brachte, wurden nun Aspekte wie automatische Speicherbereinigung oder starke und statische Typisierung stärker berücksichtigt. Immer größere Beachtung fand auch die Codesicherheit und die Portabilität des Programmcodes, dies führte zur Entwicklung von virtuellen Maschinen als Laufzeitumgebungen.
Der Siegeszug der objektorientierten Programmierung setzte sich weiter fort. In diesem Zusammenhang ist die für das objektorientierte Programmieren entworfene graphische Notationsformen der Unified Modeling Language (UML) zu nennen. Durch die meist visuellen Modellierung wird in UML die Softwareentwicklung zu einem geordneten Prozess. Dabei kann man feststellen, dass bisher lediglich der Abstraktionsgrad erhöht wurde. UML wird jedoch mit ihrer zunehmenden Spezifizierung immer mehr zu einer eigenen Programmiersprache.
Neuere integrierte, visuelle Entwicklungsumgebungen haben im Zeit und Kostenaufwand deutliche Fortschritte gebracht. Bedienoberflächen lassen sich nun visuell gestalten, Codefragmente sind per Klick direkt erreichbar. Dokumentationen zu anderen Programmteilen und Bibliotheken sind direkt einsehbar. Meist gibt es sogar eine so bezeichnete „Look-Up“-Funktionalität, die noch während des Schreibens herausfindet, welche Symbole an einer bestimmten Stelle erlaubt sind und entsprechende Auswahlen vorschlägt.
Quelle: www.wikipedia.de
Autoren: Lichtkind, JohannWalter, Zahnstein, Aka, Robert Wünsche u.a.
Dieser Eintrag unterliegt der
GNU Lizenz für freie Dokumentation (GFDL). Hier finden Sie die Lizenzbestimmung.