Programmiersprache

Eine Programmiersprache ist eine künstliche Sprache, die entworfen ist, um Instruktionen einer Maschine, besonders einem Computer mitzuteilen. Programmiersprachen können verwendet werden, um Programme zu schaffen, die das Verhalten einer Maschine kontrollieren und/oder Algorithmen genau auszudrücken.

Die frühsten Programmiersprachen datieren die Erfindung des Computers zurück und wurden verwendet, um das Verhalten von Maschinen wie Webstühle von Jacquard und Spieler-Klavier zu leiten. Tausende von verschiedenen Programmiersprachen, sind hauptsächlich im Computerfeld, mit noch vielen geschaffen worden, jedes Jahr geschaffen werden. Die meisten Programmiersprachen beschreiben Berechnung in einem befehlenden Stil, d. h. als eine Folge von Befehlen, obwohl einige Sprachen, wie diejenigen, die funktionelle Programmierung oder Logikprogrammierung unterstützen, alternative Formen der Beschreibung verwenden.

Die Beschreibung einer Programmiersprache wird gewöhnlich in die zwei Bestandteile der Syntax (Form) und Semantik (Bedeutung) gespalten. Einige Sprachen werden durch ein Spezifizierungsdokument definiert (zum Beispiel, die C Programmiersprache wird durch einen ISO Standard angegeben), während andere Sprachen, wie Perl 5 und früher, eine dominierende Durchführung haben, die als eine Verweisung verwendet wird.

Definitionen

Eine Programmiersprache ist eine Notation, um Programme zu schreiben, die Spezifizierungen einer Berechnung oder Algorithmus sind. Einige, aber nicht alle, Autoren schränken den Begriff "Programmiersprache" auf jene Sprachen ein, die alle möglichen Algorithmen ausdrücken können. Charakterzüge haben häufig als wichtig dafür betrachtet, was eine Programmiersprache einsetzt, schließen Sie ein:

  • Funktion und Ziel: Eine Computerprogrammiersprache ist eine Sprache, die verwendet ist, um Computerprogramme zu schreiben, die einen Computer einschließen, der eine Art Berechnung oder Algorithmus durchführt, und vielleicht Außengeräte wie Drucker, Laufwerke, Roboter und so weiter kontrollieren. Zum Beispiel werden Programme von PostScript oft durch ein anderes Programm geschaffen, um einen Computerdrucker oder Anzeige zu kontrollieren. Mehr allgemein kann eine Programmiersprache Berechnung auf einigen, vielleicht Auszug, Maschine beschreiben. Es wird allgemein akzeptiert, dass eine ganze Spezifizierung für eine Programmiersprache eine Beschreibung, vielleicht idealisiert, einer Maschine oder Verarbeiters für diese Sprache einschließt. In den meisten praktischen Zusammenhängen schließt eine Programmiersprache einen Computer ein; folglich Programmiersprachen werden gewöhnlich definiert und haben diesen Weg studiert. Programmiersprachen unterscheiden sich von natürlichen Sprachen darin natürliche Sprachen werden nur für die Wechselwirkung zwischen Leuten verwendet, während Programmiersprachen auch Menschen erlauben, Instruktionen Maschinen mitzuteilen.
  • Abstraktionen: Programmiersprachen enthalten gewöhnlich Abstraktionen, um Datenstrukturen zu definieren und zu manipulieren oder den Fluss der Ausführung zu kontrollieren. Die praktische Notwendigkeit, dass eine Programmiersprache-Unterstützung entsprechende Abstraktionen durch den Abstraktionsgrundsatz ausgedrückt wird; dieser Grundsatz wird manchmal als Empfehlung dem Programmierer formuliert, richtigen Gebrauch solcher Abstraktionen zu machen.
  • Ausdrucksvolle Macht: Die Theorie der Berechnung klassifiziert Sprachen durch die Berechnung sie sind zum Ausdrücken fähig. Der ganze Turing ganze Sprachen kann denselben Satz von Algorithmen durchführen. ANSI/ISO SQL und Wohltätigkeit sind Beispiele von Sprachen, die nicht Turing abgeschlossen, noch häufig genannt Programmiersprachen sind.

Preiserhöhungssprachen wie XML, HTML oder troff, die strukturierte Daten definieren, werden als Programmiersprachen nicht allgemein betrachtet. Programmiersprachen können jedoch die Syntax mit Preiserhöhungssprachen teilen, wenn eine rechenbetonte Semantik definiert wird. XSLT ist zum Beispiel abgeschlossener XML Dialekt von Turing. Außerdem enthält LATEX, der größtenteils verwendet wird, um Dokumente zu strukturieren, auch Turing ganze Teilmenge.

Die Begriff-Computersprache wird manchmal austauschbar mit der Programmiersprache verwendet. Jedoch ändert sich der Gebrauch von beiden Begriffen unter Autoren, einschließlich des genauen Spielraums von jedem. Ein Gebrauch beschreibt Programmiersprachen als eine Teilmenge von Computersprachen. In dieser Ader haben Sprachen in der Computerwissenschaft verwendet, die eine verschiedene Absicht haben, als das Ausdrücken von Computerprogrammen allgemein benannte Computersprachen ist. Zum Beispiel werden Preiserhöhungssprachen manchmal Computersprachen genannt, um zu betonen, dass sie nicht gemeint werden, um für die Programmierung verwendet zu werden. Ein anderer Gebrauch betrachtet Programmiersprachen als theoretische Konstruktionen, um abstrakte Maschinen und Computersprachen als die Teilmenge davon zu programmieren, der auf physischen Computern läuft, die begrenzte Hardware-Mittel haben. John C. Reynolds betont, dass formelle Spezifizierungssprachen genauso viel Programmiersprachen sind, wie die für die Ausführung beabsichtigten Sprachen sind. Er behauptet auch, dass textliche und sogar grafische Eingangsformate, die das Verhalten eines Computers betreffen, Programmiersprachen trotz der Tatsache sind, sind sie allgemein nicht Turing-abgeschlossen, und bemerkt, dass die Unerfahrenheit von Programmiersprache-Konzepten der Grund für viele Fehler in Eingangsformaten ist.

