Erstellen wir eine Programmiersprache, indem wir einen Compiler schreiben?

8

Angenommen, ich wollte meine eigene Programmiersprache erstellen. Unter der Annahme, dass ich alle Entscheidungen darüber getroffen habe, wie es aussehen und sich verhalten soll, muss ich nur einen Compiler dafür schreiben?

Ist der Java-Code auf hoher Ebene etwas anderes als nur Text, und dieser Text hat das richtige Format, damit der Compiler ihn akzeptiert und in etwas anderes umwandelt?

Meine Frage ist, ob die Erstellung einer Programmiersprache über einen Compiler erfolgt. High-Level ist in Ordnung.

Haych
quelle
Ist Ihre Frage zur präzisen Definition der Programmiersprache ?
Anton Trunov
Nicht wirklich. Könnte ich theoretisch meine einzige Sprache nur erfinden, indem ich nur einen Compiler erstelle, der Text analysiert? Wo dieser Text meine erfundene Sprache in meiner Syntax ist. Ist beispielsweise System.out.println()Java, weil der Java-Compiler dies akzeptiert, oder funktioniert hier etwas anderes?
Haych
3
Was meinst du mit "der Schaffung einer Programmiersprache"? Was meinst du mit "erledigt durch"? Es fällt mir schwer, genau zu sagen, was Sie fragen. Sie sagen, Sie haben bereits alle Entscheidungen darüber getroffen, wie die Sprache aussehen und handeln soll. Was bringt es aus Ihrer Sicht mehr, eine Programmiersprache zu erstellen? Wenn Sie versuchen, herauszufinden, was Sie erreichen möchten, können Sie wahrscheinlich hilfreichere Antworten darauf geben, wie dies erreicht werden kann. Im Moment scheinen wir zu raten, was Sie fragen könnten.
DW

Antworten:

10

Die kurze Antwort lautet nein .

Sie können sich eine Programmiersprache als einen mathematischen Formalismus vorstellen, der zum Ausdrücken von Berechnungen verwendet wird. Ein Compiler / Interpreter ist nur ein Teil einer tatsächlichen Software, die diese Berechnung ausführt, und sollte nicht als Sprachspezifikation dienen.

Abgesehen davon sollten Sie neben der lexikalischen und syntaktischen Spezifikation einer Sprache auch die semantische Spezifikation definieren, dh was bedeutet ein (syntaktisch korrektes) Programm, das in Ihrer Sprache geschrieben ist, tatsächlich? Die offensichtliche Semantik ist zunächst die operative Semantik , bei der die Bedeutung eines Programms in Bezug auf die tatsächliche Ausführung des Programms angegeben wird. Das heißt, es definiert (mathematisch) genau, wie Programme ausgeführt werden. Zusätzlich zu dieser Semantik sollten Sie einen tatsächlichen Compiler / Interpreter mit Optimierungen usw. erstellen.

Wenn Sie die vollständige Betriebssemantik Ihrer Sprache angeben, erhalten Sie eine formale Sprachdokumentation und können Ihre Sprache bis ins kleinste Detail verstehen. Außerdem können Sie einige Aspekte der Sprache formell begründen. Das Aufschreiben der operativen Semantik ist wirklich eine gute Angewohnheit.

Es gibt auch andere nützliche Semantiken, wie z. B. axiomatische , denotationale und Spielesemantik . Sie sind jedoch fortgeschrittener und gelangen normalerweise nicht in einen Compiler / Interpreter.

bellpeace
quelle
3
Das ist falsch. Eine Programmiersprache ohne formale Spezifikation ist immer noch eine Programmiersprache.
Reinierpost
3
@reinierpost Ihre Antwort auf die Frage "Wird eine Programmiersprache über einen Compiler erstellt?" lautet also "Ja". Wenn ja, dann sollten Sie es meiner Meinung nach als Antwort schreiben.
Bellpeace
4
@reinierpost: Ein Haus, das nicht von einem Architekten entworfen wurde, ist immer noch ein Haus. Aber in was für einem Haus würden Sie am liebsten leben?
Andrej Bauer
1
Die Frage ist nicht eindeutig. Kann eine Programmiersprache erstellt werden, indem ein Compiler dafür erstellt wird? Bestimmt. Ist dies der Weg, um eine Programmiersprache zu erstellen? Nein, es ist nur ein möglicher Weg.
Reinierpost
2
@johan Eine Programmiersprache ist von zu großer praktischer und theoretischer Bedeutung, um als nicht genau definiertes Konzept zurückgelassen zu werden. Wie würden Sie zum Beispiel jemandem genau erklären, was C ist oder wie es genau funktioniert? Indem Sie ihr einen C-Compiler geben? Aber es gibt so viele von ihnen und sie sind unterschiedlich! Darüber hinaus wissen wir in vielen Fällen nicht einmal, was der C-Compiler tun wird (Hinweise: Parallelität, Speichermodelle). Genau genommen induziert ein Compiler / Interpreter eine Programmiersprache, aber wenn man eine Programmiersprache als bloße Implementierung betrachtet, wirft dies mehr Probleme auf als sie löst.
bellpeace
5

