Programmiersprache

formale Sprache zur Formulierung von Rechenvorschriften, die von einem Computer ausgeführt werden können

EineProgrammierspracheist eineformale Sprachezur Formulierung vonDatenstrukturenundAlgorithmen,d. h. von Rechenvorschriften, die von einemComputerausgeführt werden können.[1]Sie setzen sich üblicherweise aus schrittweisenAnweisungenaus erlaubten (Text-)Mustern zusammen, der sogenanntenSyntax.

Quelltext eines Programms in der ProgrammierspracheC++.
Quelltext eines Programms in der ProgrammierspracheScratch.

Während die ersten Programmiersprachen noch unmittelbar an den Eigenschaften der jeweiligen Rechner ausgerichtet waren, werden heute meistproblemorientierteoder auch (allgemeiner)höhere Programmiersprachenverwendet, die eine maschinenunabhängigere[2]und somit für den Menschen leichter verständliche Ausdrucksweise erlauben. In diesen Sprachen geschriebene Programme können automatisiert inMaschinenspracheübersetzt werden, welche unmittelbar von einemProzessorausgeführt werden kann. Zunehmend kommen auchvisuelle Programmiersprachenzum Einsatz, welche den Zugang zu Programmiersprachen erleichtern.

Beideklarativen Programmiersprachenist der Ausführungsalgorithmus schon vorab festgelegt und wird nicht im Quelltext ausformuliert/beschrieben, sondern es werden nur seine Anfangswerte und Bedingungen festgelegt sowie die Regeln, die das Ergebnis erfüllen muss.

Übersicht

Bearbeiten
Begriffszusammenhänge „Programmiersprache “

Die Anweisungen eines Programms werden meist mittels einfacherTexteditorenerzeugt; man nennt sie denQuelltext(oder auch Quellcode). Um auf einem Computer ausgeführt zu werden, muss der Quelltext in dieMaschinensprachedieses Computer(typ)s übersetzt werden. Diese ist im Gegensatz zuhöheren Programmiersprachenund zurAssemblerspracheein für Menschen schwer lesbarer Binärcode. Wird von Programmierung in Maschinensprache gesprochen, so ist heute meist die Assemblersprache gemeint.

DieÜbersetzungin Maschinensprache kann entweder vor der Ausführung durch einenCompileroder – zurLaufzeit– durch einenInterpreteroderJIT-Compilergeschehen. Oft wird eine Kombination aus beiden Varianten gewählt, bei der zuerst der Quelltext des Programms in einenZwischencodeübersetzt wird, welcher dann zur Laufzeit innerhalb einerLaufzeitumgebungin 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-Bytecodesowie dieCommon Intermediate Language.

Programmiersprachen bieten meist mindestens

Meist ist es möglich, aus diesen Grundfunktionen höhere Funktionen zu erstellen und diese als Bibliothek wiederverwendbar zu kapseln. Von dort zu einer höheren oder problemorientierten Sprache zu gelangen, ist kein großer Schritt mehr. So gab es schon bald eine große Zahl an Spezialsprachen für die verschiedensten Anwendungsgebiete. Damit steigt dieEffizienzder Programmierer und diePortabilitätder Programme, meist nimmt dafür dieVerarbeitungsgeschwindigkeitder erzeugten Programme ab, und die Mächtigkeit der Sprache nimmt ab: Je höher und komfortabler die Sprache, desto mehr ist der Programmierer daran gebunden, die in ihr vorgesehenen Wege zu beschreiten.

Sprachen sind verschieden erfolgreich – manche „wachsen “und finden zunehmend breitere Anwendung; immer wieder sind auch Sprachen mit dem Anspruch entworfen worden, Mehrzweck- und Breitbandsprachen zu sein, oft mit bescheidenem Erfolg (PL/1,Ada,Algol 68). Verschiedene Dienste versuchen, die Verbreitung der verschiedenen Sprachen zu messen; bekannt sind beispielsweise derTIOBE-Index,PYPL[3]und die Analysen von RedMonk.[4]

