Gibt es eine personalisierbare Programmiersprache, mit der Sie in andere konvertieren können?

13

Gibt es eine Programmiersprache, in der Sie Ihre eigenen Syntaxkonfigurationen festlegen können und die den Code in eine von Ihnen gewählte Sprache konvertiert?

Zum Beispiel würden Sie bestimmte Konfigurationen wie "Indizierte Python-Blöcke" auswählen, [a,b,c]Arrays initialisieren, ^für die Potenzierung und andere. Ein Skript würde es in die entsprechende Sprache Ihrer Wahl konvertieren.

Dokkat
quelle
1
Ich hoffe sicher nicht. TIMTOWTDI ist wohl schlecht, aber "erfinden Sie so viele inkompatible Wege, wie Sie wollen" hätte definitiv die gleichen Nachteile, mal hundert, und wäre sogar noch weniger nützlich. DSLs sind es manchmal wert, aber die Hälfte der Syntax neu zu definieren (oder noch schlimmer - zwei Operatoren zu tauschen, was scheinbare Kompatibilität aber unterschiedliche Semantik bietet), nur zum Teufel ...
Ich frage dies, weil ich speziell auf Javascript programmiere und wirklich, wirklich in der Lage sein möchte, ein paar Syntaxzucker in meinem Code einzurichten, aber die Sprache lässt es einfach nicht zu. Nicht einmal eine Überladung des Bedieners ist möglich.
Dokkat
2
Bis zu einem gewissen Grad klingt das, was Sie beschreiben, wie Präprozessor-Makros . Wenn wir nur ein ähnliches Feature für Perl haben könnten ...
yannis
5
@Dokkat: Bitte aktualisieren Sie die Frage, um festzustellen, dass es sich um JavaScript handelt. Die Frage - wie gestellt - ist ein Wartungs- und Support-Albtraum. Das Hinzufügen einer neuen Syntax zu einer vorhandenen Sprache (oder die Verwendung eines Vorprozessors, um Ihre private Sprache in eine öffentliche Sprache umzuwandeln) ist wirklich schrecklich. Jedoch. Wenn Sie bestimmte Probleme mit der JavaScript-Syntax sugar auflisten, erhalten Sie möglicherweise eine spezielle Hilfe.
S.Lott
3
Diese "personalisierten Programmiersprachen" werden normalerweise als "domänenspezifische Sprachen" oder DSLs bezeichnet.
Michael Dillon

Antworten:

14

Ja, aber wahrscheinlich nicht so, wie Sie denken.

Lisp und seine Verwandten verfügen über leistungsstarke Makrosysteme, mit denen Sie beliebige Transformationen an Ihrer Quelle durchführen können. Sie können also im Prinzip Makros (und Lesemakros auf Zeichenebene) verwenden, um nahezu alle gewünschten Erweiterungen vorzunehmen. Konkatenative Sprachen (und Sprachen von Autoren in verwandten Bereichen) haben das Potenzial für eine ähnliche Metaprogrammierungskraft . Ein gutes Beispiel hierfür ist Forth , in dem viele syntaktische Konstrukte (z. B. Kommentare) benutzerdefiniert werden können. Für ein zeitgemäßes, nicht esoterisches Beispiel wird versucht, Perl 6 gegenüber Perl 5 eine verbesserte Unterstützung für benutzerdefinierte Syntax zu bieten.

Jon Purdy
quelle
8
Ich wusste irgendwie, dass Perl die Antwort sein würde. Ich denke, C-Präprozessor-Makros passen auch in geringem Maße zur Beschreibung.
Yannis
Auch das Überladen von Operatoren in C ++ kann hilfreich sein. Das hallo Weltbeispiel fällt mir ein. cout << "Hi";
Lord Tydus
@LordTydus: Tatsächlich können Sie schon allein durch das Überladen von Operatoren einiges an Magie hinter einer vernünftigen Benutzeroberfläche verbreiten. Es wäre schön, wenn C ++ allgemeinere Überladungsfunktionen hätte, zum Beispiel das Überladen operator[]für mehrere Argumente oder die Einführung neuer Operatoren wie in Haskell. aber ich bezweifle, dass das Komitee die Analyseprobleme hinter sich lassen würde.
Jon Purdy
3

Klingt nach Konzeptprogrammierung .

Ich kenne es nicht, aber XL ist eine Sprache, die speziell dafür entwickelt wurde.

XL bietet vom Programmierer umkonfigurierbare Syntax und Semantik. Compiler-Plug-Ins können verwendet werden, um der Sprache neue Funktionen hinzuzufügen.