Angenommen, ich wollte meine eigene Programmiersprache erstellen. Unter der Annahme, dass ich alle Entscheidungen darüber getroffen habe, wie es aussehen und sich verhalten soll, muss ich nur einen Compiler dafür schreiben?

Treffen Sie alle Entscheidungen darüber, wie die Sprache aussehen und handeln soll soll, erstellen Sie Ihre eigene Programmiersprache. Sie benötigen keinen Compiler oder Interpreter, um eine Programmiersprache zu erstellen. Sie benötigen keinen Compiler oder Interpreter, um Programme in Ihrer Programmiersprache zu schreiben.

Sie benötigen nur dann einen Compiler oder einen Interpreter, wenn Sie dies tatsächlich möchten die von Ihnen geschriebenen Programme ausführen .

Meine Frage ist, ob die Erstellung einer Programmiersprache über einen Compiler erfolgt. High-Level ist in Ordnung.

Nein. Die Erstellung einer Programmiersprache erfolgt durch die Erstellung von zwei Regelsätzen:

  1. wie ein legales Programm aussieht (Syntax)
  2. was ein Rechtsprogramm macht (Semantik)

Das ist es.

Es gibt Programmiersprachen, die nicht implementiert sind. Oder die lange Zeit keine Implementierung hatten.

Zum Beispiel schuf Konrad Zuse Mitte der 1940er Jahre Plankalkül, aber aufgrund des Krieges konnte er es nie umsetzen. Es wurde erstmals 1975 im Rahmen einer Dissertation umgesetzt. Es existierte aber sicherlich in den 1950er und 1960er Jahren.

LISP wurde ursprünglich als besser handhabbare Alternative zum λ-Kalkül für das Studium der Berechnung entwickelt. Es wurde von Steve Russell, einem Schüler von John McCarthy, implementiert. McCarthy selbst bezweifelte sogar, dass LISP überhaupt implementiert werden könnte!

APL wurde ursprünglich als Notation für den Mathematikunterricht entwickelt. Es wurde später erweitert, um als Spezifikationssprache für IBM System / 360 zu dienen. Die Implementierung erfolgte später, nachdem die Sprache bereits verwendet worden war.

PLANNER war eine sehr einflussreiche Sprache, die tatsächlich erst implementiert wurde, nachdem sie bereits andere Sprachen beeinflusst hatte. Es wurde 1969 entworfen und 1973 implementiert. Zu diesem Zeitpunkt hatte es bereits Smalltalk und Prolog beeinflusst (beide 1972).

Struktur und Interpretation der klassischen Mechanik ist ein Physiklehrbuch, das Schema anstelle von Mathematik verwendet, um dynamische Systeme zu beschreiben. Die Tatsache, dass das Schema Dolmetscher und Compiler hat, ist für das Buch nicht wesentlich. Es wird als Sprache zur Vermittlung von Gedanken verwendet, nicht zum Ausführen von Programmen.

Wie Sie sehen, können Programmiersprachen auch ohne Implementierungen nützlich sein. "Programme sollten so geschrieben werden, dass Menschen sie lesen können und nur im Übrigen, damit Computer sie ausführen können", lautet ein berühmtes Zitat aus Struktur und Interpretation von Computerprogrammen. Programmiersprachen sind formale Sprachen zur eindeutigen Beschreibung komplexer Prozesse. Die Tatsache, dass ein Prozess, den ein Mensch genau genug beschreibt, um ihn zu verstehen, auch von einer Maschine ausgeführt werden kann, ist ein Nebeneffekt. Es ist eine sehr wünschenswerte, nützliche, starke Nebenwirkung, aber es ist eine Nebenwirkung.

Die allerersten "Programmiersprachen", λ-Kalkül, SKI-Kalkül, Turing-Maschinen, μ-rekursive Funktionen, wurden nicht zur Ausführung erstellt. Sie wurden geschaffen, um grundlegende Fragen der Logik und Mathematik zu verstehen.

Jörg W Mittag
quelle
0

Wird die Erstellung einer Programmiersprache über einen Compiler durchgeführt?

Es gibt 3 Möglichkeiten.

  • Ein Assembler
  • Ein Dolmetscher
  • Ein Compiler

Assembler Der
von einem Menschen geschriebene Quellcode übersetzt 1 zu 1 in Maschinencode, der von der CPU verbraucht wird.

Interpreter
Ein Programm liest jede Codezeile, folgt den Anweisungen und führt diese der Reihe nach aus.

Compiler
Ein Programm analysiert die Anweisungen häufig mithilfe eines abstrakten Syntaxbaums und generiert daraus Objektcode.
Der Compiler generiert eine Art Objektcode, der von einer realen oder virtuellen Maschine verwendet werden kann.