Elemente

Alle Programmiersprachen haben einige primitive Bausteine für die Beschreibung von Daten und den Prozessen oder Transformationen, die auf sie (wie die Hinzufügung von zwei Zahlen oder die Auswahl an einem Artikel von einer Sammlung) angewandt sind. Diese Primitiven werden durch syntaktische und semantische Regeln definiert, die ihre Struktur und Bedeutung beziehungsweise beschreiben.

Syntax

Eine Oberflächenform einer Programmiersprache ist als seine Syntax bekannt. Die meisten Programmiersprachen sind rein textlich; sie verwenden Folgen des Textes einschließlich Wörter, Zahlen und Zeichensetzung viel wie schriftliche natürliche Sprachen. Andererseits gibt es einige Programmiersprachen, die in der Natur mit Sehbeziehungen zwischen Symbolen grafischer sind, um ein Programm anzugeben.

Die Syntax einer Sprache beschreibt die möglichen Kombinationen von Symbolen, die ein syntaktisch richtiges Programm bilden. Die einer Kombination von Symbolen gegebene Bedeutung wird durch die Semantik (entweder formell oder hart codiert in einer Bezugsdurchführung) behandelt. Da die meisten Sprachen textlich sind, bespricht dieser Artikel Textsyntax.

Programmiersprache-Syntax wird gewöhnlich mit einer Kombination von regelmäßigen Ausdrücken (für die lexikalische Struktur) und Backus-Naur-Form (für die grammatische Struktur) definiert. Unten ist eine einfache Grammatik, die auf dem Lispeln gestützt ist:

Ausdruck:: = Atom | verzeichnen

Atom:: = Zahl | Symbol

Zahl:: = [+-]? ['0 '-'9'] +