Lisp und Forth unterstützen auch die Konzeptprogrammierung, wenn auch weniger als XL. Ich schlage Lisp vor, da es sehr praktisch und effektiv ist. Das Wichtigste ist eine klare und flexible Syntax, keine Notation, die von Lisp bereitgestellt wird.


Zum Beispiel würden Sie bestimmte Konfigurationen auswählen, wie "Indizierte Blöcke von Python", "[a, b, c]" initialisiert Arrays, "^" für Exponentiation und andere.

Vielleicht interessieren Sie sich für eine Sprache wie Haskell, die eine sehr flexible und doch einheitliche Syntax hat.

Pubby
quelle
Das ist, wonach ich gesucht habe.
Dokkat
2

Meines Wissens nicht.

Ich halte es auch nicht für eine besonders gute Idee - einer der Hauptvorteile einer Standardsyntax ist, dass viele Leute sie lesen können, und wenn jeder seine eigene Syntax erfinden würde, könnte niemand den Code eines anderen verstehen. .... also diese Sprache mag für einen Hobbyisten Spaß machen, aber für nichts Praktisches nicht viel gebrauchen.

Das Nächste, was es wahrscheinlich gibt, ist Lisp, wo Sie mit dem Makrosystem auf sehr flexible Weise Ihre eigenen neuen Sprachkonstrukte schreiben können. Normalerweise würden Sie sich immer noch an die Lisp-Syntax halten, aber Sie können alles neu definieren, wenn Sie es wirklich wollen.

Infolgedessen sind Lisps besonders beliebt bei der Implementierung von DSLs. Ein schönes Beispiel ist dieser DSL-Datenzugriff in Clojure (Korma) , der alle für den Datenbankzugriff erforderlichen Kesselschild-Codes verwaltet.

mikera
quelle
2

Scala wird häufig auf diese Weise zum Erstellen von DSLs (Domain Specific Languages) verwendet.

Dies liegt hauptsächlich daran, dass Scala keine Operatoren hat und die Syntax für den Aufruf der Scala-Methode abgekürzt werden kann. Zum Beispiel:

5 ist ein Integer-Objekt. Um 5 plus 7 zu berechnen, könnte man schreiben

val ans = 5.add (7) mit der Ausnahme, dass die Additionsmethode tatsächlich den Namen "+" trägt, also würden Sie schreiben:

val ans = 5. + (7), aber in Scala müssen Sie nicht das "." In Methodenaufrufen oder den Klammern "()" um Argumente, um die + -Methode für das Objekt 5 aufzurufen, würden Sie schreiben

val ans = 5 + 7, was perfekt funktioniert, da Scala keine Operatoren hat, die Ihr cleveres Methodenbenennungsschema stören könnten. Erweitern Sie diese Idee jetzt auf Ihre eigenen Klassen und Objekte, einschließlich der Tatsache, dass Sie Methoden wie + "überschreiben" sowie Ihre eigenen Methoden mit dem Namen >>> oder ::! oder @ * @ oder einfach nur Textnamen wie Fancify.

Michael Dillon
quelle
Das ist fantastisch. Ich werde einen Blick auf die Waage werfen.
Dokkat
1

Das heißt nicht, dass Sie es verwenden sollten, da es noch weitgehend experimentell ist, aber ein interessantes aktuelles Programmierparadigma ist das sprachorientierte Programmieren ( Language Oriented Programming, LOP).

Das Konzept der sprachorientierten Programmierung verfolgt den Ansatz, die Anforderungen in den Begriffen des Benutzers zu erfassen und dann zu versuchen, eine Implementierungssprache zu erstellen, die den Beschreibungen des Benutzers möglichst nahe kommt, damit die Zuordnung zwischen Anforderungen und Implementierung so direkt wie möglich ist.

Sergey Dmitriev erklärt es ausführlicher .

Das ist die Ideologie davon, aber praktisch läuft es darauf hinaus, dass es das Verhalten unterstützt, nach dem Sie fragen. Du kannst:

  • Erweitern Sie eine vorhandene Sprache.
  • Verfassen Sie verschiedene Sprachen.
  • Verwenden Sie eine vorhandene Transformationssprache, um Ihre neu definierten Keywords in eine Basissprache zu konvertieren.

Die aktivste Programmierumgebung, die ich aus diesem Paradigma kenne, ist das kostenlose Meta Programming System (MPS) von JetBrains.

Es beginnt tatsächlich, auch in kommerzieller Software verwendet zu werden, sodass es vielleicht langsam aus der "experimentellen" Phase herauskommt:

  • Realaxy ist ein Actionscript-Editor, der vollständig auf MPS basiert. Mit der Kraft von LOP konnten sie zB Verschlüsse für AS3 implementieren.
  • mbeddr C ist eine erweiterbare C-Sprache, die auf MPS basiert.