Panorama

Bearbeiten

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

Umgangssprachlich wird auch in anderen Bereichen von Programmiersprachen gesprochen. Nachfolgende Sprachen sind jedochnichtfür die Beschreibung von Algorithmen und allgemeine Datenverarbeitung entworfen, also keineAllzweck-Programmiersprachen:

Derartige Sprachen fallen unter diedomänenspezifischen Sprachen.

Anweisungskategorien

Bearbeiten

Die Anweisungen von Programmiersprachen (Beispiele siehehier) lassen sich nach folgenden Gruppen klassifizieren:

  • Eingabe- und Ausgabe-Befehle – lesen Daten von der Tastatur, von einerDateioder aus anderen Quellen ein oder sie geben sie auf/über ein bestimmtes Ausgabegerät (Bildschirm, Datei, Drucker,…) aus.
  • Zuweisungenund Berechnungen – verändern oder erzeugen Dateninhalte.
  • Kontrollflussanweisungen:Entscheidungsanweisungen (auch Verzweigungsanweisungen), Iterationsanweisungen, Sprunganweisungen entscheiden aufgrund der vorliegenden Daten, welche Befehle als Nächstes ausgeführt werden.
  • Deklarationen– reservieren Speicherplatz fürVariablenoderDatenstrukturenunter einem fast frei wählbaren Namen. Über diesen Namen können sie später angesprochen werden.
  • Aufrufe „programm-externer “Unterroutinen/Module wie Systemfunktionen (z. B. „Read “) oder funktionaler Module, auch aus anderen Programmiersprachen.

Übersetzer

Bearbeiten

Um ein in einer bestimmten Programmiersprache erstelltes Programm ausführen zu können, muss anstatt dessenQuellcodeeine äquivalente Folge von Maschinenbefehlen ausgeführt werden. Das ist notwendig, da der Quellcode aus Zeichenfolgen besteht (z. B. „A = B + 100 * C “), die der Prozessor nicht „versteht “.

Die in der Geschichte der Computertechnik und derSoftwaretechnologieeingetretenen Entwicklungssprünge brachten auch unterschiedliche Werkzeuge zur Erzeugung von Maschinencode, ggf. über mehrere Stufen, mit sich. Diese werden beispielsweise alsCompiler,Interpreter,Precompiler,Linkeretc. bezeichnet.

In Bezug auf die Art und den Zeitpunkt, wie der Computer zu einem äquivalenten Maschinencode kommt, können zwei Prinzipien unterschieden werden:

  • Wird einProgrammtext als Ganzes„übersetzt “, also aus dem Quelltext ein Maschinenprogramm erstellt, so spricht man in Bezug auf den Übersetzungsmechanismus von einem Compiler. Der Compiler selbst ist ein Programm, das als Dateneingabe den Programm-Quellcode liest und als Datenausgabe den Maschinencode (z. B. Objectcode, EXE-Datei, „executable “) oder einen Zwischencode liefert.
  • Wenn abhängig vom Programmtextwährend der Ausführungentsprechende Maschinencodeblöcke ausgeführt werden, spricht man von einer interpretierten Sprache. Das Programm wird in einerLaufzeitumgebung(z. B. veralteteJVM) interpretiert und je nach Programmbefehl ein entsprechender Maschinenbefehlblock ausgeführt.

Daneben existieren verschiedeneMischvarianten:

  • Bei der „Just-in-Time-Kompilierung “wird der Programmtext direkt vor jedem Programmlauf neu übersetzt; ggf. werden erst während des (interpretierten) Programmlaufs einzelne Programmabschnitte kompiliert.
  • Zum Teil erzeugen Compiler einen noch nicht ausführbaren Programmcode, der von nachfolgendenSystemprogrammenzu ausführbarem Maschinencode umgeformt wird. Hier sind die Konzepte „plattformunabhängigerZwischencode“(z. B. im Rahmen derSoftware-Verteilung) und „plattformgebundenerObjektcode“(wird zusammen mit weiteren Modulen zu ausführbarem Code, z. T.Lademodulgenannt, zusammengebunden) zu unterscheiden.
  • MitPrecompilernkönnen spezielle, in der Programmiersprache selbst nicht vorgesehene Syntax-Konstrukte (zum BeispielEntscheidungstabellen) bearbeitet und, vor-übersetzt in die gewählte Programmiersprache, im Quellcode eingefügt werden.

