Frage

C++ ist wahrscheinlich die beliebteste Sprache für Statische Metaprogrammierung Und Java unterstützt es nicht.

Gibt es neben C++ noch andere Sprachen, die generative Programmierung (Programme, die Programme erstellen) unterstützen?

War es hilfreich?

Lösung

Die Alternative zur Vorlage Stil Meta-Programmierung ist Makro-Stil, die Sie in verschiedenen Lisp-Implementierungen zu sehen. Ich würde vorschlagen, Paul Grahams Auf Lisp Download und nehmen auch einen Blick auf Clojure wenn Sie in einem Lisp mit Makros interessiert sind, die auf der JVM ausgeführt wird.

Makros in Lisp sind viel mächtiger als C / C ++ Stil und die Sprache in ihrem eigenen Recht darstellen -. Sie für Meta-Programmierung gedacht sind

Andere Tipps

Lassen Sie mich a auflisten ein paar wichtige Details wie Metaprogrammierung funktioniert im Lispeln (oder planen, oder Schiefer, oder wählen Sie Ihre bevorzugte „dynamische“ Sprache):

  • wenn Sie Metaprogrammierung in Lisp machen Sie müssen sich nicht mit zwei Sprachen auseinandersetzen.Der Code auf Metaebene ist in derselben Sprache geschrieben wie der Code auf Objektebene, den er generiert.Metaprogrammierung ist nicht auf zwei Ebenen beschränkt und schont auch das Gehirn.
  • in lisp hast du das Compiler zur Laufzeit verfügbar.Tatsächlich fühlt sich die Unterscheidung zwischen Kompilierungszeit und Laufzeit dort sehr künstlich an und hängt stark davon ab, wo Sie Ihren Standpunkt vertreten.In Lisp können Sie mit einem einfachen Funktionsaufruf Funktionen zu Maschinenanweisungen kompilieren, die Sie von da an als erstklassige Objekte verwenden können.d.h.Dabei kann es sich um unbenannte Funktionen handeln, die Sie in einer lokalen Variablen oder einer globalen Hashtabelle usw. speichern können.
  • Makros in Lisp sind sehr einfach:eine Reihe von Funktionen, die in eine Hashtabelle gepackt und dem Compiler übergeben werden.Für jedes Formular, das der Compiler kompilieren möchte, konsultiert er diese Hashtabelle.Wenn es eine Funktion findet, ruft es diese zur Kompilierzeit mit der Originalform auf und kompiliert anstelle der Originalform die Form, die diese Funktion zurückgibt.(Modulo einiger unwichtiger Details) also Lisp-Makros sind im Grunde Plugins für den Compiler.
  • Das Schreiben einer Lisp-Funktion in Lisp, die Lisp-Code auswertet, umfasst etwa zwei Seiten Code (dies wird normalerweise als „...“ bezeichnet). evalu).In einer solchen Funktion haben Sie alle Möglichkeiten, auf der Metaebene beliebige neue Regeln einzuführen.(Es wird allerdings einige Mühe erfordern, es schnell laufen zu lassen ...ungefähr das Gleiche wie das Bootstrapping einer neuen Sprache ...:) :)

zufällige Beispiele für was Sie können es als Benutzerbibliothek implementieren Verwendung der Lisp-Metaprogrammierung (dies sind tatsächliche Beispiele für gängige Lisp-Bibliotheken):

  • Erweitern Sie die Sprache mit abgegrenzte Fortsetzungen (hu.dwim.delico)
  • implementieren a js-to-lisp-rpc Makro, das Sie in Javascript verwenden können (das aus LISP generiert wird).Es erweitert sich zu einer Mischung aus JS/LISP-Code, der automatisch (in der HTTP-Anfrage) alle referenzierten lokalen Variablen postet, sie auf der Serverseite dekodiert, den LISP-Codekörper auf dem Server ausführt und den Rückgabewert an das Javascript zurückgibt Seite.
  • Fügen Sie der Sprache ein Prolog-ähnliches Backtracking hinzu, das sich sehr nahtlos in „normalen“ Lisp-Code integriert (siehe Screamer).
  • ein XML-Template-Erweiterung zum gewöhnlichen Lispeln (enthält ein Beispiel für Reader-Makros das sind Plugins für den Lisp-Parser)
  • eine Menge kleiner DSLs, wie Schleife oder iterieren für einfaches Looping