Steven Jeuris
quelle
1

In der Tcl-Community werden häufig domänenspezifische Sprachen verwendet. Zum Beispiel ist es nicht ungewöhnlich, ein Tcl-Programm zu sehen, das sowohl C als auch SQL als eingebettete DSLs enthält (über die Critcl- und Sqlite-Pakete). Die einzige Einschränkung bei einem eingebetteten DSL ist, dass es viel besser ist, wenn die eingebettete Sprache die geschweiften Klammern ausbalanciert, und dies stellt sich in der Praxis als eine wirklich unbedeutende Anforderung heraus!

Eine weitere Sprache, die DSLs vereinfacht, ist Standard ML, mit der Sie aus dem generischen System-Tokenizer (vor dem Zeitpunkt, an dem Bezeichner in Schlüsselwörter konvertiert werden) heraus auf unformatierte Token zugreifen können. Dies erleichtert das Ausführen einer breiten Klasse von DSLs - vorausgesetzt, sie befolgen einige der grundlegenden Syntaxregeln von SML, insbesondere in Bezug auf Kommentare, Zeichenfolgen und Token-Grenzen - und wird in der Tat häufig in einer Reihe der wichtigsten Treiberanwendungen für die Sprache verwendet (Theoremprüfer usw.)

Nicht alle Sprachen machen dies so einfach. Insbesondere Sprachen, die den Inhalt von geschweiften Begriffen automatisch analysieren (viele, viele von ihnen!), Können dies nicht. Sie erfordern daher, dass die DSL entweder von übergeordneten Operatoren erstellt wird, indem die Untersprache in einen String eingefügt wird, oder durch die Verwendung eines Vorprozessors, der das DSL in etwas umschreibt, das innerhalb der Hostsprache gehandhabt werden kann.

Donal Fellows
quelle
0

AFAIU Sie suchen nach Sprachen, mit denen Sie Ihre eigene DSL (Domain Specific Language) schreiben können. Es gibt viele gute Kandidaten. Persönlich würde ich Ruby oder Io empfehlen, da sie 1) einfaches Überladen von Operatoren, 2) Metaprogrammierung und 3) Fallback-Mechanismen method_missingbieten, mit denen Sie Ihre eigene API erstellen können. Schauen Sie sich beispielsweise sqldsl an , eine in Ruby geschriebene DSL, die durch Lesen von Ruby-Code SQL generiert.

Sakisk
quelle
0

Ich habe es an sich noch nicht verwendet , aber wenn ich mich richtig erinnere, ist TXL speziell für die Übersetzung von Quellcode konzipiert. Als solches sollten Sie in der Lage sein, anzugeben, wie von Ihrer Sprache und / oder Spracherweiterungen in eine beliebige Zielsprache übersetzt werden soll.

Es scheint eine Grammatik für Javascript zu haben. Da ich es aber noch nicht benutzt habe, bin ich mir nicht sicher, wie das Ihnen helfen würde.

Mootinator
quelle
0

Es gibt einen netten Präprozessor namens PPWizard, der ziemlich mächtig ist. Sobald Sie sich mit der Syntax vertraut gemacht haben, können Sie Makrodefs für verschiedene Sprachen erstellen. Dies ist zwar kein Kinderspiel, aber ein nützliches Tool.

Kennzeichen
quelle
Hier einige Links: PPWIZARD INHALT (offizielle Dokumente), PPWizard - EDM2 (eine externe Referenz ). Das Tool ist leistungsfähig, aber die Dokumentation ist nicht leicht zu lesen (möglicherweise aufgrund seiner Leistungsfähigkeit).
Wolf
0

Vielleicht suchen Sie als Compiler Compiler. Ein Compiler-Compiler verwendet eine in einer formalen Sprache geschriebene Sprachdefinition und erstellt einen Compiler für diese Sprache.

Schauen Sie sich http://en.wikipedia.org/wiki/Compiler-compiler an

Olivier Jacot-Descombes
quelle
0

Eine gebräuchliche Möglichkeit, eine Programmiersprache teilweise zu personalisieren, ist die Verwendung eines Makropreprozessors. Zum Beispiel könnten Sie "dokkat-lang" über den C-Präprozessor ausführen, bevor Sie das Ergebnis dort ablegen, wo es von einer JavaScript-Umgebung heruntergeladen wird.

Wie viel Sie tun können, hängt von der Raffinesse Ihres Präprozessors ab. Beachten Sie, dass in früheren Versionen von C ++, Objective C und verschiedenen experimentellen Sprachen der Quellcode vorverarbeitet wurde, bevor er in eine C-Compiler-Toolchain eingegeben wurde.

hotpaw2
quelle