Zur Steuerung des Übersetzens kann der Quelltext neben den Anweisungen der Programmiersprache zusätzliche spezielleCompiler-Anweisungenenthalten. Komplexe Übersetzungsvorgänge werden bei Anwendung bestimmter Programmiersprachen /Entwicklungsumgebungendurch einenProjekterstellungsprozessund die darin gesetztenParametergesteuert.

Geschichte

Bearbeiten
Grace Hopperentwickelte den erstenCompilerund gilt als „GrandmaCOBOL

Zur Vorgeschichte der Programmiersprachen kann man von praktischer Seite die zahlreichen Notationen zählen, die sowohl in derFernmeldetechnik(Morsecode) als auch zur Steuerung von Maschinen (Jacquardwebstuhl) entwickelt worden waren; dann dieAssemblersprachender ersten Rechner, die doch nur deren Weiterentwicklung waren. Von theoretischer Seite zählen dazu die vielen Präzisierungen desAlgorithmusbegriffs,von denen derλ-Kalküldie bei weitem bedeutendste ist. AuchZusesPlankalkülgehört hierhin, denn er ist demminimalistischenAnsatz der Theoretiker verpflichtet (Bitals Grundbaustein).

In einer ersten Phase wurden ab Mitte der 1950er Jahre unzählige Sprachen[5]entwickelt, die praktisch an gegebenen Aufgaben und Mitteln orientiert waren. Seit der Entwicklung vonAlgol 60(1958–1963) ist die Aufgabe desÜbersetzerbausin der praktischen Informatik etabliert und wird zunächst mit Schwerpunkt Syntax (-erkennung,Parser) intensiv bearbeitet. Auf der praktischen Seite wurden erweiterteDatentypenwieVerbunde,ZeichenkettenundZeigereingeführt (konsequent z. B. inAlgol 68).

In den 1950er Jahren wurden in denUSAdie ersten drei weiter verbreiteten, praktisch eingesetztenhöhere Programmiersprachenentwickelt. Dabei verfolgten diese sowohlimperativeals auchdeklarativ-funktionaleAnsätze.

Die Entwicklung vonAlgol 60läutete eine fruchtbare Phase vieler neuer Konzepte, wie das derprozeduralen Programmierungein. Der Bedarf an neuen Programmiersprachen wurde durch den schnellen Fortschritt derComputertechnikgesteigert. In dieser Phase entstanden die bis heute verbreiteten ProgrammiersprachenBASICundC.

In der Nachfolgezeit ab 1980 konnten sich die neu entwickeltenlogischen Programmiersprachennicht gegen die Weiterentwicklung traditioneller Konzepte in Form desobjektorientierten Programmierensdurchsetzen. Das in den 1990er Jahren immer schneller wachsendeInternetforderte seinen Tribut beispielsweise in Form von neuenSkriptsprachenfür die Entwicklung vonWebserver-Anwendungen.

Derzeit schreitet die Integration der Konzepte der letzten Jahrzehnte voran. Größere Beachtung findet so beispielsweise der Aspekt derCodesicherheitin Form vonvirtuellen Maschinen.Neuere integrierte, visuelle Entwicklungsumgebungen erfordern deutlich weniger Aufwand an Zeit und Kosten. 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 sogarlookup-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 etabliertenobjektorientierten Programmierungist diemodellgetriebene Architekturein weiterer Ansatz zur Verbesserung derSoftware-Entwicklung,in der Programme aussyntaktischundsemantischformal spezifizierten Modellen generiert werden. Diese Techniken markieren gleichzeitig den Übergang von einer eher handwerklichen, individuellen Kunst zu einem industriell organisierten Prozess.