Verwischen der Linien
Hier gibt es viele Vermittler.
Ruby läuft von seinem AST. Java führt bekanntermaßen Bytecode für eine fiktive CPU aus.
SQL wird interpretiert, aber nicht wie geschrieben ausgeführt, sondern in einen Abfrageplan übersetzt.

Javascript existiert in einer seltsamen Dämmerungszone. Es wird größtenteils interpretiert, aber kritische Teile werden über einen JIT-Compiler ausgeführt, der nicht standardisierten Bytecode generiert, und es wird auch als Objektcode für einige Compiler verwendet.
PHP war früher eine rein interpretierte Sprache, aber Facebook verwendet einen eigenen PHP-Compiler.

Meine Empfehlung
Wenn Sie mit dem Schreiben einer Programmiersprache experimentieren möchten.
Beginnen Sie mit einem Dolmetscher.

Wenn Sie Compiler verstehen wollen, studieren Sie ASTs!
Eine Sprache wie Pascal ist maßgeschneidert für einen AST, der in einem einzigen Durchgang vom Quell- zum Maschinencode wechseln kann und daher relativ einfach in einem Compiler implementiert werden kann.
Wenn Sie darauf bestehen, Compiler und nicht Dolmetscher zu studieren, empfehle ich Ihnen, Wirths Schriften zu diesem Thema zu studieren.

Johan
quelle
Es gibt mehr als die drei Optionen. Eine Option ist beispielsweise: Nichts tun. Sie können eine Programmiersprache erstellen, indem Sie einfach ihre Regeln angeben. Sie müssen sie überhaupt nicht implementieren. Plankalkül wurde erst 60 Jahre (?) Nach seiner Erstellung implementiert. LISP und APL sollten ursprünglich überhaupt nicht implementiert werden. LISP wurde als besser handhabbare Version des λ-Kalküls für das Studium der Berechnung entwickelt. APL wurde als Notation für den Mathematikunterricht entwickelt. Das Buch Struktur und Interpretation der klassischen Mechanik verwendet Schema als Notation zur Beschreibung dynamischer Systeme, nicht als…
Jörg W Mittag
Sprache zum Schreiben von Programmen, die tatsächlich ausgeführt werden.
Jörg W Mittag
0

Ein Compiler muss lediglich sicherstellen, dass die Eingabe die Sprache verwendet, die der Compiler versteht, und dass er dieselbe semantische Struktur wie die Sprache aufweist.

Der Compiler fälscht Intelligenz, indem er einen Lexer und einen Parser verwendet, um die Eingabe lexikalisch zu analysieren und zu versuchen, die Token in eine Reihenfolge zu analysieren, die die beabsichtigte Bedeutung hat, ohne Mehrdeutigkeit einzuführen.

Um Ihre Frage zu beantworten, Sie KANN eine Programmiersprache erstellen , indem Sie den Compiler zu schaffen, aber so ist die Programmiersprache tatsächlich erstellt dabei vor der Compiler abgeschlossen ist.

Stellen Sie sich Programmiersprachen wie jede andere Sprache vor - Englisch, Französisch, Deutsch usw. Die Aufgabe eines Compilers besteht darin, bei einigen Eingaben sicherzustellen, dass die in dieser Eingabe verwendeten Wörter mit den Wörtern übereinstimmen, die in der Sprache verwendet werden, für die er erstellt wurde Stellen Sie sicher, dass die Reihenfolge der Wörter in der Sprache, für die sie erstellt wurden, sinnvoll ist, und übersetzen Sie diese Eingabe schließlich in eine Sprache, die die Maschine verstehen kann

smac89
quelle
Dies ist nicht unbedingt wahr. Es gibt viele Beispiele für Sprachen, die zusammen mit den zu ihrer Verarbeitung geschriebenen Programmen erstellt wurden. FORTRAN war der Name des Compilers, nicht die Sprache.
Reinierpost
@reinierpost Mein Punkt ist, dass bevor ein Compiler eine Reihe von Token in seiner gegebenen Sprache erkennen kann, diese Token zuerst existieren müssen ... daher ist die Sprache vor dem Abschluss des Compilers entstanden. Eine Sprache kann nicht ohne die grundlegendsten Komponenten existieren, die die Wörter / Phrasen in dieser Sprache sind. Die Semantik kann später kommen. In ähnlicher Weise kann ein Compiler nicht einmal so tun, als würde er eine Sprache kompilieren, wenn er die Wörter, aus denen diese Sprache besteht, nicht kennt
smac89
Es muss keine "gegebene" Sprache geben. Der Compiler kann Eingaben verarbeiten, ohne eine spezifische Definition dessen zu haben, was eine gültige Eingabe für ihn darstellt. Versuchen Sie, eine Menge C-Programmierer dazu zu bringen, sich darauf zu einigen, was genau ein C-Programm ist und was nicht. Viel Glück!
Reinierpost