Programmiersprache
A Programmiersprache ist eine Reihe von Regeln, die konvertiert Saiten, oder grafisch Programm Elemente im Fall von visuelle Programmiersprachenzu verschiedenen Arten von Maschinencodeausgabe. Programmiersprachen sind eine Art von Art von Computer Sprache, und werden in verwendet Computerprogrammierung implementieren Algorithmen.
Die meisten Programmiersprachen bestehen aus Anweisungen zum Computers. Es gibt programmierbare Maschinen, die einen Satz von verwenden Spezifische Anweisungen, statt Allgemeine Programmiersprachen. Seit dem frühen 19. Jahrhundert, Programme wurden verwendet, um das Verhalten von Maschinen wie zu lenken, z. Jacquard tobs, Musikboxen und Spieler Klaviere.[1]
Es wurden Tausende verschiedener Programmiersprachen erstellt, und jedes Jahr werden mehr geschaffen. Viele Programmiersprachen sind in einem geschrieben Imperativ Form (d. H. Als Abfolge von Operationen, die ausführen können), während andere Sprachen die verwenden deklarativ Form (d. H. Das gewünschte Ergebnis wird angegeben, nicht wie es zu erreichen ist).
Die Beschreibung einer Programmiersprache wird normalerweise in die beiden Komponenten von unterteilt Syntax (Form) und Semantik (Bedeutung), die normalerweise durch a definiert werden formelle Sprache. Einige Sprachen werden durch ein Spezifikationsdokument definiert (z. B. die C Die Programmiersprache wird durch eine spezifiziert ISO Standard) während andere Sprachen (wie z. Perl) haben eine dominante Implementierung das wird als a behandelt Hinweis. Einige Sprachen haben beide, wobei die grundlegende Sprache, die durch einen Standard definiert ist, und Erweiterungen, die aus der dominierenden Implementierung entnommen wurden.
Programmiersprache Theorie ist ein Unterfeld von Informatik Das befasst sich mit dem Design, der Implementierung, Analyse, Charakterisierung und Klassifizierung von Programmiersprachen.
Definitionen
Eine Programmiersprache ist eine Notation zum Schreiben Programme, die Spezifikationen einer Berechnung sind oder Algorithmus.[2] Einige Autoren beschränken den Begriff "Programmiersprache" auf die Sprachen, die alle möglichen Algorithmen ausdrücken können.[2][3] Zu den Merkmalen, die oft als wichtig angesehen werden, um eine Programmiersprache ausmacht, gehören:
- Funktion und Ziel
- A Computerprogrammiersprache ist ein Sprache verwendet zum Schreiben Computerprogramme, das beinhaltet a Computer eine Art Berechnung durchführen[4] oder Algorithmus und möglicherweise externe Geräte wie z. Drucker, Laufwerke, Roboter,[5] usw. Zum Beispiel, PostScript Programme werden häufig von einem anderen Programm erstellt, um einen Computerdrucker oder Anzeige zu steuern. Allgemeiner kann eine Programmiersprache Berechnungen zu einigen, möglicherweise abstrakten Maschinen beschreiben. Es wird allgemein anerkannt, dass eine vollständige Spezifikation für eine Programmiersprache eine Beschreibung, die möglicherweise idealisiert ist, für eine Maschine oder einen Prozessor für diese Sprache enthält.[6] In den meisten praktischen Kontexten beinhaltet eine Programmiersprache einen Computer. Infolgedessen werden Programmiersprachen normalerweise so definiert und untersucht.[7] Programmiersprachen unterscheiden sich von unterscheiden sich von natürliche Sprachen In diesem Fall werden natürliche Sprachen nur für die Interaktion zwischen Menschen verwendet, während die Programmiersprachen es Menschen auch ermöglichen, Maschinen Anweisungen zu vermitteln.
- Abstraktionen
- Programmiersprachen enthalten normalerweise Abstraktionen zum Definieren und Manipulieren Datenstrukturen oder steuern die Ausführungsfluss. Die praktische Notwendigkeit, dass eine Programmiersprache angemessene Abstraktionen unterstützt, wird von der ausgedrückt Abstraktionsprinzip.[8] Dieses Prinzip wird manchmal als Empfehlung an den Programmierer formuliert, solche Abstraktionen ordnungsgemäß zu nutzen.[9]
- Ausdruckskraft
- Das Theorie der Berechnung Klassifiziert Sprachen nach den Berechnungen, die sie ausdrücken können. Alle Turing-Complete Sprachen können den gleichen Satz von implementieren Algorithmen. ANSI/ISO SQL-92 Und Wohltätigkeitsorganisationen sind Beispiele für Sprachen, die nicht vollständig sind, aber häufig als Programmiersprachen bezeichnet werden.[10][11]
Markup -Sprachen wie Xml, Html, oder TROFF, was definieren Strukturierte Datenwerden normalerweise nicht als Programmiersprachen angesehen.[12][13][14] Programmiersprachen können jedoch die Syntax mit Markup -Sprachen teilen, wenn eine Computersemantik definiert ist. XsltZum Beispiel ist a Turing vollständig Sprache vollständig mit XML -Syntax.[15][16][17] Darüber hinaus, Latex, die hauptsächlich zum Strukturieren von Dokumenten verwendet wird, enthält auch eine vollständige vollständige Untergruppe.[18][19]
Der Begriff Computer Sprache wird manchmal austauschbar mit der Programmiersprache verwendet.[20] Die Verwendung beider Begriffe variiert jedoch zwischen den Autoren, einschließlich des genauen Umfangs. Eine Verwendung beschreibt Programmiersprachen als Teilmenge von Computersprachen.[21] In ähnlicher Weise sind Sprachen, die im Computer verwendet werden, das ein anderes Ziel als das Ausdrücken von Computerprogrammen aufweist, allgemein benannte Computersprachen. Beispielsweise werden Markup -Sprachen manchmal als Computersprachen bezeichnet, um zu betonen, dass sie nicht für die Programmierung verwendet werden sollen.[22]
Eine weitere Verwendung betrachtet die Programmiersprachen als theoretische Konstrukte für die Programmierung Abstrakte Maschinenund Computersprachen als Teilmenge davon, die auf physischen Computern ausführt, die endliche Hardware -Ressourcen haben.[23] John C. Reynolds betont das Formale Spezifikation Sprachen sind genauso viele Programmiersprachen wie die Sprachen, die für die Ausführung bestimmt sind. Er argumentiert auch, dass textliche und sogar grafische Eingabeformate, die das Verhalten eines Computers beeinflussen, Programmiersprachen sind, obwohl sie üblicherweise nicht abgeschlossen sind, und bemerkt, dass die Unkenntnis der Programmiersprachenkonzepte für viele Mängel in Eingabebildaten der Grund ist.[24]
Geschichte
Frühe Entwicklungen
Sehr frühe Computer, wie z. Koloss, wurden ohne Hilfe von a programmiert gespeichertes Programmdurch Ändern ihrer Schaltkreise oder durch Einstellen von Banken physischer Steuerelemente.
Etwas später konnten Programme geschrieben werden Maschinensprache, wo der Programmierer jede Anweisung in numerischer Form schreibt, kann die Hardware direkt ausführen. Beispielsweise kann der Befehl zum Hinzufügen des Wertes an zwei Speicherorten aus 3 Zahlen bestehen: einem "Opcode", der den Vorgang "Hinzufügen" und zwei Speicherorte auswählt. Die Programme in Dezimal- oder Binärform wurden aus gelesen geschlagene Karten, Papier Klebeband, Magnetband oder umschaltete Schalter an der Frontblende des Computers. Maschinensprachen wurden später bezeichnet Programmiersprachen der ersten Generation (1gl).
Der nächste Schritt war die Entwicklung der sogenannten Programmiersprachen der zweiten Generation (2gl) oder Assemblersprachen, die immer noch eng mit dem verbunden waren Anweisungsset Architektur des spezifischen Computers. Diese dienten dazu, das Programm viel menschlicher lesbarer zu machen und den Programmierer von mühsamen und fehleranfälligen Adressberechnungen zu entlasten.
Der Erste hochrangige Programmiersprachen, oder Programmiersprachen der dritten Generation (3gl) wurden in den 1950er Jahren geschrieben. Eine frühe Programmiersprache auf hoher Ebene, die für einen Computer ausgelegt werden sollte, war Plankalkülfür Deutsch entwickelt Z3 durch Konrad Zuse Zwischen 1943 und 1945 wurde es jedoch erst 1998 und 2000 umgesetzt.[25]
John Mauchly's Kurzer Code, vorgeschlagen 1949, war eine der ersten hochrangigen Sprachen, die jemals für eine entwickelt wurden elektronischer Computer.[26] nicht wie Maschinensprache, Kurze Code -Anweisungen repräsentierten mathematische Ausdrücke in verständlicher Form. Das Programm musste jedoch jedes Mal, wenn es lief, in den Maschinencode übersetzt werden, was den Vorgang viel langsamer machte, als den äquivalenten Maschinencode auszuführen.
Bei der Universität von Manchester, Alick Glennie aufgetreten Autocode In den frühen 1950er Jahren. Als ein Programmiersprache, es wurde a verwendet Compiler Um die Sprache automatisch in den Maschinencode umzuwandeln. Der erste Code und Compiler wurde 1952 für die entwickelt Markus 1 Computer an der Universität von Manchester und gilt als der erste zusammengestellt Programmiersprache auf hoher Ebene.[27][28]
Der zweite Autocode wurde für die Marke 1 von entwickelt R. A. Brooker 1954 und wurde "Mark 1 Autocode" genannt. Brooker entwickelte auch einen Autocode für die Ferranti Quecksilber In den 1950er Jahren in Verbindung mit der University of Manchester. Die Version für die EDSAC 2 wurde von D. F. Hartley von Mathematische Labor der Universität von Cambridge 1961 als Edsac 2 AutoCode bekannt, war es eine gerade Entwicklung aus Mercury Autocode, die für lokale Umstände angepasst war, und wurde für seine Objektcodeoptimierung und Quellsprachdiagnostik festgestellt, die für die Zeit vorgezogen wurden. Ein zeitgenössischer, aber getrennter Entwicklungsfaden, Atlas Autocode wurde für die Universität von Manchester entwickelt Atlas 1 Maschine.
Im Jahr 1954, Forran wurde bei IBM von erfunden John Backus. Es war das erste weit verbreitete hochrangige Programmiersprache Allzweckes Programmiersprache eine funktionale Implementierung im Gegensatz zu einem Design auf Papier haben.[29][30] Es ist immer noch eine beliebte Sprache für High Performance Computing[31] und wird für Programme verwendet, die die Welt bewerten und die Welt bewerten schnellste Supercomputer.[32]
Eine weitere frühe Programmiersprache wurde von entwickelt von Grace Hopper in den USA, gerufen Fließen matisch. Es wurde für die entwickelt Univac i bei Remington Rand In diesem Zeitraum von 1955 bis 1959 stellte Hopper fest, dass die Kunden der Geschäftsdaten mit mathematischer Notation unangenehm waren, und Anfang 1955 schrieben sie und ihr Team eine Spezifikation für eine Englisch Programmiersprache und implementierte einen Prototyp.[33] Der Flow-Matic-Compiler wurde Anfang 1958 öffentlich verfügbar und wurde 1959 im Wesentlichen abgeschlossen.[34] Flow-Matic war ein großer Einfluss auf die Gestaltung von Cobolda nur es und sein direkter Nachkomme Aimaco wurden damals tatsächlich verwendet.[35]
Raffinesse
Die verstärkte Verwendung von Sprachen auf hoher Ebene führte eine Voraussetzung für Programmiersprachen mit niedriger Ebene oder Systemprogrammiersprachen. Diese Sprachen bieten in unterschiedlichem Maße Einrichtungen zwischen Montagesprachen und hochrangigen Sprachen. Sie können verwendet werden, um Aufgaben auszuführen, die einen direkten Zugriff auf Hardwareeinrichtungen erfordern, aber dennoch Steuerungsstrukturen und Fehlerprüfungen über höhere Ebenen bieten.
Die Zeit der 1960er bis Ende der 1970er Jahre brachte die Entwicklung der wichtigsten Sprachparadigmen, die jetzt verwendet wurden:
- Apl eingeführt Array -Programmierung und beeinflusst Funktionelle Programmierung.[36]
- Algol beide raffiniert Strukturierte prozedurale Programmierung und die Disziplin von Sprachspezifikation; Der "überarbeitete Bericht über die algorithmische Sprache Algol 60"wurde zu einem Modell für die Schreibung der Sprachspezifikationen.
- Lispeln, implementiert 1958, war der erste dynamisch getippte Funktionelle Programmierung Sprache.
- In den 1960ern, Simula war die erste Sprache, die unterstützt wurde, um sie zu unterstützen Objekt orientierte Programmierung; Mitte der 1970er Jahre, Smalltalk gefolgt mit der ersten "rein" objektorientierten Sprache.
- C wurde zwischen 1969 und 1973 als Systemprogrammiersprache für die entwickelt Unix Betriebssystem und bleibt beliebt.[37]
- Prolog1972 entworfen war das erste Logikprogrammierung Sprache.
- 1978,, Ml baute ein polymorphes Typsystem auf LispelnPionierarbeit statisch typisiert Funktionelle Programmierung Sprachen.
Jede dieser Sprachen brachte Nachkommen hervor, und die meisten modernen Programmiersprachen zählen mindestens einen von ihnen in ihrer Abstammung.
In den 1960er und 1970er Jahren diskutierte auch erhebliche Debatten über die Verdienste von Strukturierte Programmierungund ob Programmiersprachen so gestaltet werden sollten, dass sie es unterstützen.[38] Edsger Dijkstra, in einem berühmten Brief von 1968 in der veröffentlicht Kommunikation der ACM, argumentierte das Gehe zu Aussagen sollten aus allen Programmiersprachen "höherer Ebene" beseitigt werden.[39]
Konsolidierung und Wachstum
Die 1980er Jahre waren Jahre relativer Konsolidierung. C ++ Kombinierte objektorientierte und Systemprogrammierung. Die Regierung der Vereinigten Staaten standardisiert standardisiert Ada, eine Systemprogrammiersprache, die abgeleitet ist aus Pascal und für den Einsatz durch Verteidigungsunternehmer vorgesehen. In Japan und anderswo wurden große Summen damit verbracht, die sogenannten Untersuchungen zu untersuchen Sprachen der fünften Generation Das umfasste logische Programmierkonstrukte.[40] Die Community der funktionalen Sprachen bewegte sich auf Standardisierung Ml und Lisp. Anstatt neue Paradigmen zu erfinden, wurden all diese Bewegungen auf die in den vergangenen Jahrzehnten erfundenen Ideen ausgearbeitet.
Ein wichtiger Trend im Sprachdesign für die Programmierung von großen Systemen in den 1980er Jahren war ein verstärkter Fokus auf die Verwendung von Module oder groß angelegte Organisationseinheiten von Code. Modula-2, ADA und ML haben in den 1980er Jahren alle bemerkenswerten Modulsysteme entwickelt, die oft miteinander verbunden waren generische Programmierung Konstrukte.[41]
Das schnelle Wachstum der Internet Mitte der neunziger Jahre schuf Möglichkeiten für neue Sprachen. Perl, ursprünglich ein Unix -Skriptwerkzeug, das 1987 erstmals veröffentlicht wurde, wurde in der Dynamik gemeinsam Websites. Java wurde für die serverseitige Programmierung verwendet, und Bytecode Virtual Machines wurden in kommerziellen Umgebungen mit ihrem Versprechen von "wieder populär"Schreiben Sie einmal, rennen Sie irgendwohin"(UCSD Pascal war in den frühen 1980er Jahren eine Zeit lang beliebt gewesen. Diese Entwicklungen waren nicht grundsätzlich neu; Sie waren vielmehr Verfeinerungen vieler vorhandener Sprachen und Paradigmen (obwohl ihre Syntax häufig auf der C -Familie der Programmiersprachen basierte).
Die Programmiersprache Evolution wird sowohl in Industrie als auch in der Forschung fortgesetzt. Die aktuellen Anweisungen umfassen Sicherheit und Zuverlässigkeitsüberprüfung, neue Arten von Modularität (Mischungen, Delegierte, Aspekte) und Datenbankintegration wie Microsoft's Linq.
Programmiersprachen der vierten Generation (4GL) sind Computerprogrammiersprachen, die darauf abzielen, eine höhere Abstraktion der internen Computerhardwaredetails als 3GLS zu bieten. Programmiersprachen der fünften Generation (5GL) sind Programmiersprachen basierend auf der Lösung von Problemen unter Verwendung des Programms, anstatt eine zu verwenden, anstatt eine Algorithmus Geschrieben von einem Programmierer.
Elemente
Alle Programmiersprachen haben einige Primitive Bausteine für die Beschreibung der Daten und der darauf angewendeten Prozesse oder Transformationen (wie die Zugabe von zwei Zahlen oder der Auswahl eines Elements aus einer Sammlung). Diese Primitiven werden durch syntaktische und semantische Regeln definiert, die ihre Struktur und Bedeutung beschreiben.
Syntax
Die Oberflächenform einer Programmiersprache ist als ihre bekannt Syntax. Die meisten Programmiersprachen sind rein textuell; Sie verwenden Textsequenzen, einschließlich Wörter, Zahlen und Interpunktion, ähnlich wie geschriebene natürliche Sprachen. Andererseits gibt es einige Programmiersprachen, die mehr sind grafisch In der Natur visuelle Beziehungen zwischen Symbolen zur Angabe eines Programms.
Die Syntax einer Sprache beschreibt die möglichen Kombinationen von Symbolen, die ein syntaktisch korrektes Programm bilden. Die Bedeutung einer Kombination von Symbolen wird von Semantik behandelt (entweder formell oder hart codiert in a Referenzimplementierung). Da die meisten Sprachen textuell sind, wird in diesem Artikel Textsyntax erörtert.
Die Programmiersprache -Syntax wird normalerweise unter Verwendung einer Kombination von definiert Reguläre Ausdrücke (zum lexikalisch Struktur) und Backus -Naur -Form (zum grammatikalisch Struktur). Unten ist eine einfache Grammatik, basierend auf Lispeln:
Ausdruck :: = Atom | Listen Sie Atom auf :: = Nummer | Symbolnummer :: = [+-]? ['0'-'9']+ Symbol :: = ['A'-'z''a'-'z'].* Liste :: = '(' Ausdruck* ')'
Diese Grammatik gibt Folgendes an:
- ein Ausdruck ist entweder an Atom oder ein aufführen;
- ein Atom ist entweder a Nummer oder ein Symbol;
- a Nummer ist eine ungebrochene Sequenz einer oder mehrerer Dezimalstellen, die optional ein Plus- oder Minuszeichen vorausgeht;
- a Symbol ist ein Brief, gefolgt von null oder mehr von Zeichen (ohne Whitespace); und
- a aufführen ist ein übereinstimmendes Paar Klammern mit null oder mehr Ausdrücke im Inneren.
Die folgenden Beispiele für gut geformte Token-Sequenzen in dieser Grammatik: 12345
, ()
und (A B C232 (1))
.
Nicht alle syntaktisch korrekten Programme sind semantisch korrekt. Viele syntaktisch korrekte Programme werden nach den Regeln der Sprache dennoch schlecht geformt. und kann (abhängig von der Sprachspezifikation und der Klang der Implementierung) zu einem Fehler bei der Übersetzung oder Ausführung führen. In einigen Fällen können solche Programme ausstellen undefiniertes Verhalten. Selbst wenn ein Programm in einer Sprache gut definiert ist, kann es immer noch eine Bedeutung haben, die von der Person, die es geschrieben hat, nicht beabsichtigt ist.
Verwendung Natürliche Sprache Beispielsweise ist es möglicherweise nicht möglich, einem grammatikalisch korrekten Satz eine Bedeutung zuzuweisen, oder der Satz kann falsch sein:
- "Farblose grüne ideen schlafen wütend. "ist grammatikalisch gut geformt, hat aber keine allgemein akzeptierte Bedeutung.
- "John ist ein verheirateter Junggeselle." ist grammatikalisch gut geformt drückt aber eine Bedeutung aus, die nicht wahr sein kann.
Folgende C Sprache Fragment ist syntaktisch korrekt, führt jedoch Operationen durch, die nicht semantisch definiert sind (die Operation *p >> 4
hat keine Bedeutung für einen Wert mit einem komplexen Typ und p-> im
ist nicht definiert, weil der Wert von p
ist der Null Zeiger):
Komplex *p = NULL; Komplex ABS_P = sqrt(*p >> 4 + p->ich bin);
Wenn die Typdeklaration In der ersten Zeile wurde das Programm ausgelassen, und würde einen Fehler in der undefinierten Variablen auslösen p
Während der Zusammenstellung. Das Programm wäre jedoch weiterhin syntaktisch korrekt, da Typdeklarationen nur semantische Informationen liefern.
Die Grammatik, die zum Angeben einer Programmiersprache erforderlich ist Chomsky -Hierarchie. Die Syntax der meisten Programmiersprachen kann unter Verwendung einer Typ-2-Grammatik angegeben werden, d. H. Sie sind es Kontextfreie Grammatiken.[42] Einige Sprachen, einschließlich Perl und Lisp, enthalten Konstrukte, die die Ausführung während der Parsingphase ermöglichen. Sprachen mit Konstrukten, mit denen der Programmierer das Verhalten des Parsers verändern kann unentschlossenes Problemund im Allgemeinen die Unterscheidung zwischen Parsen und Ausführung verwischen.[43] Im Kontrast zu Lisps Makrosystem und Perl's START
Blöcke, die allgemeine Berechnungen enthalten können, C -Makros sind lediglich Zeichenfolge und erfordern keine Codeausführung.[44]
Semantik
Der Begriff Semantik bezieht sich auf die Bedeutung von Sprachen im Gegensatz zu ihrer Form (Syntax).
Statische Semantik
Die statische Semantik definiert Einschränkungen für die Struktur gültiger Texte, die in Standardsyntaktikformalismen schwer oder unmöglich ausdrücken sind.[2] Für kompilierte Sprachen enthalten statische Semantik im Wesentlichen die semantischen Regeln, die zur Kompilierungszeit überprüft werden können. Beispiele sind die Überprüfung dessen, dass jeder Kennung wird deklariert, bevor es verwendet wird (in Sprachen, die solche Erklärungen erfordern) oder die Etiketten auf den Armen von a Fallerklärung sind unterschiedlich.[45] Viele wichtige Einschränkungen dieses Typs, z. B. Überprüfung, ob Kennungen im entsprechenden Kontext verwendet werden (z. B. keine Ganzzahl zu einem Funktionsnamen hinzuzufügen) oder das Subroutine Anrufe haben die entsprechende Anzahl und Art von Argumenten, können durchgesetzt werden, indem sie als Regeln in a definiert werden Logik genannt Typ System. Andere Formen von Statische Analysen wie Datenflussanalyse kann auch Teil der statischen Semantik sein. Neuere Programmiersprachen mögen Java und C# haben Bestimmte Zuordnungsanalyse, eine Form der Datenflussanalyse als Teil ihrer statischen Semantik.
Dynamic semantics
Sobald Daten angegeben wurden, muss die Maschine angewiesen werden, Vorgänge für die Daten auszuführen. Zum Beispiel kann die Semantik die definieren Strategie durch welche Ausdrücke auf Werte oder die Art und Weise bewertet werden, in der Kontrollstrukturen bedingt ausführen Aussagen. Das Dynamische Semantik (auch bekannt als Ausführungssemantik) einer Sprache definiert, wie und wann die verschiedenen Konstrukte einer Sprache ein Programmverhalten erzeugen sollten. Es gibt viele Möglichkeiten zur Definition der Ausführungssemantik. Die natürliche Sprache wird häufig verwendet, um die Ausführungssemantik von in der Praxis üblicherweise verwendeten Sprachen anzugeben. Eine erhebliche Menge an akademischer Forschung ging in die Formale Semantik von Programmiersprachen, die es ermöglichen, die Ausführungssemantik formell anzugeben. Die Ergebnisse dieses Forschungsbereichs wurden nur begrenzt auf das Design und die Implementierung von Programmiersprache außerhalb der Wissenschaft angewendet.
Typ System
Ein Typsystem definiert, wie eine Programmiersprache Werte und Ausdrücke klassifiziert Typen, wie es diese Typen manipulieren kann und wie sie interagieren. Das Ziel eines Typsystems ist es, in Programmen, die in dieser Sprache geschrieben wurden, zu überprüfen und normalerweise durch Erkennen bestimmter falscher Operationen durchzusetzen. Irgendein entschlossen Typsystem beinhaltet einen Kompromiss: Während es viele falsche Programme ablehnt, kann es auch einige korrekte, wenn auch ungewöhnliche Programme verbieten. Um diesen Nachteil zu umgehen, haben einige Sprachen Geben Sie Lücken ein, normalerweise ungeprüft Abgüsse Dies kann vom Programmierer verwendet werden, um explizit einen normalerweise abgelehnten Betrieb zwischen verschiedenen Typen zuzulassen. In den meisten typisierten Sprachen wird das Typsystem nur verwendet Geben Sie Check ein Programme, aber eine Reihe von Sprachen, normalerweise funktionale, Abschlusstypen, Linderung des Programmierers von der Notwendigkeit, Typ Anmerkungen zu schreiben. Das formale Design und die Untersuchung von Typsystemen ist bekannt als Typentheorie.
Typed versus untyped Sprachen
Eine Sprache ist tippt Wenn die Spezifikation jedes Vorgangs Arten von Daten definiert, für die der Betrieb anwendbar ist.[46] Zum Beispiel die Daten dargestellt von "Dieser Text zwischen den Zitaten"
ist ein Saiteund in vielen Programmiersprachen, die eine Zahl durch eine Zeichenfolge teilen, hat keine Bedeutung und wird nicht ausgeführt. Der ungültige Vorgang kann festgestellt werden, wenn das Programm zusammengestellt wird ("statische" Typprüfung) und vom Compiler mit einer Kompilierungsfehlermeldung abgelehnt oder während des Ausführens des Programms ("dynamische" Typ -Überprüfung) erkannt werden kann in einer Laufzeit Ausnahme. Viele Sprachen ermöglichen eine Funktion, die als Ausnahmebehandler bezeichnet wird, um diese Ausnahme zu behandeln und beispielsweise immer "-1" als Ergebnis zurückzugeben.
Ein Sonderfall typisierter Sprachen sind die Einzeltyp Sprachen. Dies sind oft Skript- oder Markupsprachen, wie z. Rexx oder SGML, und haben nur einen Datentyp[zweifelhaft ]–— Am häufigsten Charakterzeichenfolgen, die sowohl für symbolische als auch für numerische Daten verwendet werden.
Dagegen eine Untyped Sprache, wie die meisten Assemblersprachen, ermöglicht es, dass jeder Vorgang an Daten ausgeführt wird, im Allgemeinen Sequenzen von Bits unterschiedlicher Länge.[46] Auf hohen Sprachen auf hohen Sprachen gehören BCPL, Tcl, und einige Sorten von Weiter.
In der Praxis, während nur wenige Sprachen als getippt angesehen werden, die aus dem getippt werden Typentheorie (Überprüfung oder Ablehnung aller Operationen) Die meisten modernen Sprachen bieten ein gewisses Maß an Typisierung.[46] Viele Produktionssprachen bieten Mittel zur Umgehung oder Untergrabung des Typsystems und der Handelstypsicherheit für die feinere Kontrolle über die Ausführung des Programms (siehe Casting).
Statische versus dynamische Typisierung
Im statische TypisierungIn allen Ausdrücken werden ihre Typen vor dem Programm ermittelt, wenn das Programm in der Regel zur Kompilierungszeit ausgeführt wird. Zum Beispiel sind 1 und (2+2) ganzzahlige Ausdrücke; Sie können nicht an eine Funktion übergeben werden, die eine Zeichenfolge erwartet oder in einer Variablen gespeichert wird, die definiert ist, um Daten zu halten.[46]
Statisch getippte Sprachen können entweder sein offensichtlich tippt oder Typeingänger. Im ersten Fall muss der Programmierer explizit Typen an bestimmten Textpositionen schreiben (z. B. bei Variable Erklärungen). Im zweiten Fall der Compiler Hervorragend Die Arten von Ausdrücken und Erklärungen, die auf dem Kontext basieren. Die meisten Mainstream -typisierten Sprachen, wie z. C ++, C# und Java, werden offensichtlich tippt. Vollständige Typinferenz wurde traditionell mit weniger Mainstream -Sprachen in Verbindung gebracht, wie z. Haskell und Ml. Viele offensichtlich typisierte Sprachen unterstützen jedoch die Inferenz des Teils. zum Beispiel, C ++, Java und C# Alle Abschlusstypen in bestimmten begrenzten Fällen.[47] Darüber hinaus ermöglichen einige Programmiersprachen, dass einige Typen automatisch in andere Typen konvertiert werden. Zum Beispiel kann ein INT verwendet werden, wenn das Programm einen Float erwartet.
Dynamisches Typing, auch genannt latente Typisierungbestimmt die Art der Operationen zum Laufzeit; Mit anderen Worten, Typen sind miteinander verbunden mit Laufzeitwerte statt Textausdrücke.[46] Wie bei den vom Typ anfertigen Sprachen dynamisch getippten Sprachen müssen der Programmierer nicht explizite Typanmerkungen zu Ausdrücken schreiben. Dies kann unter anderem es einer einzelnen Variablen ermöglichen, auf Werte verschiedener Typen an verschiedenen Stellen in der Programmausführung zu verweisen. Typ jedoch Fehler kann nicht automatisch erkannt werden, bis ein Code -Stück tatsächlich ausgeführt wird, was möglicherweise erstellt wird Debuggen schwieriger. Lispeln, Smalltalk, Perl, Python, JavaScript, und Rubin sind alle Beispiele für dynamisch typisierte Sprachen.
Schwaches und starkes Typisieren
Schwache Typisierung Ermöglicht einen Wert eines Typs als einen anderen, beispielsweise als Behandlung a Saite als eine Zahl.[46] Dies kann gelegentlich nützlich sein, aber es kann auch einige Arten von Programmfehlern ermöglichen Zeit kompilieren und sogar bei Laufzeit.
Starke Typisierung verhindert diese Programmfehler. Ein Versuch, eine Operation mit der falschen Werteart durchzuführen, erhöht einen Fehler.[46] Stark typisierte Sprachen werden oft bezeichnet Typ-Safe oder sicher.
Eine alternative Definition für "schwach typisiert" bezieht sich auf Sprachen wie z. Perl und JavaScript, die eine große Anzahl impliziter Typkonvertierungen ermöglichen. In JavaScript zum Beispiel der Ausdruck 2 * x
implizit konvertiert x
zu einer Zahl, und dieser Umbau gelingt auch wenn x
ist Null
, nicht definiert
, ein Array
, oder eine Reihe von Buchstaben. Solche implizite Conversions sind oft nützlich, können jedoch Programmierfehler maskieren.Stark und statisch werden jetzt allgemein als orthogonale Konzepte angesehen, aber die Verwendung in der Literatur unterscheidet sich. Einige verwenden den Begriff stark tippt meinen stark, statisch getipptoder noch verwirrender, einfach einfach zu bedeuten statisch typisiert. Daher C wurde sowohl stark getippt als auch schwach, statisch getippt.[48][49]
Es mag einigen professionellen Programmierern seltsam erscheinen, dass C "schwach, statisch getippt" werden könnte. Beachten Sie jedoch, dass die Verwendung des generischen Zeigers die Leere* Zeiger, ermöglicht das Gießen von Zeigern auf andere Zeiger, ohne eine explizite Besetzung durchführen zu müssen. Dies ist sehr ähnlich wie bei einem Auswahl einer Reihe von Bytes in C in C, ohne eine explizite Besetzung zu verwenden, wie z. (int)
oder (verkohlen)
.
Standardbibliothek und Laufzeitsystem
Die meisten Programmiersprachen haben einen zugehörigen Kern Bibliothek (Manchmal als "Standardbibliothek" bezeichnet, insbesondere wenn sie als Teil des veröffentlichten Sprachstandards enthalten ist), das herkömmlich von allen Implementierungen der Sprache zur Verfügung gestellt wird. Kernbibliotheken enthalten typischerweise Definitionen für häufig verwendete Algorithmen, Datenstrukturen und Mechanismen für Eingabe und Ausgabe.
Die Grenze zwischen einer Sprache und ihrer Kernbibliothek unterscheidet sich von Sprache zu Sprache. In einigen Fällen können die Sprachdesigner die Bibliothek als separate Einheit von der Sprache behandeln. Die Kernbibliothek einer Sprache wird jedoch häufig von ihren Benutzern als Teil der Sprache behandelt, und einige Sprachspezifikationen erfordern sogar, dass diese Bibliothek in allen Implementierungen zur Verfügung gestellt wird. In der Tat sind einige Sprachen so konzipiert, dass die Bedeutungen bestimmter syntaktischer Konstrukte nicht einmal beschrieben werden können, ohne sich auf die Kernbibliothek zu beziehen. Zum Beispiel in Java, ein Streichliteral wird als Instanz der definiert Java.lang.String
Klasse; In ähnlicher Weise in Smalltalk, ein Anonyme Funktion Ausdruck (ein "Block") konstruiert eine Instanz der Bibliothek BlockContext
Klasse. Umgekehrt, Planen Enthält mehrere kohärente Teilmengen, die ausreichen, um den Rest der Sprache als Bibliotheksmakros zu konstruieren, und so die Sprachdesigner haben sich nicht einmal die Mühe machen zu sagen, welche Teile der Sprache als Sprachkonstrukte implementiert werden müssen und welche als Teile einer Bibliothek implementiert werden müssen .
Design und Implementierung
Programmiersprachen teilen Eigenschaften mit natürlichen Sprachen im Zusammenhang mit ihrem Zweck als Kommunikationsfahrzeuge, mit einer syntaktischen Form getrennt von seiner Semantik und zeigen Sprachfamilien von verwandten Sprachen, die einen von einem anderen verzweigen.[50][51] Aber als künstliche Konstrukte unterscheiden sie sich auch in grundlegender Weise von Sprachen, die sich durch die Verwendung entwickelt haben. Ein signifikanter Unterschied besteht darin, dass eine Programmiersprache vollständig beschrieben und in ihrer Gesamtheit untersucht werden kann, da sie eine präzise und endliche Definition aufweist.[52] Im Gegensatz, natürliche Sprachen Veränderte Bedeutungen ihrer Benutzer in verschiedenen Gemeinschaften. Während konstruierte Sprachen sind auch künstliche Sprachen, die von Grund auf mit einem bestimmten Zweck konzipiert sind. Sie fehlen die genaue und vollständige semantische Definition, die eine Programmiersprache hat.
Viele Programmiersprachen wurden von Grund auf neu gestaltet, geändert, um neue Bedürfnisse zu erfüllen, und kombiniert mit anderen Sprachen. Viele sind schließlich nicht ausgebraucht. Obwohl es Versuche gegeben hat, eine "universelle" Programmiersprache zu entwerfen, die allen Zwecken dient, haben sie alle allgemein als Ausfüllen dieser Rolle akzeptiert.[53] Die Notwendigkeit verschiedener Programmiersprachen ergibt sich aus der Vielfalt der Kontexte, in denen Sprachen verwendet werden:
- Die Programme reichen von winzigen Skripten von einzelnen Hobbyisten bis hin zu riesigen Systemen von Hunderten von Programmierer.
- Die Programmierer reichen in Expertise von Anfängern, die vor allem Einfachheit benötigen, zu Experten, die sich möglicherweise mit erheblicher Komplexität wohl fühlen.
- Programme müssen Geschwindigkeit, Größe und Einfachheit auf Systemen ausbalancieren, die von Mikrocontroller zu Supercomputer.
- Programme können einmal geschrieben werden und sich seit Generationen nicht ändern, oder sie können kontinuierlich geändert werden.
- Programmierer können sich einfach in ihrem Geschmack unterscheiden: Sie können es gewohnt sein, Probleme zu diskutieren und sie in einer bestimmten Sprache auszudrücken.
Ein häufiger Trend bei der Entwicklung von Programmiersprachen bestand darin, mehr Fähigkeit zur Lösung von Problemen mithilfe eines höheren Niveaus von hinzuzufügen Abstraktion. Die frühesten Programmiersprachen waren sehr eng mit der zugrunde liegenden Hardware des Computers verbunden. Da sich neue Programmiersprachen entwickelt haben, wurden Funktionen hinzugefügt, mit denen Programmierer Ideen ausdrücken können, die von einfacher Übersetzung in die zugrunde liegenden Hardwareanweisungen entfernt werden. Da Programmierer weniger an die Komplexität des Computers gebunden sind, können ihre Programme mit weniger Aufwand vom Programmierer berechnen. Auf diese Weise können sie mehr Funktionen pro Zeiteinheit schreiben.[54]
Programmierung natürlicher Sprache wurde vorgeschlagen, um die Notwendigkeit einer speziellen Sprache für die Programmierung zu beseitigen. Dieses Ziel bleibt jedoch fern und seine Vorteile sind für Debatten offen. Edsger W. Dijkstra nahm die Position ein, dass die Verwendung einer formalen Sprache unerlässlich ist, um die Einführung bedeutungsloser Konstrukte zu verhindern, und entlassen Programmierung natürlicher Sprache als "dumm".[55] Alan Perlis war die Idee ähnlich abgelehnt.[56] Hybride Ansätze wurden verfolgt in Englisch strukturiert und Sql.
Die Designer und Benutzer einer Sprache müssen eine Reihe von Artefakten konstruieren, die die Programmierung der Programmierung regeln und ermöglichen. Das wichtigste dieser Artefakte sind die Sprache Spezifikation und Implementierung.
Spezifikation
Die Spezifikation einer Programmiersprache ist ein Artefakt, das die Sprache Benutzer und die Implementierer kann sich einig sein, ob ein Stück von Quellcode ist gültig Programm in dieser Sprache und wenn ja, wie sein Verhalten sein soll.
Eine Programmiersprachenspezifikation kann verschiedene Formen annehmen, einschließlich der folgenden:
- Eine explizite Definition der Syntax, statischen Semantik und Ausführungssemantik der Sprache. Während die Syntax häufig unter Verwendung einer formalen Grammatik festgelegt ist, können semantische Definitionen in geschrieben Natürliche Sprache (z. B. wie in der C Sprache), oder ein formelle Semantik (z. B. wie in Standard ml[57] und Planen[58] Spezifikationen).
- Eine Beschreibung des Verhaltens von a Übersetzer für die Sprache (z. B. die, die C ++ und Forran Spezifikationen). Die Syntax und Semantik der Sprache müssen aus dieser Beschreibung abgeleitet werden, die in natürlicher oder formaler Sprache geschrieben werden kann.
- A Hinweis oder Modell Implementierung, manchmal geschrieben in der angegebenen Sprache geschrieben (z.B., Prolog oder Ansi Rexx[59]). Die Syntax und Semantik der Sprache sind im Verhalten der Referenzimplementierung explizit.
Implementierung
Ein Implementierung Eine Programmiersprache bietet eine Möglichkeit, Programme in diese Sprache zu schreiben und sie in einer oder mehreren Konfigurationen von Hardware und Software auszuführen. Im Großen und Ganzen gibt es zwei Ansätze zur Implementierung der Programmiersprache: Zusammenstellung und Deutung. Es ist im Allgemeinen möglich, eine Sprache mit beiden Techniken zu implementieren.
Die Ausgabe von a Compiler Kann von Hardware oder einem Programm namens Interpreter ausgeführt werden. In einigen Implementierungen, die den Interpreter -Ansatz nutzen, gibt es keine unterschiedliche Grenze zwischen Kompilieren und Interpretation. Zum Beispiel einige Implementierungen von BASIC Kompilieren Sie die Quelle jeweils eine Zeile.
Programme, die direkt auf der Hardware ausgeführt werden, werden normalerweise viel schneller ausgeführt als die in Software interpretierten.[60]
Eine Technik zur Verbesserung der Leistung interpretierter Programme ist Just-in-Time-Zusammenstellung. Hier die virtuelle Maschinekurz vor der Ausführung übersetzt die Blöcke von Bytecode mit der Code für die direkte Ausführung der Hardware verwendet wird.
Proprietäre Sprachen
Obwohl die meisten der am häufigsten verwendeten Programmiersprachen vollständig offene Spezifikationen und Implementierungen haben, existieren viele Programmiersprachen nur als proprietäre Programmiersprachen, wobei die Implementierung nur von einem einzelnen Anbieter verfügbar ist, was behaupten könnte, dass eine solche proprietäre Sprache ihr geistiges Eigentum ist. Proprietäre Programmiersprachen sind häufig Domänenspezifische Sprachen oder intern Skriptsprachen für ein einzelnes Produkt; Einige proprietäre Sprachen werden nur intern innerhalb eines Anbieters verwendet, während andere externe Benutzer zur Verfügung stehen.
Es gibt einige Programmiersprachen an der Grenze zwischen proprietär und offen; zum Beispiel, Oracle Corporation Behauptet die Eigentumsrechte an einigen Aspekten der Java -Programmiersprache,[61] und Microsoft's C# Programmiersprache mit offener Implementierungen der meisten Teile des Systems hat ebenfalls hat Gemeinsame Sprachlaufzeit (CLR) als geschlossene Umgebung.[62]
Viele proprietäre Sprachen werden trotz ihrer Eigentumsbewohnerin weit verbreitet; Beispiele beinhalten Matlab, Vbscript, und Wolfram Sprache. Einige Sprachen können den Übergang von geschlossen zu offen machen; zum Beispiel, Erlang war ursprünglich die interne Programmiersprache eines Ericsson.[63]
Verwenden
Tausende verschiedene Programmiersprachen wurden erstellt, hauptsächlich im Computerfeld.[64] Einzelne Softwareprojekte verwenden normalerweise fünf Programmiersprachen oder mehr.[65]
Programmiersprachen unterscheiden sich von den meisten anderen Formen des menschlichen Ausdrucks, da sie einen größeren Grad an Präzision und Vollständigkeit erfordern. Wenn Sie eine natürliche Sprache verwenden, um mit anderen Menschen zu kommunizieren, können menschliche Autoren und Sprecher mehrdeutig sein und kleine Fehler machen und immer noch erwarten, dass ihre Absicht verstanden wird. Im übertragenen Sinne machen Computer jedoch "genau das, was ihnen gesagt wird" und können nicht verstehen, welchen Code der Programmierer schreiben wollte. Die Kombination der Sprachdefinition, eines Programms und der Eingaben des Programms muss das externe Verhalten, das beim Ausführen des Programms im Rahmen dieses Programms ausgeführt wird, vollständig angeben. Auf der anderen Seite können Ideen zu einem Algorithmus ohne die für die Ausführung erforderliche Präzision mitgeteilt werden Pseudocode, die natürliche Sprache mit Code in einer Programmiersprache verschachtelt.
Eine Programmiersprache bietet einen strukturierten Mechanismus zum Definieren von Datenstücken und den Vorgängen oder Transformationen, die automatisch für diese Daten durchgeführt werden können. EIN Programmierer verwendet die Abstraktionen in der Sprache vorhanden, um die Konzepte zu repräsentieren, die an einer Berechnung beteiligt sind. Diese Konzepte werden als Sammlung der einfachsten verfügbaren Elemente dargestellt (genannt Primitive).[66] Programmierung ist der Prozess, mit dem Programmierer diese Primitiven zum Zusammenstellen neuer Programme oder vorhandenen an neue Verwendungszwecke oder eine sich ändernde Umgebung kombinieren.
Programme für einen Computer könnten sein hingerichtet in einem Batch -Prozess ohne menschliche Interaktion oder ein Benutzer kann eingeben Befehle in einem (n interaktive Sitzung von einem Dolmetscher. In diesem Fall sind die "Befehle" einfach Programme, deren Ausführung miteinander verkettet wird. Wenn eine Sprache ihre Befehle über einen Dolmetscher ausführen kann (wie z. Unix Shell oder andere Befehlszeilenschnittstelle), ohne zusammenzustellen, es wird a genannt Skriptsprache.[67]
Messung der Sprachgebrauch
Die Bestimmung der am häufigsten verwendeten Programmiersprache ist schwierig, da die Verwendungsdefinition je nach Kontext variiert. Eine Sprache kann die größere Anzahl von Programmierstunden einnehmen, eine andere hat mehr Codezeilen und eine dritte kann die meiste CPU -Zeit verbrauchen. Einige Sprachen sind für bestimmte Arten von Anwendungen sehr beliebt. Zum Beispiel, Cobol ist im Unternehmensdatenzentrum immer noch stark, oft groß Mainframes;[68][69] Forran in wissenschaftlichen und technischen Anwendungen; Ada in der Luft- und Raumfahrt, Transport-, Militär-, Echtzeit- und eingebettete Anwendungen; und C in eingebetteten Anwendungen und Betriebssystemen. Andere Sprachen werden regelmäßig verwendet, um viele verschiedene Arten von Anwendungen zu schreiben.
Es wurden verschiedene Methoden zur Messung der Sprachpopularität, die jeweils eine andere Verzerrung gegenüber dem gemessenen Messen unterliegen, vorgeschlagen:
- Zählen Sie die Anzahl der Stellenanzeigen, die die Sprache erwähnen[70]
- Die Anzahl der verkauften Bücher, die die Sprache lehren oder beschreiben[71]
- Schätzungen der Anzahl der vorhandenen Codezeilen, die in der Sprache geschrieben wurden - was möglicherweise Sprachen unterschätzen kann[72]
- Zählungen von Sprachreferenzen (d. H. Zum Namen der Sprache), die mithilfe einer Web -Suchmaschine gefunden wurden.
Stackify.com kombinierte und gemittelte Informationen von verschiedenen Internet -Websites und berichtete über die zehn beliebtesten Programmiersprachen (in absteigender Reihenfolge nach allgemeiner Beliebtheit): Java, C, C ++, Python, C#, JavaScript, Vb .net, R, Php, und Matlab.[73]
Dialekte, Aromen und Implementierungen
A Dialekt einer Programmiersprache oder a Datenaustauschsprache ist eine (relativ kleine) Variation oder Erweiterung der Sprache, die ihre intrinsische Natur nicht ändert. Mit Sprachen wie z. Planen und Weiter, Standards können von Implementoren als unzureichend, unzureichend oder unrechtmäßig angesehen werden, sodass sie oft vom Standard abweichen, was eine neue macht Dialekt. In anderen Fällen wird ein Dialekt zur Verwendung in a erstellt Domänenspezifische Sprache, oft eine Untergruppe. In dem Lispeln Welt, die meisten Sprachen, die Basic verwenden S-Expression Syntax und Lisp-ähnliche Semantik werden als Lisp-Dialekte angesehen, obwohl sie sehr unterschiedlich sind, wie dies beispielsweise, Schläger und Clojure. Da es für eine Sprache üblich ist, mehrere Dialekte zu haben, kann es für einen unerfahrenen Programmierer ziemlich schwierig werden, die richtige Dokumentation zu finden. Das Grundlegende Programmiersprache hat viele Dialekte.
Die Explosion von Forth -Dialekten führte zu dem Sprichwort: "Wenn Sie einen weiter gesehen haben ... Sie haben gesehen eines Fort. "
Taxonomien
Es gibt kein übergeordnetes Klassifizierungsschema für Programmiersprachen. Eine bestimmte Programmiersprache hat normalerweise keine einzige Vorfahren. Es entstehen häufig Sprachen, indem die Elemente mehrerer Vorgängersprachen mit neuen Ideen kombiniert werden, die zu dieser Zeit im Umlauf sind. Ideen, die in einer Sprache stammen, werden in einer Familie verwandter Sprachen diffundieren und dann plötzlich durch familiäre Lücken springen, um in einer völlig anderen Familie zu erscheinen.
Die Aufgabe wird durch die Tatsache, dass Sprachen entlang mehrerer Achsen klassifiziert werden können. Zum Beispiel ist Java sowohl eine objektorientierte Sprache (weil sie eine objektorientierte Organisation fördert) als auch eine gleichzeitige Sprache (da sie integrierte Konstrukte für das Ausführen von Mehrfachläufen enthält Themen parallel zu). Python ist ein objektorientiertes Skriptsprache.
In breiten Strichen teilen sich die Programmiersprachen in Programmierparadigmen und eine Klassifizierung von beabsichtigte Gebrauchsdomäne, mit allgemeine Programmiersprachen unterscheidet sich von Domänenspezifische Programmiersprachen. Traditionell wurden Programmiersprachen als die Beschreibung der Berechnung in Bezug auf imperative Sätze, d. H. Die Ausgabe von Befehlen, angesehen. Diese werden allgemein genannt Imperative Programmierung Sprachen. Viele Forschungsarbeiten in Programmiersprachen zielen darauf ab, die Unterscheidung zwischen einem Programm als Anweisungen und einem Programm als Behauptung über die gewünschte Antwort zu verwischen, was das Hauptmerkmal von ist deklarative Programmierung.[74] Zu den raffinierten Paradigmen gehören Verfahrensprogrammierung, Objekt orientierte Programmierung, Funktionelle Programmierung, und Logikprogrammierung; Einige Sprachen sind Hybriden von Paradigmen oder Multi-Paradigmatik. Ein Montagesprache ist nicht so sehr ein Paradigma als direktes Modell einer zugrunde liegenden Maschinenarchitektur. Nach Absicht können Programmiersprachen als allgemeiner Zweck angesehen werden. Systemprogrammiersprachen, Skriptsprachen, domänenspezifische Sprachen oder gleichzeitige/verteilte Sprachen (oder eine Kombination davon).[75] Einige allgemeine Sprachen wurden hauptsächlich mit Bildungszielen konzipiert.[76]
Eine Programmiersprache kann auch durch Faktoren klassifiziert werden, die nicht mit dem Programmierparadigma zusammenhängen. Zum Beispiel verwenden die meisten Programmiersprachen Englische Sprache Schlüsselwörter, während Eine Minderheit nicht. Andere Sprachen können als Sein eingestuft werden absichtlich esoterisch oder nicht.
Siehe auch
- Comparison of programming languages (basic instructions)
- Vergleich der Programmiersprachen
- Computerprogrammierung
- Informatik und Umriss der Informatik
- Domänenspezifische Sprache
- Domänenspezifische Modellierung
- Bildungsprogrammiersprache
- Esoterische Programmiersprache
- Erweiterbare Programmierung
- Kategorie: Erweiterbare Syntax -Programmiersprachen
- Invariante basierte Programmierung
- Liste der grundlegenden Dialekte
- Listen der Programmiersprachen
- Liste der Programmiersprachenforscher
- Programmiersprachen, die auf den beliebtesten Websites verwendet werden
- Sprachorientierte Programmierung
- Logikprogrammierung
- Lemerkörperprogrammierung
- Metaprogrammierung
- Modellierungssprache
- Programmiersprache Theorie
- Pseudocode
- Rebol § Dialekte
- Betrachtung
- Wissenschaftliche Programmiersprache
- Skriptsprache
- Softwareentwicklung und Liste der Software -Engineering -Themen
Verweise
- ^ Ettinger, James (2004) Jacquards Web, Oxford University Press
- ^ a b c Aaby, Anthony (2004). Einführung in Programmiersprachen. Archiviert von das Original am 8. November 2012. Abgerufen 29. September 2012.
- ^ In mathematischer Hinsicht bedeutet dies, dass die Programmiersprache ist Turing-Complete MacLennan, Bruce J. (1987). Prinzipien der Programmiersprachen. Oxford University Press. p. 1. ISBN 978-0-19-511306-8.
- ^ ACM Sigplan (2003). "Statuten der Spezialinteressengruppe für Programmiersprachen des Vereins für Computermaschinen". Archiviert Aus dem Original am 22. Juni 2006., "Der Umfang von Sigplan ist die Theorie, das Design, die Implementierung, die Beschreibung und die Anwendung von Computerprogrammiersprachen - Sprachen, die die Spezifikation einer Vielzahl verschiedener Berechnungen ermöglichen und dem Benutzer erhebliche Kontrolle (unmittelbar oder verzögert) über den Computer bieten Betrieb."
- ^ Dean, Tom (2002). "Programmierroboter". Bau intelligente Roboter. Brown University Department of Computer Science. Archiviert vom Original am 29. Oktober 2006.
- ^ R. Narasimahan, Programmiersprachen und Computer: Eine einheitliche Metatheorie, S. 189—247 in Franz Alt, Morris Rubinoff (Hrsg.) Fortschritte in Computern, Band 8, Academic Press, 1994, ISBN0-12-012108-5, S.193: "Eine vollständige Spezifikation einer Programmiersprache muss per Definition eine Spezifikation eines Prozessors enthalten-idealisiert, wenn Sie so wollen-für diese Sprache." [Die Quelle zitiert viele Verweise, um diese Aussage zu unterstützen]
- ^ Ben Ari, Mordechai (1996). Programmiersprachen verstehen. John Wiley und Söhne.
Programme und Sprachen können als rein formale mathematische Objekte definiert werden. Mehr Menschen interessieren sich jedoch für Programme als an anderen mathematischen Objekten wie Gruppen, genau weil es möglich ist, das Programm - die Abfolge der Symbole - zu verwenden, um die Ausführung eines Computers zu steuern. Wir empfehlen zwar die Untersuchung der Programmtheorie, aber dieser Text beschränkt sich im Allgemeinen auf das Studium von Programmen, die auf einem Computer ausgeführt werden.
- ^ David A. Schmidt, Die Struktur typisierter Programmiersprachen, MIT Press, 1994, ISBN0-262-19349-3, p. 32
- ^ Pierce, Benjamin (2002). Typen und Programmiersprachen. MIT Press. p.339. ISBN 978-0-262-16209-8.
- ^ Digital Equipment Corporation. "Informationstechnologie - Datenbanksprache SQL (vorgeschlagener überarbeiteter Text von Dis 9075)". ISO/IEC 9075: 1992, Datenbanksprache SQL. Archiviert Aus dem Original am 21. Juni 2006. Abgerufen 29. Juni 2006.
- ^ Die Charity Development Group (Dezember 1996). "Die Charity Homepage". Archiviert Aus dem Original am 18. Juli 2006."Charity ist eine kategorische Programmiersprache ...", "Alle Wohltätigkeitsberechnungen enden."
- ^ XML in 10 Punkten Archiviert 6. September 2009 bei der Wayback -Maschine W3c, 1999, "XML ist keine Programmiersprache."
- ^ Powell, Thomas (2003). HTML & XHTML: Die vollständige Referenz. McGraw-Hill. p. 25. ISBN 978-0-07-222942-4.
HTML ist keine Programmiersprache.
- ^ Deiche, Lucinda; Tittel, Ed (2005). XML für Dummies (4. Aufl.). Wiley. p.20. ISBN 978-0-7645-8845-7.
... Es ist eine Markup -Sprache, keine Programmiersprache.
- ^ "Welche Art von Sprache ist XSLT?". Ibm.com. 20. April 2005. Archiviert Aus dem Original am 11. Mai 2011.
- ^ "XSLT ist eine Programmiersprache". Msdn.microsoft.com. Archiviert Aus dem Original am 3. Februar 2011. Abgerufen 3. Dezember 2010.
- ^ Scott, Michael (2006). Programmiersprache Pragmatik. Morgan Kaufmann. p.802. ISBN 978-0-12-633951-2.
XSLT ist zwar hochspezialisiert auf die Transformation von XML, aber eine turbetonische Programmiersprache.
- ^ Oetiker, Tobias; Partl, Hubert; Hyna, Irene; Schlegl, Elisabeth (20. Juni 2016). "Die nicht so kurze Einführung in Latex 2ε" (Version 5.06). tobi.oetiker.ch. S. 1–157. Archiviert (PDF) Aus dem Original am 14. März 2017.
- ^ Syropoulos, Apostolos; Antonis Tsolomitis; Nick Sofroniou (2003). Digitale Typografie mit Latex. Springer-Verlag. p.213. ISBN 978-0-387-95217-8.
Tex ist nicht nur eine hervorragende Artensetzung, sondern auch eine echte Programmiersprache.
- ^ Robert A. Edmunds, The Prentice-Hall Standard Glossar der Computerterminologie, Prentice-Hall, 1985, p. 91
- ^ Pascal Lando, Anne Lapujade, Gilles Kassel und Frédéric fürst, Auf dem Weg zu einer allgemeinen Ontologie von Computerprogrammen Archiviert 7. Juli 2015 bei der Wayback -Maschine, ICSOft 2007 Archiviert 27. April 2010 bei der Wayback -Maschine, S. 163–170
- ^ S.K. Bajpai, Einführung in Computer- und C -Programmierung, New Age International, 2007, ISBN81-224-1379-X, p. 346
- ^ R. Narasimahan, Programmiersprachen und Computer: Eine einheitliche Metatheorie, S. 189—247 in Franz Alt, Morris Rubinoff (Hrsg.) Fortschritte in Computern, Band 8, Academic Press, 1994, ISBN0-12-012108-5, S.215: "[...] Das Modell [...] für Computersprachen unterscheidet sind nur endlich viele Namen - oder Register -, die nur endlich viele Werte - oder Staaten - annehmen können, und diese Zustände werden in Bezug auf andere Attribute nicht weiter unterschieden. Erreichen. Zum Beispiel würde es bedeuten, dass jedes Modell für Programmiersprachen, indem bestimmte Parameter oder Merkmale festgelegt werden, auf natürliche Weise auf ein Modell für Computersprachen reduzierbar sein sollte. "
- ^ John C. Reynolds, "Einige Gedanken zum Unterrichten von Programmier- und Programmiersprachen", Sigplan Mitteilungen, Band 43, Ausgabe 11, November 2008, S. 109
- ^ Rojas, Raúlet al. (2000). "Plankalkül: Die erste Programmiersprache auf hoher Ebene und ihre Implementierung". Institut für Informatik, Freie Universität Berlin, Technischer Bericht B-3/2000. (voller Text) Archiviert 18. Oktober 2014 bei der Wayback -Maschine
- ^ Sebesta, W.S -Konzepte von Programmiersprachen. 2006; M6 14:18 S.44. ISBN0-321-33025-0
- ^ Knuth, Donald E.; Pardo, Luis Trabb. "Frühe Entwicklung von Programmiersprachen". Enzyklopädie der Informatik und Technologie. 7: 419–493.
- ^ Peter J. Bentley (2012). Digitalisiert: Die Wissenschaft der Computer und wie sie unsere Welt formt. Oxford University Press. p. 87. ISBN 9780199693795. Archiviert vom Original am 29. August 2016.
- ^ "Der Forran -Schöpfer John Backus stirbt - Tech und Gadgets". NBC News. 20. März 2007. Abgerufen 25. April 2010.
- ^ "CSC-302 99S: Klasse 02: Eine kurze Geschichte der Programmiersprachen". Math.grin.edu. Archiviert Aus dem Original am 15. Juli 2010. Abgerufen 25. April 2010.
- ^ Eugene Loh (18. Juni 2010). "Die ideale HPC -Programmiersprache". Warteschlange. 8 (6). Archiviert Aus dem Original am 4. März 2016.
- ^ "HPL-Eine tragbare Implementierung des leistungsstarken Linpack-Benchmarks für verteilte Computer-Computer". Archiviert Aus dem Original am 15. Februar 2015. Abgerufen 21. Februar 2015.
- ^ Hopper (1978) p. 16.
- ^ Sammet (1969) p. 316
- ^ Sammet (1978) p. 204.
- ^ Richard L. Wexelblat: Geschichte der Programmiersprachen, Academic Press, 1981, Kapitel XIV.
- ^ François LaBle. "Programmiersprache Nutzungsdiagramm". SourceForge. Archiviert Aus dem Original am 17. Juni 2006. Abgerufen 21. Juni 2006.. Dieser Vergleich analysiert Trends in der Anzahl der Projekte, die von einem beliebten Community -Programmierrepository veranstaltet werden. In den meisten Jahren des Vergleichs führt C mit einem beträchtlichen Rand; Im Jahr 2006 überholt Java C, aber die Kombination von C/C ++ führt immer noch erheblich.
- ^ Hayes, Brian (2006). "Die Semikolonkriege". Amerikanischer Wissenschaftler. 94 (4): 299–303. doi:10.1511/2006.60.299.
- ^ Dijkstra, Edsger W. (März 1968). "Gehen Sie zu einer schädlichen Aussage" (PDF). Kommunikation der ACM. 11 (3): 147–148. doi:10.1145/362929.362947. S2CID 17469809. Archiviert (PDF) vom Original am 13. Mai 2014.
- ^ Tetsuro Fujise, Takashi Chikayama, Kazuaki Rokusawa, Akihiko Nakase (Dezember 1994). "KLIC: Eine tragbare Implementierung von KL1" Proc. von FGCS '94, ICOT Tokio, Dezember 1994. "Archivierte Kopie". Archiviert von das Original am 25. September 2006. Abgerufen 9. Oktober 2006.
{{}}
: CS1 Wartung: Archiviertes Kopie als Titel (Link) KLIC ist eine tragbare Implementierung einer gleichzeitigen Logikprogrammiersprache KL1. - ^ Jim Bender (15. März 2004). "Mini-Bibliographie über Module für funktionale Programmiersprachen". Readscheme.org. Archiviert Aus dem Original am 24. September 2006.
- ^ Michael Sipser (1996). Introduction to the Theory of Computation. PWS Publishing. ISBN 978-0-534-94728-6. Abschnitt 2.2: Pushdown -Automaten, S. 101–114.
- ^ Jeffrey Kegler, "Perl und Unentschlossenheit Archiviert 17. August 2009 bei der Wayback -Maschine",", Die Perl -Bewertung. Die Papiere 2 und 3 beweisen, jeweils eingesetzt Reis Satz und direkte Reduzierung der Problem stoppen, dass die Parsen von Perl -Programmen im Allgemeinen unentscheidbar ist.
- ^ Marty Hall, 1995, Vorlesungsnotizen: Makros Archiviert 6. August 2013 bei der Wayback -Maschine, PostScript Ausführung Archiviert 17. August 2000 bei der Wayback -Maschine
- ^ Michael Lee Scott, Programmiersprache Pragmatik, Edition 2, Morgan Kaufmann, 2006, ISBN0-12-633951-1, p. 18–19
- ^ a b c d e f g Andrew Cooke. "Einführung in Computersprachen". Archiviert Aus dem Original am 15. August 2012. Abgerufen 13. Juli 2012.
- ^ Insbesondere Instantiationen von generisch Typen werden für bestimmte Ausdrucksformen abgeleitet. Typinferenz in generischer Java - die Forschungssprache, die die Grundlage für die begrenzten Java 1.5 bildete parametrischer Polymorphismus Erweiterungen - wird in zwei informellen Manuskripten aus der Post -Mailing -Liste erörtert: Generisches Java -Typ -Inferenz ist unangemessen Archiviert 29. Januar 2007 bei der Wayback -Maschine (Alan Jeffrey, 17. Dezember 2001) und Sound generischer Java -Typ -Inferenz Archiviert 29. Januar 2007 bei der Wayback -Maschine (Martin Odensky, 15. Januar 2002). Das Typ -System von C#ähnelt Java und verwendet ein ähnliches Teil -Inferenzschema für Teiltyp.
- ^ "Überarbeiteter Bericht über das algorithmische Sprachschema".20. Februar 1998. Archiviert Aus dem Original am 14. Juli 2006.
- ^ Luca Cardelli und Peter Wegner. "Über das Verständnis von Typen, Datenabstraktion und Polymorphismus". Manuskript (1985). Archiviert Aus dem Original am 19. Juni 2006.
- ^ Steven R. Fischer, Eine Sprachgeschichte, Wiederholungsbücher, 2003, ISBN1-86189-080-X, p. 205
- ^ Éric Lévénez (2011). "Computersprachen Geschichte". Archiviert Aus dem Original am 7. Januar 2006.
- ^ Jing Huang. "Künstliche Sprache vs. natürliche Sprache". Archiviert Aus dem Original am 3. September 2009.
- ^ IBM im ersten Veröffentlichung PL/I zum Beispiel ziemlich ehrgeizig mit dem Handbuch mit dem Titel "Handbuch" Die universelle Programmiersprache pl/i (IBM Library; 1966). Der Titel spiegelte die Ziele von IBM für die unbegrenzte Subetting -Fähigkeit wider: "PL/I ist so konzipiert, dass man Teilmengen, die die Anforderungen bestimmter Anwendungen erfüllen, isolieren kann." ( "Pl/i" ". Enzyklopädie der Mathematik. Archiviert Aus dem Original am 26. April 2012. Abgerufen 29. Juni 2006.). Ada und Uncol hatte ähnliche frühe Ziele.
- ^ Frederick P. Brooks, jr.:: Der mythische Mannmonatsmonat, Addison-Wesley, 1982, S. 93–94
- ^ Dijkstra, Edsger W. Über die Dummheit der "Programmierung natürlicher Sprache". Archiviert 20. Januar 2008 bei der Wayback -Maschine EWD667.
- ^ Perlis, Alan (September 1982). "Epigramme zum Programmieren". Sigplan Notices Vol. 17, Nr. 9. S. 7–13. Archiviert Aus dem Original am 17. Januar 1999.
- ^ Milner, R.; M. Toftte; R. Harper; D. MacQueen (1997). Die Definition von Standard ML (überarbeitet). MIT Press. ISBN 978-0-262-63181-5.
- ^ Kelsey, Richard; William Cler; Jonathan Rees (Februar 1998). "Abschnitt 7.2 Formale Semantik". Überarbeitet5 Bericht über das algorithmische Sprachschema. Archiviert Aus dem Original am 6. Juli 2006.
- ^ Ansi -Programmiersprache Rexx, x3-274.1996
- ^ Steve, McConnell (2004). Code vollständig (Zweite Ausgabe). Redmond, Washington. pp.590, 600. ISBN 0735619670. OCLC 54974573.
- ^ Sehen: Oracle America, Inc. gegen Google, Inc.
- ^ "Leitfaden für Programmiersprachen | computerscience.org". Computerscience.org. Abgerufen 13. Mai 2018.
- ^ "Die Grundlagen". ibm.com. 10. Mai 2011. Abgerufen 13. Mai 2018.
- ^ "HOPL: Eine interaktive Liste von Programmiersprachen". Australien: Murdoch Universität. Archiviert von das Original am 20. Februar 2011. Abgerufen 1. Juni 2009.
Diese Website listet 8512 Sprachen auf.
- ^ Mayer, Philip; Bauer, Alexander (2015). "Eine empirische Analyse der Verwendung mehrerer Programmiersprachen in Open -Source -Projekten". Verfahren der 19. Internationalen Konferenz über Bewertung und Bewertung in der Software -Engineering. Proceedings der 19. Internationalen Konferenz über Bewertung und Bewertung in Software Engineering - Eventual '15. New York, NY, USA: ACM. S. 4: 1–4: 10. doi:10.1145/2745802.2745805. ISBN 978-1-4503-3350-4.
Ergebnisse: Wir fanden (a) eine mittlere Anzahl von 5 Sprachen pro Projekt mit einer eindeutig dominanten Hauptsprache der Allgemeinen und 5 häufig verwendeten DSL-Typen, (b) einen signifikanten Einfluss der Größe, der Anzahl der Commits und der Hauptsprache über die Anzahl der Sprachen sowie keinen signifikanten Einfluss des Alters und der Anzahl der Mitwirkenden sowie (c) drei Sprachökosysteme, die um XML, Shell/Make und HTML/CSS gruppiert sind. Schlussfolgerungen: Multisprachige Programmierung scheint bei Open-Source-Projekten häufig zu sein und ist ein Faktor, der bei der Instrumentierung und bei der Bewertung der Entwicklung und Wartung solcher Softwaresysteme behandelt werden muss.
- ^ Abelson, Sussman und Sussman. "Struktur und Interpretation von Computerprogrammen". Archiviert von das Original am 26. Februar 2009. Abgerufen 3. März 2009.
{{}}
: Cs1 montiert: Mehrfachnamen: Autorenliste (Link) - ^ Brown Vicki (1999). "Skriptsprachen". mactech.com. Archiviert Aus dem Original am 2. Dezember 2017.
- ^ Georgina Swan (21. September 2009). "Cobol wird 50". Computerworld.com.au. Archiviert Aus dem Original am 19. Oktober 2013. Abgerufen 19. Oktober 2013.
- ^ Ed Airey (3. Mai 2012). "7 Mythen von Cobol entlarvt". Entwickler.com. Archiviert Aus dem Original am 19. Oktober 2013. Abgerufen 19. Oktober 2013.
- ^ Nicholas enticknap. "SSL/Computer Weekly IT -Gehaltsumfrage: Finanzboom fährt IT -Beschäftigungswachstum". Computer wöchentlich. Archiviert Aus dem Original am 26. Oktober 2011. Abgerufen 14. Juni 2013.
- ^ "Programmiersprachen nach Buchverkauf zählen". Radar.orilly.com. 2. August 2006. archiviert von das Original am 17. Mai 2008.
- ^ Bieman, J. M.; Murdock, V., Code im World Wide Web finden: Eine vorläufige Untersuchung, Proceedings First IEEE International Workshop zur Quellcodeanalyse und -manipulation, 2001
- ^ "Beliebteste und einflussreichste Programmiersprachen von 2018". stackify.com. 18. Dezember 2017. Abgerufen 29. August 2018.
- ^ Carl A. Gunter, Semantik der Programmiersprachen: Strukturen und Techniken, MIT Press, 1992, ISBN0-262-57095-5, p. 1
- ^ "Melodien: Programmiersprachen". Archiviert Aus dem Original am 20. Oktober 2007.
- ^ Wirth, Niklaus (1993). "Erinnerungen an die Entwicklung von Pascal". Die zweite ACM-Sigplan-Konferenz über die Geschichte der Programmiersprachen-HOPL-II. Proc. 2. ACM -Sigplan -Konferenz über die Geschichte der Programmiersprachen. Vol. 28. S. 333–342. Citeseerx 10.1.1.475.6989. doi:10.1145/154766.155378. ISBN 978-0-89791-570-0. S2CID 9783524.
Weitere Lektüre
- Abelson, Harold; Sussman, Gerald Jay (1996). Struktur und Interpretation von Computerprogrammen (2. Aufl.). MIT Press. Archiviert von das Original am 9. März 2018.
- Raphael Finkel: Erweiterte Programmiersprache Design, Addison Wesley 1995.
- Daniel P. Friedman, Mitchell Zauberstab, Christopher T. Haynes: Grundlagen von Programmiersprachen, The MIT Press 2001.
- Maurizio Gabbrielli und Simone Martini: "Programmiersprachen: Prinzipien und Paradigmen", Springer, 2010.
- David Gelernter, Suresh Jagannathan: Programmierlinguistik, Die MIT -Presse 1990.
- Ellis Horowitz (ed.): Programmiersprachen, eine große Tour (3. Aufl.), 1987.
- Ellis Horowitz: Grundlagen von Programmiersprachen, 1989.
- Shriram Krishnamurthi: Programmiersprachen: Anwendung und Interpretation, Online -Veröffentlichung.
- Bruce J. MacLennan: Prinzipien der Programmiersprachen: Design, Bewertung und Implementierung, Oxford University Press 1999.
- John C. Mitchell: Konzepte in Programmiersprachen, Cambridge University Press 2002.
- Benjamin C. Pierce: Typen und Programmiersprachen, The MIT Press 2002.
- Terrence W. Pratt und Marvin Victor Zelkowitz: Programmiersprachen: Design und Implementierung (4. Aufl.), Prentice Hall 2000.
- Peter H. Salus. Handbuch der Programmiersprachen (4 Bände.). Macmillan 1998.
- Ravi Sethi: Programmiersprachen: Konzepte und Konstrukte, 2. Aufl., Addison-Wesley 1996.
- Michael L. Scott: Programmiersprache Pragmatik, Morgan Kaufmann Publishers 2005.
- Robert W. Sebesta: Konzepte von Programmiersprachen, 9. Aufl., Addison Wesley 2009.
- Franklyn Turbak und David Gifford mit Mark Sheldon: Designkonzepte in Programmiersprachen, The MIT Press 2009.
- Peter Van Roy und Seif Haridi. Konzepte, Techniken und Modelle der Computerprogrammierung, The MIT Press 2004.
- David A. Watt. Programmiersprachenkonzepte und Paradigmen. Prentice Hall 1990.
- David A. Watt und Muffy Thomas. Programmiersprache Syntax und Semantik. Prentice Hall 1991.
- David A. Watt. Programmiersprachprozessoren. Prentice Hall 1993.
- David A. Watt. Programmiersprache Designkonzepte. John Wiley & Sons 2004.