Sprachgenerationen

Man hat die Maschinen-, Assembler- und höheren Programmiersprachen auch als Sprachen derersten bis dritten Generationbezeichnet; auch in Analogie zu den gleichzeitigen Hardwaregenerationen. Alsvierte Generationwurden verschiedenste Systeme beworben, die mit Programmgeneratoren und Hilfsprogrammen z. B. zur Gestaltung von Bildschirmmasken (screen painter) ausgestattet waren.DieSprache der fünften Generation schließlich sollte in den 1980er Jahren im Sinne desFifth Generation ComputingConcurrent Prologsein.

Programmierparadigmen

Bearbeiten
Paradigmen in Programmiersprachen (Auswahl)
Name funktional imperativ objektorientiert deklarativ logisch nebenläufig
Ada X X X
C X
Prolog X X
Scheme X X (X) X (X)
Haskell X (X) X (X)
Scala X (X) X (X) X

Die Programmiersprachen lassen sich in Kategorien einteilen, die sich im evolutionären Verlauf der Programmiersprachen-Entwicklung als sog.Programmierparadigmengebildet haben. Grundlegend sind die Paradigmen derstrukturierten,derimperativen,derdeklarativenund derobjektorientierten Programmierung– mit jeweils weiteren Unterteilungen. Eine Programmiersprache kann jedoch auch mehreren Paradigmen gehorchen, das heißt die begriffsbestimmenden Merkmale mehrerer Paradigmen unterstützen.

Strukturierte Programmiersprachen

Bearbeiten

Strukturierte Programmierung ist Anfang der 1970er Jahre auch aufgrund derSoftwarekrisepopulär geworden. Es beinhaltet die Zerlegung eines Programms inUnterprogramme(prozedurale Programmierung) und die Beschränkung auf die drei elementarenKontrollstrukturenAnweisungs-Reihenfolge,VerzweigungundWiederholung.

Imperative Programmiersprachen

Bearbeiten

Ein in einerimperativen Programmiersprachegeschriebenes Programm besteht aus Anweisungen (latein.imperare= befehlen), die beschreiben,wiedas Programm seine Ergebnisse erzeugt (zum Beispiel Wenn-dann-Folgen, Schleifen, Multiplikationen etc.).

Deklarative Programmiersprachen

Bearbeiten

Den genau umgekehrten Ansatz verfolgen diedeklarativen Programmiersprachen.Dabei beschreibt der Programmierer, welche Bedingungen die Ausgabe des Programms (dasWas) erfüllen muss. Wie die Ergebnisse konkret erzeugt werden, wird bei derÜbersetzung,zum Beispiel durch einen Interpreter festgelegt. Ein Beispiel ist die DatenbankabfragespracheSQL.

Ein Programm muss nicht unbedingt eine Liste von Anweisungen enthalten. Stattdessen könnengrafische Programmieransätze,zum Beispiel wie bei der in der Automatisierung verwendeten PlattformSTEP 7,benutzt werden.

Die Art der formulierten Bedingungen unterteilen die deklarativen Programmiersprachen inlogische Programmiersprachen,diemathematische Logikbenutzen, undfunktionale Programmiersprachen,die dafürmathematische Funktioneneinsetzen.

Objektorientierte Programmiersprachen

Bearbeiten

