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.
programming-languages
syntax
Dokkat
quelle
quelle
Antworten:
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.
quelle
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.Klingt nach Konzeptprogrammierung .
Ich kenne es nicht, aber XL ist eine Sprache, die speziell dafür entwickelt wurde.
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.
Vielleicht interessieren Sie sich für eine Sprache wie Haskell, die eine sehr flexible und doch einheitliche Syntax hat.
quelle
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.
quelle
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.
quelle
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).
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:
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:
quelle
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.
quelle
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_missing
bieten, 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.quelle
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.
quelle
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.
quelle
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
quelle
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.
quelle