Metaprogrammierung ist im Wesentlichen Missbrauch des Template-Mechanismus. Was ich meine, ist, dass man im Grunde bekommt, was man von einem Feature erwarten würde, dass ein ungeplanter Nebeneffekt war --- es ist ein Chaos, und (obwohl Werkzeuge werden immer besser) eine echte Nervensäge, weil die Sprache nicht den Fall ist unterstützen Sie bei der es zu tun (ich sollte anmerken, dass meine Erfahrung mit State-of-the-art auf diese nicht mehr aktuell ist, da gab ich im wesentlichen auf dem Ansatz. ich habe allerdings nicht von irgendwelchen große Fortschritte gemacht, gehört)

Herumspielen mit diesem in etwa '98 war es, was mich trieb nach besseren Lösungen zu suchen. Ich könnte nützliche Systeme schreiben, die auf sie verlassen, aber sie waren höllisch. Stochern führte mich schließlich zu Common Lisp. Sicher, der Template-Mechanismus ist Turing vollständig, aber dann wieder so ist intercal.

Common Lisp ist Metaprogrammierung `Recht‘. Sie haben die volle Leistung der Sprache zur Verfügung, während Sie es tun, keine spezielle Syntax, und weil die Sprache sehr dynamisch ist, kann man mit ihm mehr tun.

Es gibt andere Optionen natürlich. Keine andere Sprache, die ich verwendet habe, tut metaprogramming besser als Lisp tut, weshalb ich es für die Forschung Code verwenden. Es gibt viele Gründe, weshalb Sie etwas anderes, obwohl versuchen, aber es ist alles Kompromissen sein würde. Sie können an Haskell / ML / OCaml aussehen etc. Viele funktionale Sprachen haben etwas die Kraft der Lisp-Makros nähern. Sie können einige .NET Sachen finden gezielt, aber sie sind alle ziemlich marginal (in Bezug auf die Nutzerbasis etc.). Keiner der großen Akteure in industriell verwendeten Sprachen haben so etwas, wirklich.

Nemerle und Boo meine persönlichen Favoriten für solche Dinge. Nemerle hat eine sehr elegante Makro-Syntax, trotz seiner schlechten Dokumentation. Boo Dokumentation ist ausgezeichnet, aber seine Makros sind etwas weniger elegant. Beide arbeiten unglaublich gut, aber.

Beiden Ziele .NET, so können sie mit C # und anderen .NET-Sprachen leicht zusammenarbeiten - auch Java-Binärdateien, wenn Sie IKVM verwenden

.

Edit: Um zu klären, ich meine Makros im Lisp Sinne des Wortes, nicht C dem Präprozessormakros. Diese erlauben die Definition neuer Syntax und schweren metaprogramming bei compiletime. Zum Beispiel Nemerle Schiffe mit Makros, die SQL-Abfragen gegen SQL-Server bei compiletime validieren.

Nim ist eine relativ neue Programmiersprache, die umfangreiche Unterstützung für statische Meta-Programmierung und produziert effiziente (C ++ wie) kompilierte Code.

http://nim-lang.org/

Es unterstützt Kompilierung-Funktionsauswertung, Lisp-like AST Code-Transformationen durch Makros, Compiler-Reflexion, generische Typen, die mit beliebigen Werten parametrisiert werden kann, und Begriff Umschreiben, die verwendet werden können benutzerdefinierte High-Level zu erstellen Typ-aware Guckloch-Optimierungen. Es ist sogar möglich, externe Programme während des Übersetzungsvorgangs auszuführen, der die Code-Generierung beeinflussen können. Als Beispiel nehmen wir an einer lokal laufenden Datenbankserver, um zu sprechen, um sicherzustellen, dass die ORM Definition in Ihrem Code (durch einige DSL Lieferumfang enthalten) für das Schema der Datenbank.

Die "D" Programmiersprache ist C ++ - wie aber hat viel bessere metaprogramming Unterstützung. Hier ist ein Beispiel für ein Raytracer geschrieben mit nur Compiler-metaprogramming:

ctrace

Darüber hinaus gibt es einen gcc Zweig "Concept GCC" genannt, die metaprogramming Konstrukte unterstützt die C ++ nicht (zumindest noch nicht).

Konzept GCC

Common Lisp unterstützt Programme, die Programme auf verschiedene Weise schreiben.

1) Programmdaten und Programm "abstrakter Syntaxbaum" ist einheitlich (S-Ausdrücke!)

2) defmacro

3) Reader Makros.

4) MOP

Von diesen ist der wahre Geist-Gebläse MOP. Lesen Sie „Die Kunst des Metaobjektprotokoll.“ Es werden die Dinge für Sie ändern, das verspreche ich!

Ich empfehle Haskell . Hier ist ein Papier seine Kompilierung-metaprogramming Fähigkeiten beschreiben.

Viel Arbeit in Haskell:Domänenspezifische Sprachen (DSLs), ausführbare Spezifikationen, Programmtransformation, Teilanwendung, abgestufte Berechnung.Ein paar Links für den Einstieg:

Die ML-Sprachfamilie wurden speziell für diesen Zweck entwickelt wurde. Eines der berühmtesten Erfolgsgeschichten der OCaml ist die FFTW Bibliothek für High-Performance-FFTs, die fast vollständig von einem OCaml generierten C-Code ist Programm.

Cheers, Jon Harrop.

Die meisten Menschen versuchen, eine Sprache zu finden, die „ultimative Reflexion“ hat für Selbstkontrolle und so etwas wie „eval“ für neuen Code reifying. Solche Sprachen sind schwer zu finden (LISP ein gutes Gegenbeispiel zu sein) und sie sind sicherlich nicht Mainstream.

Aber ein anderer Ansatz ist es, eine Reihe von Tools zu verwenden, die überprüfen können, erzeugen, und Programmcode manipulieren. Jackpot ist ein solches Werkzeug konzentrierte sich auf Java. http://jackpot.netbeans.org/

Unser DMS Software Reengineering Toolkit ein solches Werkzeug, das auf C, C ++, C #, Java, COBOL, PHP arbeitet, Javascript, Ada, Verilog, VHDL und Vielzahl von anderen Sprachen. (Es nutzt die Produktionsqualität Frontends, damit es lesen all diese langauges). Besser, es kann dies tun, mit mehreren Sprachen im selben Augenblick. Siehe http://www.semdesigns.com/Products/DMS/DMSToolkit.html

DMS gelingt es, weil es ein reguläres Verfahren und Support-Infrastruktur für vollständigen Zugriff auf die Programmstruktur als ASTs bietet, und in den meisten Fällen zusätzliche Daten, wie eine Symboltabellen, Typinformationen, Steuerung und Datenflussanalyse, alle erforderlichen anspruchsvollen Programm zu tun Manipulation.

‚metaprogramming‘ ist wirklich ein schlechter Name für diese spezielle Funktion, zumindest, wenn Sie mehr als eine Sprache besprechen, da diese Funktion nur für eine schmale Scheibe Sprachen benötigt wird, die:

  • statisch
  • in Maschinensprache kompiliert
  • stark für die Leistung bei der Kompilierung optimiert
  • erweiterbar mit benutzerdefinierten Datentypen (OOP in C ++ 's Fall)
  • sehr beliebt

nehmen Sie eine davon, und ‚statisches metaprogramming‘, macht einfach keinen Sinn machen. also, ich wäre überrascht, wenn jede der Ferne Mainstream Sprache so etwas hat, als auf C ++ verstanden.

natürlich, dynamischer Sprachen und mehr funktionalen Sprachen unterstützen völlig unterschiedliche Konzepte, die auch metaprogramming genannt werden könnten.

Lisp unterstützt eine Form von „metaprogramming“, wenn auch nicht im gleichen Sinne wie C ++ Metaprogrammierung. Auch Ihr Begriff „statisch“ verschiedene Dinge in diesem Zusammenhang bedeuten könnte, aber Lisp unterstützt auch statische Typisierung, wenn es das ist, was du meinst.

Die Meta-Sprache (ML), natürlich: http: // cs.anu.edu.au/student/comp8033/ml.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top