Kann eine Programmsprache so formbar sein, dass Programme die Sprachsemantik erweitern können?


15

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.


2
Zählen Sie als semantische Erweiterungen die hygienischen Makros von Scheme oder die Spiegelung von newspeak , mit denen Ausnahmen als Bibliothekscode implementiert werden können? Was ist mit syntaktischen Erweiterungen wie Perligata: Romana ?

Dies scheint eine Frage zu sein, die eher nach einer Liste von Sprachen als nach Begriffen fragt. In Erwartung von Änderungen, die die Richtung der Frage ändern, stimme ich quasi als offtopisch zu schließen.
Raphael

Wenn ich mich recht erinnere, wird sogar Java Funktionen bekommen, mit denen Programme das Typsystem erweitern können.
Raphael

1
@ Raffael, denkst du an JSR 305 ? Java-Annotationen wurden (zum Teil) von Gilad Bracha entworfen, der Newspeak entwarf, das ich in meiner Antwort unten verlinkt habe, und sich auch für steckbare Typsysteme einsetzte . JSR 305 liefert Typsystemanmerkungen wie @Nullableund @NonNulldie von externen Prüfern wie Findbugs verwendet werden.
Mike Samuel

Unklar, was mit "Erweiterung der Semantik" gemeint ist. Wenn ich mir Boost.Spirit anschaue , überschreitet dies bereits meine persönliche Schwelle zur "Erweiterung der Semantik": Die mathematischen Operatoren von C ++ werden stattdessen zur Beschreibung einer Sprachsyntax verwendet, die der Compiler dann in einen Parser für diese Sprache umwandelt. Ich weiß, dass dies nicht mit "Erweiterung der Sprachsemantik" durch die Laborratten gemeint ist, aber ich finde es ziemlich beeindruckend.
DevSolar

Antworten:


12

Converge verfügt über beeindruckende Metaprogrammiermöglichkeiten.

Auf einer einfachen Ebene kann dies als eine Makrofunktion angesehen werden, obwohl sie leistungsfähiger ist als die meisten vorhandenen Makrofunktionen, da beliebiger Code zur Kompilierungszeit ausgeführt werden kann. Auf diese Weise kann man mit dem Compiler interagieren und Code sicher und einfach als ITrees (auch als abstrakte Syntaxbäume bezeichnet) generieren.

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.

7.6 Ausnahmebehandlung

Da Newspeak reflektierenden Zugriff (7.2) auf die Aktivierungsdatensätze (3.6) bietet, handelt es sich bei der Ausnahmebehandlung lediglich um ein Bibliotheksproblem. Die Plattform wird eine Standardbibliothek bereitstellen, die das Auslösen, Abfangen und Wiederaufnehmen von Ausnahmen unterstützt, ähnlich wie in Smalltalk.


Perligata: Romana zeigt, wie eine völlig neue Syntax für eine Sprache erstellt werden kann.

In diesem Artikel wird ein Perl-Modul - Lingua :: Romana :: Perligata - beschrieben, mit dem Perl-Programme in Latein geschrieben werden können.


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 .

Diese Dissertation beschäftigt sich mit Experimenten in der Informatik. Insbesondere werde ich zeigen, dass neue Programmiersprachen und -konstrukte, die speziell zur Unterstützung des Experimentierens entwickelt wurden, die Arbeit von Forschern und Programmierern gleichermaßen erheblich vereinfachen können.

Ich präsentiere Arbeiten, die sich mit zwei sehr unterschiedlichen Arten des Experimentierens befassen. Das erste soll Programmiersprachenforschern helfen, mit ihren Ideen zu experimentieren, indem es ihnen erleichtert wird, neue Programmiersprachen und Erweiterungen bestehender Sprachen zu prototypen. Die andere untersucht das Experimentieren als Programmierparadigma, indem sie es Programmen ermöglicht, selbst mit verschiedenen Aktionen und Möglichkeiten zu experimentieren - mit anderen Worten, es ist ein Versuch, Sprachunterstützung für was zu bieten, wenn ...? oder mögliche Welten Argumentation.

Alex Warths Dissertation demonstriert die Verwendung eines Ometa zur Definition signifikant neuer Semantiken (Transaktionssemantiken über Welten) in JavaScript + Ometa.


8

"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.LS

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.SL

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.


6

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.)


4

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. ...


1
Bitte schreiben Sie ein oder zwei zusammenfassende Sätze für jede Referenz; Reine Linksammlungen sind fast nie "gute" Antworten.
Raphael
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.