Mit Bezug auf Funktionen in Sprachen wie Ruby (und Javascript), die es einem Programmierer ermöglichen, Klassen jederzeit nach ihrer Definition zu erweitern / außer Kraft zu setzen (einschließlich Klassen wie String), ist es theoretisch machbar, eine Sprache zu entwerfen, mit der Programme später erweitert werden können seine Semantik.
Beispiel: Ruby lässt keine Mehrfachvererbung zu. Kann ich jedoch das Standardsprachverhalten erweitern / überschreiben, um die Implementierung einer Mehrfachvererbung zu ermöglichen?
Gibt es noch andere Sprachen, die dies zulassen? Ist dies für Sprachdesigner tatsächlich ein Thema, das Anlass zur Sorge gibt? In Anbetracht der Wahl, Ruby zum Erstellen von Rails-Frameworks für die Entwicklung von Webanwendungen zu verwenden, können solche Sprachen sehr leistungsfähig sein, um Frameworks (oder DSLs) für eine Vielzahl von Anwendungen zu entwerfen.
quelle
@Nullable
und@NonNull
die von externen Prüfern wie Findbugs verwendet werden.Antworten:
Converge verfügt über beeindruckende Metaprogrammiermöglichkeiten.
Dies ist ein Fortschritt gegenüber den hygienischen Makros von Scheme , die referenziell transparente Makrodefinitionen ermöglichen.
Mechanismen wie Quasiliterale haben das Konstruieren und Destrukturieren von Analysebäumen in anderen Sprachen ermöglicht, aber diese werden häufiger für die Interaktion mit domänenspezifischen Sprachen (DSLs) verwendet, anstatt sich selbst zu ändern.
Newspeaks Reflexion ermöglicht die Implementierung von Ausnahmen als Bibliothekscode.
Perligata: Romana zeigt, wie eine völlig neue Syntax für eine Sprache erstellt werden kann.
PyPy ist wahrscheinlich nicht semantisch signifikant. Es ist ein Interpreter-Generator für Sprachen, deren Semantik in einer stark statisch auswertbaren Teilmenge von Python spezifiziert ist, und er wird verwendet, um mit neuen Sprachkonstrukten in Python zu experimentieren, beispielsweise um der Sprache Thunks hinzuzufügen .
Interessant könnte auch Ometa sein .
Alex Warths Dissertation demonstriert die Verwendung eines Ometa zur Definition signifikant neuer Semantiken (Transaktionssemantiken über Welten) in JavaScript + Ometa.
quelle
"Ist es theoretisch machbar? *
Natürlich ist es das. Man kann immer einen Dolmetscher in einer Sprache ( ) für eine andere Sprache ( ) schreiben und Programme in der neuen Sprache schreiben. Die Leute tun dies nicht oft, weil das Schreiben eines solchen Dolmetschers unter Umständen viel Arbeit erfordert und die zusätzliche Interpretationsebene einen Leistungseinbruch (Faktor 10-100) zur Folge hat.L S
Beide Probleme haben Lösungen. Die Sprache kann mit leistungsfähigen Metaprogrammierungsmöglichkeiten entworfen werden, so dass es einfach ist, Dolmetscher zu implementieren. Sprachen wie Scheme haben das.L
Man kann einen Teilauswerter implementieren, so dass der Interpreter in einen Compiler umgewandelt werden kann (von nach ). Dann bekommen Sie keinen Leistungseinbruch, weil die zusätzliche Interpretationsebene wegfällt.S L
Die neue Sprache wird möglicherweise immer noch langsam ausgeführt, wenn sich das Laufzeitmodell erheblich von der Implementierungssprache unterscheidet. In diesem Fall werden Bits des Interpreters im übersetzten Code angezeigt und es läuft weiterhin langsam. Wenn die neue Sprache jedoch größtenteils mit der Originalsprache identisch ist und nur wenige Optimierungen aufweist, sollte es möglich sein, die meisten Interpreterbits im Zielcode durch sorgfältige Abstimmung der Teilauswertung zu eliminieren. Dann ist der Leistungstreffer nur für die neuen Funktionen da.
In der Tat ist dies die "Virtualisierung" -Technologie für Programmiersprachen.
quelle
In der Vergangenheit war Lisp die erste große Programmiersprache, die Möglichkeiten zur Metaprogrammierung einführte. Mit dem Makrosystem von Lisp kann der Programmierer neue Kontrollstrukturen, neue Datenvorlagen usw. definieren. Beispielsweise kann das Common Lisp Object System vollständig mit Makros über einer Kernsprache definiert werden, die nichts über Objekte oder Klassen weiß. Das Makrosystem ermöglicht auch die Definition domänenspezifischer Sprachen .
Ruby erhielt viel Inspiration von Lisp, einschließlich seiner Fähigkeit zur Reflektivität und Metaprogrammierung. Viele dynamisch typisierte Sprachen haben sich in dieser Hinsicht von Lisp inspirieren lassen. (Statische Typisierung erschwert die Arbeit, da viele Erweiterungen nicht in das ursprüngliche Typsystem passen.)
quelle
Noch nicht in den Antworten / Kommentaren erwähnt:
die Umfrage:
Zusammenfassung: Erweiterbare Sprachen sind Programmiersprachen, mit denen ein Benutzer die Syntax ändern oder hinzufügen und die neuen syntaktischen Formen mit der Semantik verknüpfen kann. Wofür sind diese Sprachen gut? Welche Funktionen lassen sich einfach hinzufügen und welche nicht? Sind sie stark genug, um ernst genommen zu werden? In dieser Umfrage werden wir versuchen, solche Fragen zu beantworten, die prozedurale, objektorientierte, funktionale und universell erweiterbare Sprachen betreffen. Wir sind in erster Linie an Ausdruckskraft (regelmäßig, kontextfrei), damit verbundenen Einschränkungen (unhygienisch, mehrdeutig) und der Benutzerfreundlichkeit der verschiedenen Mechanismen interessiert.
und
Zusammenfassung: Die Fähigkeit, eine Sprache mit neuen syntaktischen Formen zu erweitern, ist ein leistungsstarkes Werkzeug. Ein ausreichend flexibles Makrosystem ermöglicht es Programmierern, aus einer gemeinsamen Basis heraus eine Sprache zu entwickeln, die speziell für ihre Problemdomäne entwickelt wurde. Makrofunktionen, die integriert, in der Lage und gleichzeitig einfach genug sind, um in großem Umfang verwendet zu werden, waren bislang auf die Lisp-Sprachfamilie beschränkt. In diesem Artikel stellen wir eine Makrofunktion vor, den Java Syntactic Extender (JSE), mit der überlegenen Leistungsfähigkeit und Benutzerfreundlichkeit von Lisp-Makrosystemen, jedoch für Java, eine Sprache mit einer konventionelleren algebraischen Syntax. ...
quelle