Symbol:: = ['Ein '-'Z'a '-'z']. *

Liste:: =' (' expression*')'

</pre>

Diese Grammatik gibt den folgenden an:

  • ein Ausdruck ist entweder ein Atom oder eine Liste;
  • ein Atom ist entweder eine Zahl oder ein Symbol;
  • eine Zahl ist eine ungebrochene Folge von einer oder mehr dezimalen Ziffern, die fakultativ durch plus oder minus das Zeichen vorangegangen sind;
  • ein Symbol ist ein Brief, der von der Null oder mehr von irgendwelchen Charakteren gefolgt ist (whitespace ausschließend); und
  • eine Liste ist ein verglichenes Paar von Parenthesen, mit der Null oder mehr Ausdrücken darin.

Der folgende ist Beispiele gut gebildeter Scheinfolgen in dieser Grammatik: '' '', ','

Nicht alle syntaktisch richtigen Programme sind semantisch richtig. Viele syntaktisch richtige Programme werden dennoch pro Regeln der Sprache schlecht-gebildet; und kann (abhängig von Sprachspezifizierung, und die Stichhaltigkeit der Durchführung) laufen auf einen Fehler auf der Übersetzung oder Ausführung hinaus. In einigen Fällen können solche Programme unbestimmtes Verhalten ausstellen. Selbst wenn ein Programm innerhalb einer Sprache bestimmt ist, kann es noch eine Bedeutung haben, die von der Person nicht beabsichtigt ist, die es geschrieben hat.

Mit natürlicher Sprache als ein Beispiel kann es nicht möglich sein, eine Bedeutung einem grammatisch richtigen Satz zuzuteilen, oder der Satz kann falsch sein:

  • "Farblose grüne Ideen schlafen wütend." wird grammatisch gut gebildet, aber hat keine allgemein akzeptierte Bedeutung.
  • "John ist ein verheirateter Junggeselle." wird grammatisch gut gebildet, aber drückt eine Bedeutung aus, die nicht wahr sein kann.

Das folgende Bruchstück der c Sprache ist syntaktisch richtig, aber führt Operationen durch, die nicht semantisch definiert werden (die Operation hat keine Bedeutung für einen Wert, der einen komplizierten Typ hat, und wird nicht definiert, weil der Wert dessen der ungültige Zeigestock ist):

Komplex *p = UNGÜLTIG;

Komplex abs_p = sqrt (*p>> 4 + p-> im);

</Quelle>

Wenn die Typ-Behauptung auf der ersten Linie weggelassen würde, würde das Programm einen Fehler auf der Kompilation auslösen, weil die Variable "p" nicht definiert würde. Aber das Programm würde noch syntaktisch richtig sein, da Typ-Behauptungen nur semantische Auskunft geben.

Die Grammatik musste angeben, dass eine Programmiersprache durch seine Position in der Hierarchie von Chomsky klassifiziert werden kann. Die Syntax von den meisten Programmiersprachen kann mit einer Grammatik des Typs 2 angegeben werden, d. h. sie sind Grammatiken ohne Zusammenhänge. Einige Sprachen, einschließlich Perl und Lisp, enthalten Konstruktionen, die Ausführung während der Syntaxanalyse-Phase erlauben. Sprachen, die Konstruktionen haben, die dem Programmierer erlauben, das Verhalten des parser zu verändern, machen Syntax-Analyse ein unentscheidbares Problem, und verschmieren allgemein die Unterscheidung zwischen Syntaxanalyse und Ausführung. Im Gegensatz zum Makrosystem des Lispelns und den Blöcken von Perl, die allgemeine Berechnung, C Makros enthalten können, sind bloß Schnur-Ersatz, und verlangen Codeausführung nicht.

Semantik

Der Begriff Semantik bezieht sich auf die Bedeutung von Sprachen, im Vergleich mit ihrer Form (Syntax).

Statische Semantik

Die statische Semantik definiert Beschränkungen der Struktur von gültigen Texten, die hart oder unmöglich sind, in syntaktischen Standardformalismen auszudrücken. Für kompilierte Sprachen schließt statische Semantik im Wesentlichen jene semantischen Regeln ein, die während der Übersetzung überprüft werden können. Beispiele schließen Überprüfung ein, dass jeder Bezeichner erklärt wird, bevor er verwendet wird (auf Sprachen, die solche Behauptungen verlangen), oder dass die Etiketten auf den Armen einer Fall-Behauptung verschieden sind. Viele wichtige Beschränkungen dieses Typs, wie Überprüfung, dass Bezeichner im passenden Zusammenhang (z.B das nicht Hinzufügen einer ganzen Zahl zu einem Funktionsnamen), oder dieses Unterprogramm Anrufe verwendet werden, haben die passende Zahl und den Typ von Argumenten, kann durch das Definieren von ihnen als Regeln in einer Logik genannt ein Typ-System beachtet werden. Andere Formen von statischen Analysen wie Daten fließen Analyse kann auch ein Teil der statischen Semantik sein. Neuere Programmiersprachen wie Java und C# haben bestimmte Anweisungsanalyse, eine Form von Daten überfluten Analyse als ein Teil ihrer statischen Semantik.

Dynamische Semantik

Einmal Daten ist angegeben worden, die Maschine muss beauftragt werden, Operationen auf den Daten durchzuführen. Zum Beispiel kann die Semantik die Strategie definieren, durch die Ausdrücke zu Werten oder der Weise bewertet werden, auf die Kontrollstrukturen bedingt Behauptungen durchführen. Die dynamische Semantik (auch bekannt als Ausführungssemantik) einer Sprache definieren, wie und wenn die verschiedenen Konstruktionen einer Sprache ein Programm-Verhalten erzeugen sollten. Es gibt viele Weisen, Ausführungssemantik zu definieren. Natürliche Sprache wird häufig verwendet, um die Ausführungssemantik von Sprachen allgemein verwendet in der Praxis anzugeben. Ein bedeutender Betrag der akademischen Forschung ist in formelle Semantik von Programmiersprachen eingetreten, die Ausführungssemantik erlauben, auf eine formelle Weise angegeben zu werden. Ergebnisse von diesem Forschungsgebiet haben beschränkte Anwendung auf das Programmiersprache-Design und die Durchführung außerhalb der Akademie gesehen.

Typ-System

Ein Typ-System definiert, wie eine Programmiersprache Werte und Ausdrücke in Typen einteilt, wie es jene Typen manipulieren kann, und wie sie aufeinander wirken. Die Absicht eines Typ-Systems ist, gewöhnlich ein bestimmtes Niveau der Genauigkeit in auf dieser Sprache geschriebenen Programmen durch das Ermitteln bestimmter falscher Operationen nachzuprüfen und geltend zu machen. Jedes entscheidbare Typ-System schließt einen Umtausch ein: Während es viele falsche Programme zurückweist, kann es auch verbieten einige, korrigieren obgleich ungewöhnliche Programme. Um diese Kehrseite zu umgehen, haben mehrere Sprachen Typ-Lücken, gewöhnlich ungehemmte Würfe, die vom Programmierer verwendet werden können, um eine normalerweise zurückgewiesene Operation zwischen verschiedenen Typen ausführlich zu erlauben. Auf am meisten getippten Sprachen ist das Typ-System nur an Typ-Kontrolle-Programme gewöhnt, aber mehrere Sprachen, gewöhnlich funktionelle, leiten Typen ab, den Programmierer vom Bedürfnis entlastend, Typ-Anmerkungen zu schreiben. Das formelle Design und die Studie von Typ-Systemen sind als Typ-Theorie bekannt.

Getippt gegen ungetippte Sprachen

Eine Sprache wird getippt, wenn die Spezifizierung jeder Operation Typen von Daten definiert, auf die die Operation mit der Implikation anwendbar ist, dass es auf andere Typen nicht anwendbar ist. Zum Beispiel sind die Daten, die durch "" vertreten sind, eine Schnur. Auf den meisten Programmiersprachen, eine Zahl durch eine Schnur teilend, hat keine Bedeutung. Die meisten modernen Programmiersprachen werden deshalb jedes Programm zurückweisen, das versucht, solch eine Operation durchzuführen. Auf einigen Sprachen wird die sinnlose Operation entdeckt, wenn das Programm ("statische" Datentypprüfung) kompiliert, und durch den Bearbeiter zurückgewiesen wird, während in anderen es entdeckt wird, wenn das Programm ("dynamische" Datentypprüfung) geführt wird, auf eine Laufzeitausnahme hinauslaufend.

Ein spezieller Fall von getippten Sprachen ist die Sprachen des einzelnen Typs. Diese sind häufig scripting oder Preiserhöhungssprachen, wie REXX oder SGML, und haben nur einen Datentyp — meistens Charakter-Schnuren, die sowohl für symbolische als auch für numerische Daten verwendet werden.

Im Gegensatz erlaubt eine ungetippte Sprache, wie die meisten Zusammenbau-Sprachen, jeder Operation, auf irgendwelchen Daten durchgeführt zu werden, die, wie man allgemein betrachtet, Folgen von Bit von verschiedenen Längen sind. Höhere Programmiersprachen, die ungetippt werden, schließen BCPL und einige Varianten Hervor ein.

In der Praxis, während wenige Sprachen getippt aus dem Gesichtswinkel von der Typ-Theorie betrachtet werden (das Überprüfen oder die Zurückweisung aller Operationen), bieten am meisten neuere Sprachen einen Grad des Schreibens an. Viele Produktionssprachen stellen Mittel zur Verfügung, das Typ-System zu umgehen oder zu stürzen (sieh Gussteil).

Statisch gegen das dynamische Schreiben

Im statischen Schreiben ließen alle Ausdrücke ihre Typen davor bestimmen, wenn das Programm normalerweise während der Übersetzung durchgeführt wird. Zum Beispiel, 1 und (2+2) sind Ausdrücke der ganzen Zahl; sie können zu einer Funktion nicht passiert werden, die eine Schnur, oder versorgt in einer Variable erwartet, die definiert wird, um Daten zu halten.

Statisch getippte Sprachen können entweder offenbar getippt oder Typ-abgeleitet werden. Im ersten Fall muss der Programmierer Typen an bestimmten Textpositionen (zum Beispiel, an variablen Behauptungen) ausführlich schreiben. Im zweiten Fall leitet der Bearbeiter die Typen von Ausdrücken und auf dem Zusammenhang gestützten Behauptungen ab. Der grösste Teil der Hauptströmung hat statisch Sprachen, wie C ++, C# und Java getippt, werden offenbar getippt. Ganze Typ-Schlussfolgerung ist mit weniger Hauptströmungssprachen, wie Haskell und ML traditionell vereinigt worden. Jedoch unterstützen viele offenbar getippte Sprachen teilweise Typ-Schlussfolgerung; zum Beispiel Java und C# leiten beide Typen in bestimmten beschränkten Fällen ab.

Das dynamische Schreiben, auch genannt das latente Schreiben, bestimmt die Typ-Sicherheit von Operationen an der Durchlaufzeit; mit anderen Worten werden Typen mit Laufzeitwerten aber nicht Textausdrücken vereinigt. Als mit Typ-abgeleiteten Sprachen verlangen dynamisch getippte Sprachen nicht, dass der Programmierer ausführliche Typ-Anmerkungen auf Ausdrücke schreibt. Unter anderem kann das einer einzelnen Variable erlauben, sich auf Werte verschiedener Typen an verschiedenen Punkten in der Programm-Ausführung zu beziehen. Jedoch können Typ-Fehler nicht automatisch entdeckt werden, bis ein Stück des Codes wirklich durchgeführt wird, potenziell das schwierigere Beseitigen machend. Lispeln, Perl, Pythonschlange, JavaScript und Ruby werden dynamisch getippt.

Das schwache und starke Schreiben

Das schwache Schreiben erlaubt einem Wert eines Typs, als ein anderer behandelt zu werden, zum Beispiel eine Schnur als eine Zahl behandelnd. Das kann gelegentlich nützlich sein, aber es kann auch einigen Arten von Programm-Schulden erlauben, unentdeckt während der Übersetzung und sogar an der Durchlaufzeit zu gehen.

Das starke Schreiben verhindert das obengenannte. Ein Versuch, eine Operation auf dem falschen Typ des Werts durchzuführen, erhebt einen Fehler. Stark getippte Sprachen werden häufig vor dem Typ sicher oder sicher genannt.

Eine alternative Definition für "schwach getippten" bezieht sich auf Sprachen, wie Perl und JavaScript, die eine Vielzahl von impliziten Typ-Konvertierungen erlauben. In JavaScript, zum Beispiel, wandelt sich der Ausdruck implizit zu einer Zahl um, und diese Konvertierung ist erfolgreich, selbst wenn, oder eine Reihe von Briefen ist. Solche impliziten Konvertierungen sind häufig nützlich, aber sie können Programmierfehler maskieren.

Stark und statisch werden jetzt allgemein als orthogonale Konzepte betrachtet, aber der Gebrauch in der Literatur unterscheidet sich. Einige gebrauchen den Begriff, der stark getippt ist, um stark statisch zu bedeuten, getippt, oder noch verwirrender einfach statisch getippt zu bedeuten. So ist C sowohl stark getippt als auch schwach genannt, statisch getippt worden.

Standardbibliothek und Laufzeitsystem

Die meisten Programmiersprachen haben eine verbundene Kernbibliothek (manchmal bekannt als die 'Standardbibliothek', besonders wenn sie als ein Teil des veröffentlichten Sprachstandards eingeschlossen wird), der durch alle Durchführungen der Sprache herkömmlich bereitgestellt wird. Kernbibliotheken schließen normalerweise Definitionen für allgemein verwendete Algorithmen, Datenstrukturen und Mechanismen für den Eingang und die Produktion ein.

Eine Kernbibliothek einer Sprache wird häufig als ein Teil der Sprache von seinen Benutzern behandelt, obwohl die Entwerfer es als eine getrennte Entität behandelt haben können. Viele Sprachspezifizierungen definieren einen Kern, der in allen Durchführungen bereitgestellt werden muss, und im Fall von standardisierten Sprachen diese Kernbibliothek erforderlich sein kann. Die Linie zwischen einer Sprache und seiner Kernbibliothek unterscheidet sich deshalb von der Sprache bis Sprache. Tatsächlich werden einige Sprachen entworfen, so dass die Bedeutungen von bestimmten syntaktischen Konstruktionen nicht sogar beschrieben werden können, ohne sich auf die Kernbibliothek zu beziehen. Zum Beispiel, in Java, wird eine wörtliche Schnur als ein Beispiel der Klasse definiert; ähnlich im Plausch baut ein anonymer Funktionsausdruck (ein "Block") ein Beispiel der Klasse der Bibliothek. Umgekehrt enthält Schema vielfache zusammenhängende Teilmengen, die genügen, um den Rest der Sprache als Bibliotheksmakros zu bauen, und so machen sich die Sprachentwerfer nicht sogar die Mühe zu sagen, welche Teile der Sprache durchgeführt werden müssen, weil Sprache baut, und der als Teile einer Bibliothek durchgeführt werden muss.

Design und Durchführung

Der Programmiersprache-Anteilsbesitz mit natürlichen Sprachen hat sich auf ihren Zweck als Fahrzeuge für die Kommunikation bezogen, eine syntaktische Form habend, die von seiner Semantik getrennt ist, und Sprachfamilien von zusammenhängenden Sprachen zeigend, die sich ein von einem anderen verzweigen. Aber als künstliche Konstruktionen unterscheiden sie sich auch auf grundsätzliche Weisen von Sprachen, die sich durch den Gebrauch entwickelt haben. Ein bedeutender Unterschied ist, dass eine Programmiersprache völlig beschrieben und vollständig studiert werden kann, da sie eine genaue und begrenzte Definition hat. Im Vergleich haben natürliche Sprachen sich ändernde Bedeutungen, die von ihren Benutzern in verschiedenen Gemeinschaften gegeben sind. Während gebaute Sprachen auch künstliche Sprachen sind, die vom Boden mit einem spezifischen Zweck entworfen sind, haben sie an der genauen und ganzen semantischen Definition Mangel, die eine Programmiersprache hat.

Viele Programmiersprachen sind von Kratzer, verändert entworfen worden, um neuen Bedarf, und verbunden mit anderen Sprachen zu decken. Viele sind schließlich in den Nichtgebrauch gefallen. Obwohl es Versuche gegeben hat, eine "universale" Programmiersprache zu entwerfen, die allen Zwecken dient, haben sie alle gescheitert, allgemein als Füllung dieser Rolle akzeptiert zu werden. Das Bedürfnis nach verschiedenen Programmiersprachen entsteht aus der Ungleichheit von Zusammenhängen, in denen Sprachen verwendet werden:

  • Programme erstrecken sich aus winzigen Schriften, die von individuellen Hobbyisten riesigen Systemen geschrieben sind, die von Hunderten von Programmierern geschrieben sind.
  • Programmierer erstrecken sich im Gutachten von Anfängern, die Einfachheit vor allem sonst Experten brauchen, die mit der beträchtlichen Kompliziertheit bequem sein können.
  • Programme müssen Geschwindigkeit, Größe und Einfachheit auf Systemen im Intervall von Mikrokontrolleuren zu Supercomputern erwägen.
  • Programme können einmal und nicht Änderung für Generationen geschrieben werden, oder sie können dauernde Modifizierung erleben.
  • Schließlich können sich Programmierer einfach in ihren Geschmäcken unterscheiden: Sie können an das Besprechen von Problemen und Ausdrücken von ihnen auf einer besonderen Sprache gewöhnt werden.

Eine allgemeine Tendenz in der Entwicklung von Programmiersprachen hat mehr Fähigkeit hinzufügen sollen, Probleme mit einem höheren Niveau der Abstraktion zu beheben. Die frühsten Programmiersprachen wurden sehr nah an die zu Grunde liegende Hardware des Computers gebunden. Da sich neue Programmiersprachen entwickelt haben, sind Eigenschaften hinzugefügt worden, die Programmierer Ideen ausdrücken lassen, die von der einfachen Übersetzung in zu Grunde liegende Hardware-Instruktionen entfernter sind. Weil Programmierer an die Kompliziertheit des Computers weniger gebunden werden, können ihre Programme mehr rechnend mit weniger Anstrengung vom Programmierer tun. Das lässt sie mehr Funktionalität pro Zeiteinheit schreiben.

Verarbeiter der natürlichen Sprache sind als eine Weise vorgeschlagen worden, das Bedürfnis nach einer Spezialsprache für die Programmierung zu beseitigen. Jedoch bleibt diese Absicht entfernt, und seine Vorteile sind für die Debatte offen. Edsger W. Dijkstra hat die Position genommen, die der Gebrauch einer formellen Sprache notwendig ist, um die Einführung von sinnlosen Konstruktionen und abgewiesene natürliche Sprache zu verhindern, als "dumm" programmierend. Alan Perlis war von der Idee ähnlich wegwerfend. Hybride Annäherungen sind in Strukturiertem Englisch und SQL genommen worden.

Entwerfer und Benutzer einer Sprache müssen mehrere Kunsterzeugnisse bauen, die regeln und die Praxis der Programmierung ermöglichen. Die wichtigsten von diesen Kunsterzeugnissen sind die Sprachspezifizierung und Durchführung.

Spezifizierung

Die Spezifizierung einer Programmiersprache ist beabsichtigt, um eine Definition zur Verfügung zu stellen, die die Sprachbenutzer und der implementors verwenden können, um zu bestimmen, ob das Verhalten eines Programms in Anbetracht seines Quellcodes richtig ist.

Eine Programmiersprache-Spezifizierung kann mehrere Formen einschließlich des folgenden annehmen:

  • Eine ausführliche Definition der Syntax, statischen Semantik und Ausführungssemantik der Sprache. Während Syntax mit einer formellen Grammatik allgemein angegeben wird, können semantische Definitionen auf natürlicher Sprache (z.B, als in der c Sprache), oder eine formelle Semantik (z.B, als in Normalem ML und Schema-Spezifizierungen) geschrieben werden.
  • Eine Beschreibung des Verhaltens eines Übersetzers für die Sprache (z.B, der C ++ und Spezifizierungen von Fortran). Die Syntax und Semantik der Sprache müssen aus dieser Beschreibung abgeleitet werden, die im natürlichen oder einer formellen Sprache geschrieben werden kann.
  • Eine Verweisung oder Musterdurchführung, die manchmal auf der Sprache geschrieben ist, die (z.B, Einleitung oder ANSI REXX) wird angibt. Die Syntax und Semantik der Sprache sind im Verhalten der Bezugsdurchführung ausführlich.

Durchführung

Eine Durchführung einer Programmiersprache stellt eine Weise zur Verfügung, dieses Programm auf einer oder mehr Konfigurationen der Hardware und Software durchzuführen. Es, gibt weit gehend, zwei Annäherungen an die Programmiersprache-Durchführung: Kompilation und Interpretation. Es ist allgemein möglich, eine Sprache mit jeder Technik durchzuführen.

Die Produktion eines Bearbeiters kann durch die Hardware durchgeführt werden, oder ein Programm hat einen Dolmetscher genannt. In einigen Durchführungen, die von der Dolmetscher-Annäherung Gebrauch machen, gibt es keine verschiedene Grenze zwischen Kompilieren und Interpretation. Zum Beispiel kompilieren einige Durchführungen von GRUNDLEGENDEN und richten dann die Quelle eine Linie auf einmal hin.

Programme, die direkt auf der Hardware gewöhnlich durchgeführt werden, führen mehrere Größenordnungen schneller als diejenigen, die in der Software interpretiert werden.

Eine Technik, für die Leistung von interpretierten Programmen zu verbessern, ist gerade rechtzeitig Kompilation. Hier übersetzt die virtuelle Maschine, kurz vor der Ausführung, die Blöcke von bytecode, die dabei sind, an den Maschinencode für die direkte Ausführung auf der Hardware gewöhnt zu sein.

Gebrauch

Tausende von verschiedenen Programmiersprachen sind hauptsächlich im Rechenfeld geschaffen worden. Programmiersprachen unterscheiden sich von den meisten anderen Formen des menschlichen Ausdrucks darin sie verlangen einen größeren Grad der Präzision und Vollständigkeit.

Wenn

sie eine natürliche Sprache verwenden, um mit anderen Leuten zu kommunizieren, können menschliche Autoren und Sprecher zweideutig sein und kleine Fehler machen, und noch annehmen, dass ihre Absicht verstanden wird. Jedoch, bildlich sprechend, tun Computer "genau, was ihnen gesagt wird zu tun", und nicht "verstehen" kann, was den Programmierer codiert, der beabsichtigt ist, um zu schreiben. Die Kombination der Sprachdefinition, eines Programms und der Eingänge des Programms muss das Außenverhalten völlig angeben, das vorkommt, wenn das Programm innerhalb des Gebiets der Kontrolle dieses Programms durchgeführt wird. Andererseits können Ideen über einen Algorithmus Menschen ohne die für die Ausführung erforderliche Präzision durch das Verwenden des Pseudocodes, der natürliche Auslassungssprache mit dem auf einer Programmiersprache geschriebenen Code mitgeteilt werden.

Eine Programmiersprache stellt einen strukturierten Mechanismus zur Verfügung, um Stücke von Daten, und die Operationen oder Transformationen zu definieren, die automatisch darauf Daten ausgeführt werden können. Ein Programmierer verwendet die Abstraktionsgegenwart auf der Sprache, um die an einer Berechnung beteiligten Konzepte zu vertreten. Diese Konzepte werden als eine Sammlung der einfachsten Elemente verfügbar (genannt Primitive) vertreten. Programmierung ist der Prozess, durch den Programmierer diese Primitiven verbinden, um neue Programme zusammenzusetzen, oder vorhandene an den neuen Gebrauch oder eine sich ändernde Umgebung anpassen.

Programme für einen Computer könnten in einem Gruppe-Prozess ohne menschliche Wechselwirkung durchgeführt werden, oder ein Benutzer könnte Befehle in einer interaktiven Sitzung eines Dolmetschers tippen. In diesem Fall sind die "Befehle" einfach Programme, deren Ausführung zusammen gekettet wird. Wenn eine Sprache verwendet wird, um Befehle einer Softwareanwendung zu geben (wie eine Schale), wird es eine scripting Sprache genannt.

Das Messen des Sprachgebrauchs

Es ist schwierig zu bestimmen, welche Programmiersprachen am weitesten verwendet werden, und was Gebrauch-Mittel durch den Zusammenhang ändert. Eine Sprache kann die größere Zahl von Programmierer-Stunden besetzen, ein verschiedener haben mehr Linien des Codes, und ein Drittel verwertet den grössten Teil der Zentraleinheitszeit. Einige Sprachen sind für besondere Arten von Anwendungen sehr populär. Zum Beispiel ist COBOL noch im korporativen Datenzentrum häufig auf großen Großrechnern stark; FORTRAN in wissenschaftlichen und Technikanwendungen; und C in eingebetteten Anwendungen und Betriebssystemen. Andere Sprachen werden regelmäßig verwendet, um viele verschiedene Arten von Anwendungen zu schreiben.

Verschiedene Methoden, Sprachbeliebtheit, jedes Thema einer verschiedenen Neigung darüber zu messen, was gemessen wird, sind vorgeschlagen worden:

  • das Zählen der Zahl von Job-Anzeigen, die die Sprache erwähnen
  • die Zahl von Büchern hat verkauft, die unterrichten oder die Sprache beschreiben
  • Schätzungen der Zahl von vorhandenen Linien des Codes, der auf der Sprache geschrieben ist —, der Sprachen unterschätzen kann, die nicht häufig in öffentlichen Suchen gefunden sind
  • Zählungen von Sprachverweisungen (d. h., zum Namen der Sprache) haben gefunden, dass das Verwenden eines Webs Motor sucht.
Wenn man

sich verbindet und Information von verschiedenen Internetseiten im Durchschnitt beträgt, langpop.com behauptet, dass 2008 die 10 am meisten zitierten Programmiersprachen (in alphabetischer Reihenfolge) sind: C, C ++, C#, Java, JavaScript, Perl, PHP, Pythonschlange, Rubin und SQL.

Taxonomies

Es gibt kein sich überwölbendes Klassifikationsschema für Programmiersprachen. Eine gegebene Programmiersprache hat keine einzelne Vorfahr-Sprache gewöhnlich. Sprachen entstehen allgemein durch das Kombinieren der Elemente von mehreren Vorgänger-Sprachen mit neuen Ideen im Umlauf zurzeit. Ideen, die auf einer Sprache entstehen, werden sich überall in einer Familie von zusammenhängenden Sprachen verbreiten, und dann plötzlich über Familienlücken springen, um in einer völlig verschiedenen Familie zu erscheinen.

Die Aufgabe wird weiter durch die Tatsache kompliziert, dass Sprachen entlang vielfachen Äxten klassifiziert werden können. Zum Beispiel ist Java beide eine objektorientierte Sprache (weil es objektorientierte Organisation ermutigt), und eine gleichzeitige Sprache (weil es eingebaute Konstruktionen enthält, um vielfache Fäden in der Parallele zu führen). Pythonschlange ist eine objektorientierte scripting Sprache.

In groben Zügen teilen sich Programmiersprachen in die Programmierung von Paradigmen und einer Klassifikation durch das beabsichtigte Gebiet des Gebrauches. Traditionell sind Programmiersprachen als das Beschreiben der Berechnung in Bezug auf befehlende Sätze, d. h. Ausgabe von Befehlen betrachtet worden. Diese werden allgemein befehlende Programmiersprachen genannt. Sehr viel Forschung auf Programmiersprachen ist das Verschmieren der Unterscheidung zwischen einem Programm als eine Reihe von Instruktionen und einem Programm als eine Behauptung über die gewünschte Antwort gezielt worden, die die Haupteigenschaft der Aussageprogrammierung ist. Mehr raffinierte Paradigmen schließen Verfahrensprogrammierung, objektorientierte Programmierung, funktionelle Programmierung und Logikprogrammierung ein; einige Sprachen sind Hybriden von Paradigmen oder mehrparadigmatisch. Eine Zusammenbau-Sprache ist nicht soviel ein Paradigma wie ein direktes Modell einer zu Grunde liegenden Maschinenarchitektur. Durch den Zweck könnten Programmiersprachen als allgemeiner Zweck, Systemprogrammiersprachen, scripting Sprachen, bereichsspezifische Sprachen oder gleichzeitige/verteilte Sprachen (oder eine Kombination von diesen) betrachtet werden. Einige allgemeine Zweck-Sprachen wurden größtenteils mit Bildungsabsichten entworfen.

Eine Programmiersprache kann auch durch Faktoren klassifiziert werden, die zur Programmierung des Paradigmas ohne Beziehung sind. Zum Beispiel verwenden die meisten Programmiersprachen englische Sprachschlüsselwörter, während eine Minderheit nicht tut. Andere Sprachen können klassifiziert werden als, absichtlich esoterisch zu sein, oder nicht.

Geschichte

Frühe Entwicklungen

Die ersten Programmiersprachen datieren den modernen Computer zurück. Das 19. Jahrhundert hat die Erfindung von "programmierbaren" Webstühlen und Spieler-Klavier-Schriftrollen, beiden von denen durchgeführte Beispiele von bereichsspezifischen Sprachen gesehen. Am Anfang des zwanzigsten Jahrhunderts haben Schlag-Karten Daten verschlüsselt und haben mechanische Verarbeitung geleitet. In den 1930er Jahren und 1940er Jahren haben die Formalismen der Kirchlambda-Rechnung von Alonzo und der Maschinen von Turing von Alan Turing mathematische Abstraktionen zur Verfügung gestellt, um Algorithmen auszudrücken; die Lambda-Rechnung bleibt einflussreich im Sprachdesign.

In den 1940er Jahren wurden die ersten elektrisch angetriebenen Digitalcomputer geschaffen. Die erste für einen Computer zu entwerfende Programmiersprache auf höchster Ebene war Plankalkül, der für den deutschen Z3 durch Konrad Zuse zwischen 1943 und 1945 entwickelt ist. Jedoch wurde es bis 1998 und 2000 nicht durchgeführt.

Programmierer des Anfangs von Computern der 1950er Jahre, namentlich UNIVAC I und IBM 701, haben Maschinensprachprogramme, d. h. die erste Generationssprache (1GL) verwendet. 1GL wurde Programmierung durch die ähnlich maschinenspezifischen aber mnemonischen, zweiten Generationssprachen (2GL) bekannt als Zusammenbau-Sprachen oder "Monteur" schnell ersetzt. Später in den 1950er Jahren wurde Zusammenbau-Sprachprogrammierung, die sich entwickelt hatte, um den Gebrauch von Makroinstruktionen einzuschließen, von der Entwicklung der "dritten Generation" Programmiersprachen (3GL), wie FORTRAN, LISPELN und COBOL gefolgt. 3GLs sind abstrakter und sind "tragbar", oder mindestens ähnlich auf Computern durchgeführt, die denselben heimischen Maschinencode nicht unterstützen. Aktualisierte Versionen von allen von diesen 3GLs sind noch im allgemeinen Gebrauch, und jeder hat die Entwicklung von späteren Sprachen stark beeinflusst. Am Ende der 1950er Jahre hat die Sprache formalisiert, weil Algol 60 eingeführt wurde, und späteste Programmiersprachen, in vieler Hinsicht, Nachkommen des ALGOL sind. Das Format und der Gebrauch der frühen Programmiersprachen waren schwer unter Einfluss der Einschränkungen der Schnittstelle.

Verbesserung

Die Periode von den 1960er Jahren bis zum Ende der 1970er Jahre hat die Entwicklung der Hauptsprachparadigmen jetzt im Gebrauch gebracht, obwohl viele Aspekte Verbesserungen von Ideen auf den allerersten Der dritten Generation Programmiersprachen waren:

  • APL hat Reihe-Programmierung und beeinflusste funktionelle Programmierung eingeführt.
  • PL/I (NPL) wurde am Anfang der 1960er Jahre entworfen, um die besten Ideen von FORTRAN und COBOL zu vereinigen.
  • In den 1960er Jahren war Simula die erste Sprache, die entworfen ist, um objektorientierte Programmierung zu unterstützen; Mitte der 1970er Jahre ist Plausch mit der ersten "rein" objektorientierten Sprache gefolgt.
  • C wurde zwischen 1969 und 1973 als eine Systemprogrammiersprache entwickelt, und bleibt populär.
  • Einleitung, entworfen 1972, war die erste Logikprogrammiersprache.
  • 1978 hat ML ein polymorphes Typ-System oben auf dem Lispeln gebaut, statisch den Weg zu bahnen, hat funktionelle Programmiersprachen getippt.

Jede dieser Sprachen hat eine komplette Familie von Nachkommen erzeugt, und am meisten neuere Sprachen zählen mindestens einen von ihnen in ihrer Herkunft auf.

Die 1960er Jahre und die 1970er Jahre haben auch beträchtliche Debatte über die Verdienste der strukturierten Programmierung gesehen, und ob Programmiersprachen entworfen werden sollten, um es zu unterstützen. Edsger Dijkstra, in einem berühmten in den Kommunikationen des ACM veröffentlichten 1968-Brief, hat behauptet, dass GOTO Behauptungen vom ganzen "höheren Niveau" Programmiersprachen beseitigt werden sollten.

Die 1960er Jahre und die 1970er Jahre haben auch Vergrößerung von Techniken gesehen, die den Fußabdruck eines Programms reduziert haben sowie Produktivität des Programmierers und Benutzers verbessert haben. Das Karte-Deck für einen frühen 4GL war für dieselbe Funktionalität viel kleiner, die in 3GL Deck ausgedrückt ist.

Verdichtung und Wachstum

Die 1980er Jahre waren Jahre der Verhältnisverdichtung. C ++ hat sich objektorientiert und Systemprogrammierung verbunden. Die USA-Regierung hat Ada standardisiert, eine Systemprogrammiersprache ist auf Pascal zurückzuführen gewesen und hat für den Gebrauch durch Verteidigungsauftragnehmer bestimmt. In Japan und anderswohin wurden riesengroße Summen ausgegeben, die so genannte "fünfte Generation" Sprachen untersuchend, die Logikprogrammierkonstruktionen vereinigt haben. Die funktionelle Sprachgemeinschaft hat sich bewegt, um ML und Lispeln zu standardisieren. Anstatt neue Paradigmen zu erfinden, haben alle diese Bewegungen die Ideen erfunden im vorherigen Jahrzehnt ausführlich behandelt.

Eine wichtige Tendenz im Sprachdesign, um groß angelegte Systeme während der 1980er Jahre zu programmieren, war ein vergrößerter konzentrieren sich auf den Gebrauch von Modulen oder groß angelegte organisatorische Einheiten des Codes. Modula-2, Ada und ML alle entwickelten bemerkenswerten Modul-Systeme in den 1980er Jahren, obwohl andere Sprachen, wie PL/I, bereits umfassende Unterstützung für die Modulprogrammierung hatten. Modul-Systeme waren häufig an allgemeine Programmierkonstruktionen fest gebunden.

Das schnelle Wachstum des Internets Mitte der 1990er Jahre hat Gelegenheiten für neue Sprachen geschaffen. Perl, ursprünglich ein 1987 zuerst veröffentlichtes Werkzeug von Unix scripting, ist in dynamischen Websites üblich geworden. Java ist gekommen, um für die Programmierung der Server-Seite verwendet zu werden, und bytecode virtuelle Maschinen sind populär wieder in kommerziellen Einstellungen mit ihrer Versprechung geworden "Schreiben einmal, laufen überall" (UCSD Pascal war einige Zeit am Anfang der 1980er Jahre populär gewesen). Diese Entwicklungen waren nicht im Wesentlichen neuartig, eher waren sie Verbesserungen in vorhandene Sprachen und Paradigmen, und haben größtenteils auf der C Familie von Programmiersprachen gestützt.

Programmiersprache-Evolution geht weiter, sowohl in der Industrie als auch in Forschung. Aktuelle Richtungen schließen Sicherheits- und Zuverlässigkeitsüberprüfung, neue Arten der Modularität (mixins, Delegierte, Aspekte), und Datenbankintegration wie der LINQ des Microsofts ein.

4GLs sind Beispiele von Sprachen, die wie SQL bereichsspezifisch sind, der manipuliert und Sätze von Daten aber nicht den Skalarwerten zurückgibt, die in die meisten Programmiersprachen kanonisch sind. Perl, zum Beispiel, mit sein 'hier Dokument' kann vielfach 4GL Programme, sowie vielfache Programme von JavaScript in einem Teil seines eigenen Perl-Codes halten und variable Interpolation in 'hier Dokument' verwenden, um mehrsprachige Programmierung zu unterstützen.

Siehe auch

Weiterführende Literatur

  • Raphael Finkel: Fortgeschrittenes Programmiersprache-Design, Addison Wesley 1995.
  • Daniel P. Friedman, Stab von Mitchell, Christopher T. Haynes: Hauptsache von Programmiersprachen, Die MIT-Presse 2001.
  • Maurizio Gabbrielli und Simone Martini: "Programmiersprachen: Grundsätze und Paradigmen", Springer, 2010.
  • David Gelernter, Suresh Jagannathan: Linguistik, Die MIT-Presse 1990 programmierend.
  • Ellis Horowitz (Hrsg.).: Programmiersprachen, eine Großartige Tour (3. Hrsg.), 1987.
  • Ellis Horowitz: Grundlagen von Programmiersprachen, 1989.
  • Shriram Krishnamurthi: Online-Veröffentlichung.
  • Bruce J. MacLennan: Grundsätze von Programmiersprachen: Design, Einschätzung und Durchführung, Presse der Universität Oxford 1999.
  • John C. Mitchell: Konzepte auf Programmiersprachen, Universität von Cambridge Presse 2002.
  • Benjamin C. Pierce: Typen und Programmiersprachen, Die MIT-Presse 2002.
  • Terrence W. Pratt und Marvin V. Zelkowitz: Programmiersprachen: Design und Durchführung (4. Hrsg.), Prentice Hall 2000.
  • Peter H. Salus. Handbuch von Programmiersprachen (4 vols.). Macmillan 1998.
  • Ravi Sethi: Programmiersprachen: Konzepte und Konstruktionen, 2. Hrsg., Addison-Wesley 1996.
  • Michael L. Scott: Programmiersprache-Pragmatik, Herausgeber von Morgan Kaufmann 2005.
  • Robert W. Sebesta: Konzepte von Programmiersprachen, 9. Hrsg., Addison Wesley 2009.
  • Franklyn Turbak und David Gifford mit Mark Sheldon: Designkonzepte auf Programmiersprachen, Die MIT-Presse 2009.
  • Peter Van Roy und Seif Haridi. Konzepte, Techniken und Modelle der Computerprogrammierung, Die MIT-Presse 2004.
  • David A. Watt. Programmiersprache-Konzepte und Paradigmen. Prentice Hall 1990.
  • David A. Watt und Muffy Thomas. Programmiersprache-Syntax und Semantik. Prentice Hall 1991.
  • David A. Watt. Programmiersprache-Verarbeiter. Prentice Hall 1993.
  • David A. Watt. Programmiersprache-Designkonzepte. John Wiley & Sons 2004.

Links


Source is a modification of the Wikipedia article Programming language, licensed under CC-BY-SA. Full list of contributors here.
Schürstange / Wirtschaft Polens
Impressum & Datenschutz