Im Gegensatz zur prozeduralen Programmierung, wo zuerst die verarbeitenden Prozeduren im Fokus stehen („Was will ich rechnen? “) und die Daten „irgendwie durchgeschleust “werden, konzentriert sich dieobjektorientierte Programmierungzunächst auf die Daten: „Mit welchen Dingen (der Real-/Außenwelt) soll gearbeitet werden? Welche Attribute/Daten beschreiben diese (→ Objekt-Klassen)? “Erst anschließend wird die Handhabung zu den Objekten entworfen (→ Methoden, „was kann man mit diesem Objekt machen? Was kann dieses Objekt für das Programm machen? “). Die Methoden werden den Daten zugeordnet, und zusammen werden beide in Objekten/Objekt-Klassen zusammengefasst. Objektorientierung verringert dieKomplexitätder entstehenden Programme, macht sie wiederverwendbarer und bildet die Realität meist genauer ab als dies bei rein prozeduraler Programmierung der Fall ist.

Objektorientierung bietet die folgendenParadigmen:[6]

Datenkapselung
Verbergen von Implementierungsdetails: Ein Objekt bietet dem Verwender eine festgelegte Menge an Möglichkeiten (Methoden), es zu ändern, zu beeinflussen, etwas zu berechnen oder Auskünfte zu erhalten. Darüber hinausgehende Hilfsroutinen oder Zustandsspeicher werden verborgen, auf sie kann nicht (direkt) zugegriffen werden.
Vererbung,Spezialisierung und Generalisierung
Vererbung heißt vereinfacht, dass eine abgeleitete Klasse die Methoden und Attribute der Basisklasse ebenfalls besitzt, alsoerbt.Zudem kann sie zusätzliche Attribute und Eigenschaften besitzen und zusätzliche Handlungsmöglichkeiten bieten – eine abgeleitete Klasse ist ein „Spezialfall “der Basisklasse.
Umgekehrt kann gleiche Funktionalität mehrerer Klassen in eine gemeinsame Basisklasse „ausgelagert “werden, wo sie nur noch ein Mal programmiert ist, was Code spart, leichter wartbar ist und ggf. für weitere Spezialklassen wiederverwendbar ist – sie erben einfach von dieser Basisklasse; die Basisklasse beschreibt dasgenerelle Verhaltenaller abgeleiteten (Spezial-)Klassen.
Polymorphie
Ein Objekt einer Spezialklasse kann stets auch als Mitglied der Basisklasse betrachtet werden. Dadurch kann in einer Variable, die ein Objekt der Basisklasse aufnehmen kann, auch ein Objekt einer abgeleiteten Klasse gespeichert werden, denn aufgrund der Vererbung bietet es ja die Methoden und Attribute der Basisklasse.

Typsystem

Bearbeiten

Variablensind 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 einDatentypzugewiesen werden. Häufige Datentypen sind Ganz- undGleitkommazahlenoder auch Zeichenketten.

Es wird zwischen typisierten und typenlosen Sprachen unterschieden. In typisierten Sprachen (zum BeispielC++oderJava) 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,Integeroder Long. Datentypen für Gleitkommazahlen sind zum Beispiel Float oder Double. Einzelne Zeichen können im DatentypChargespeichert werden. FürZeichenkettensteht 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 vonstatischer Typisierung.Findet die Typprüfung zur Laufzeit statt, spricht man vondynamischer Typisierung.Erkennt eine Programmiersprache Typfehler spätestens zur Laufzeit, wird sie alstypsicherbezeichnet.

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 wechseln – etwa wenn Daten vomMassenspeichergelesen 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 ein expliziter Befehl zurUmwandlungnötig.

Die typenlosen Sprachen (zum BeispielJavaScriptoderProlog) 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 einFeldmit 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.

Das sichere Typsystem der Programmiersprache ML bildet die Grundlage für die Korrektheit der in ihr programmiertenBeweissysteme(LCF, HOL,Isabelle); in ähnlicher Weise versucht man jetzt auch die Sicherheit vonBetriebssystemenzu gewährleisten. Schließlich ermöglichen erst unterschiedliche Typangaben das populäreÜberladenvon Bezeichnern. NachStracheysollte das Typsystem im Mittelpunkt der Definition einer Programmiersprache stehen.

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

Oft kann an denBürgern erster Klasse(First class Citizens– FCCs) einer Programmiersprache – also den Formen von Daten, die direkt verwendet werden können, erkannt werden, welchem Paradigma die Sprache gehorcht. In Java z. B. sind Objekte FCCs, inLispist jedes Stück Programm FCCs, inPerlsind es Zeichenketten, Arrays und Hashes. Auch der Aufbau der Daten folgt syntaktischen Regeln. MitVariablenkann man bequem auf die Daten zugreifen und den dualen Charakter von Referenz und Datum einer Variablen ausnutzen. Um die Zeichenketten der Daten mit ihrer (semantischen) Bedeutung nutzen zu können, muss man diese Bedeutung durch die Angabe einesDatentypsangeben. Zumeist besteht im Rahmen desTypsystemsauch die Möglichkeit, neue Typen zu vereinbaren. LISP verwendet als konzeptionelle Hauptstruktur Listen. Auch das Programm ist eine Liste von Befehlen, die andere Listen verändern.Forthverwendet als konzeptionelle HauptstrukturStacksund Stack-Operationen sowie ein zur Laufzeit erweiterbares Wörterbuch von Definitionen und führt in den meisten Implementationen überhaupt keine Typprüfungen durch.

Sonstiges

Bearbeiten

Ein beliebter Einstieg in eine Programmiersprache ist es, mit ihr den TextHello World(oder deutsch „Hallo Welt “) auf den Bildschirm oder einem anderen Ausgabegerät auszugeben (sieheHallo-Welt-Programm). Entsprechend gibt esListen von Hallo-Welt-Programmenund eigene Webseiten,[7]die beispielhafte Implementierungen in verschiedenen Programmiersprachen gegenüberstellen.

Siehe auch

Bearbeiten

Literatur

Bearbeiten
  • Friedrich L. Bauer,Hans Wössner:Algorithmische Sprache und Programmentwicklung.2. verbesserte Auflage. Springer, Berlin u. a. 1984,ISBN 3-540-12962-6.
  • Peter A. Henning, Holger Vogelsang:Handbuch Programmiersprachen. Softwareentwicklung zum Lernen und Nachschlagen.Hanser, München 2007,ISBN 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.
  • Robert Harper:Practical Foundations for Programming Languages.Cambridge Univ. Press, Cambridge 2016,ISBN 978-1-107-15030-0.
  • Peter van Roy, Seif Haridi:Concepts, Techniques, and Models of Computer Programming.MIT Press, Cambridge 2004,ISBN 0-262-22069-5.
  • Michael L. Scott:Programming language pragmatics.2. Auflage. Elsevier, Morgan Kaufmann, Amsterdam 2006,ISBN 0-12-633951-1.
Bearbeiten
Wiktionary: Programmiersprache– Bedeutungserklärungen, Wortherkunft, Synonyme, Übersetzungen
Wikibooks: Programmierung– Lern- und Lehrmaterialien
Commons:Programmiersprachen– Sammlung von Bildern, Videos und Audiodateien
  • 99Bottles of Beer:Ein Programm in hunderten von Programmiersprachen bzw. Dialekten (englisch)

Einzelnachweise

Bearbeiten
  1. ProgrammierspracheDuden,2019; dort wörtlich mit „System von Wörtern und Symbolen, die zur Formulierung von Programmen (4) für die elektronische Datenverarbeitung verwendet werden “; siehe auchDuden Informatik,ISBN 3-411-05232-5
  2. …siehe auchPlattformunabhängigkeit(vor allem auch im Sinne der Herstellerunabhängigkeit bezüglich derRechenwerke) sowieAbstraktion (Informatik)
  3. PYPL
  4. RedMonk
  5. Um 1965 zählte man 1700, vgl.ISWIM.
  6. Peter A. Henning, Holger Vogelsang:Taschenbuch Programmiersprachen.Fachbuchverlag im Carl Hanser Verlag, Leipzig 2007,ISBN 978-3-446-40744-2.
  7. Auflistung von Hello-World-Programmen nach Programmiersprachen