2010-05-21 19 views
13

Was ist Ihrer Meinung nach die beste Sprache (in Bezug auf Einfachheit, Lesbarkeit und Code Eleganz), um mit Metaprogrammierung zu lernen und zu arbeiten?Sprache zu lernen Metaprogrammierung

Ich denke, Metaprogrammierung ist die "Zukunft der Codierung". Ich sage nicht, dass der Code aussterben wird, aber wir können sehen, dass dieses Szenario neue Technologien hervorbringt.

+4

Sie könnten dies zu einer Community-Wiki-Frage machen, um Schluss auf der subjektiven und argumentativen Basis zu vermeiden . –

+1

Es ist jetzt Community-Wiki. – Erup

+2

+1 Gute Frage. Wirkliche Schande, dass dies geschlossen war, weil es zu diesem Thema viel zu sagen gibt. Lisp (1960) ist die Mutter aller Metaprogrammierungssprachen. Schema ist ein einfach zu lernendes Lisp. Die Sprachfamilie MetaLanguage (ML, 1970) wurde speziell für die Metaprogrammierung entwickelt, und moderne Derivate (OCaml, Haskell, F #) haben eine große Unterstützung dafür. Testen Sie Sprachen, mit denen Sie VMs wie .NET, aber auch LLVM erreichen können. Reguläre Ausdrücke sind ein überzeugendes praktisches Beispiel für die Nützlichkeit der Metaprogrammierung. –

Antwort

2

Ruby hat sehr leistungsfähige und flexible Metaprogrammierungsfunktionen.

+4

Ruby wird immer noch als Metasprache begrüßt, aber es hat kein gut strukturiertes Metaprogrammierungs-Framework - es benutzt nur seine dynamische Natur, wie Python. IMHO Lern-Meta-Programmierung verdient eine Überprüfung der Meta-Klassen und selbstreflexive Sprachen, auch wenn die übliche Praxis ist, eine Hash-basierte dynamische Sprache zu verwenden. –

0

Ich weiß nicht, ob wir die gleiche Definition von "Metaprogrammierung" haben, aber es gibt sicherlich keine beste Sprache zu lernen. Ich würde vorschlagen, dass Sie sich die funktionale Programmierung genauer ansehen. Welche Sprache Sie wählen, hängt von Ihrem Hintergrund und Ihrer Arbeitsumgebung ab. Ich würde F # im Moment wählen, aber Haskel sollte auch eine gute Wahl sein.

prost, Achim

4

Was meinst du mit metaprogramming? Metaprogrammierung ist eine Menge von Konzepten und nicht eine bestimmte Technik.

Siehe this answer, wo ich verschiedene Konzepte und verwandte Sprachen aufgelistet habe. Hier eine Zusammenfassung:

  • Metaprogrammierung mit Makro -> Lisp
  • Metaprogrammierung mit DSL -> Viele Sprachen für die interne DSL, externe DSL ist komplizierter
  • Reflection -> Smalltalk, Ruby-
  • Anmerkungen -> Java
  • Byte-Code oder AST-Transformation -> Groovy

Siehe die vollständige Antwort für weitere Details. Generell denke ich, dass ein guter OO-Allrounder Ruby ist. Sonst wird Lisp-like die Arbeit machen: es ist wie Kitt in deinen Händen. Aber das hängt davon ab, was Sie tun möchten ...

+0

Denken über Enterprise-Anwendungen und die Menge der Konzepte, nicht nur eine Technik, sondern alles, was mit Metaprogrammierung getan werden kann. Ich meine, mit einer einfachen Technologie zu arbeiten und zu lernen. Ruby scheint eine gute Wahl zu sein. – Erup

+0

Wie @Jay aufgeführt, scheint die Syntax Metaprogrammierungstechnik besser in einer Unternehmensumgebung zu sein, meiner Meinung nach. Zur Laufzeit manipulieren ist manchmal nicht geeignet (wie Ruby?). – Erup

5

Die Lisps sind so ziemlich die Sprache der Wahl für eine Vielzahl von Metaprogrammierungstechniken. Von den modernen Lisps, die verfügbar sind, würde ich Clojure als ein zugänglicheres Lisp empfehlen, das Zugang zu einer positiv großen Bibliothek hat (alles in Java Land), wenn Sie etwas, das sowohl als auch sofort nützlich sein will.

Für andere Ansätze zur Metaprogrammierung wird fast jede funktionale Sprache ausreichen. Haskell ist eine gute Wahl für Lerntechniken und funktionale Programmierung, aber nicht das, was ich die praktischste Sprache nennen würde, um in dieser Zeit echte Arbeit zu leisten. Erlang ist praktischer, aber nicht so zugänglich für Metaprogrammierung. OCaml ist eine weitere mögliche Wahl, leidet aber auch an der praktischen Seite ein wenig. Es ist jedoch in vielerlei Hinsicht zugänglicher als Haskell.

In der Skriptsprache Welt Ruby ist eine Sprache, in der Metaprogrammierung eine beliebte Technik ist. Sein Ansatz ist vage Lisp-ähnlich, aber mit einer weit konventionelleren Syntax. Es fehlt jedoch die volle Kraft und Flexibilität des Lisps, aber auf der anderen Seite, mit Ausnahme von Clojure oben, hat es viel direkter praktischen Nutzen.

2

Es gibt mehrere Sprachen, die ich für das Studium der Meta-Programmierung empfehlen würde.Die erste ist Prolog. Ein Prolog-Programm ist eine Datenbank. Prolog "Code", die Klauseln, sind Teil der Daten. Das Programm kann sie einschließlich ihres Inhalts lesen. Er kann auch neuen Code als Datenstruktur generieren und ihn aktivieren, wodurch er sich zur Laufzeit ändert. All das ohne Verwendung der Termexpansion, die Prologs intelligentes Makrosystem ist. Einige Prolog-AI-Bücher beginnen damit, einen Meta-Interpreter in Prolog zu implementieren und ihn dann nach Bedarf zu ändern.

Die zweite ist, wie erwähnt, Lisp, und insbesondere CLOS (Common List Object System), die Befehle für Meta-OOP enthält.

Schließlich Python Unterstützung eine nette und nicht zu obskuren Mechanismus für die Laufzeit-Meta-Programmierung, die es ist Meta-Klassen (Klassen, die Klassen erstellen).

8

Erstens - ich glaube nicht, dass ich Ihrer Behauptung zustimme, dass "Metaprogrammierung die Zukunft des Codierens ist". Es ist ein großartiges Werkzeug, aber nicht jeder mag es (zum Beispiel haben die Java-Entwickler absichtlich Makros aus der Sprache herausgelassen - nicht, dass ich Java mag, aber Leute tun haben Gründe, Metaprogrammieren zu widersprechen).

Wie auch immer ... Ich kann mir zwei verschiedene Arten der Metaprogrammierung vorstellen: auf der syntaktischen Ebene und zur Laufzeit.

Für Syntax-Metaprogrammierung, denke ich, Scheme ist eine gute Option (wenn Sie Einfachheit nicht erwähnt haben, würde ich Common Lisp vorschlagen). Zur Laufzeit Metaprogrammierung Ich denke, sowohl Prolog und Smalltalk sind sehr interessant. (Sie können Fakten direkt zu einer Prolog-Datenbank hinzufügen, ändern und entfernen, und Sie können Smalltalk-Objekte im laufenden Betrieb ändern). Sie können wahrscheinlich Laufzeit-Metaprogrammierung auch in Ruby durchführen, aber ich kenne Ruby nicht.

Also - es gibt mehrere verschiedene Metaprogrammierungsmethoden in Scheme (verschiedene Makrosysteme). Ich schlage vor, Sie werfen einen Blick auf ein grundlegendes Schema-Buch und lesen später über zwei verschiedene Makro-Systeme.

Einige gute Scheme Bücher:

Scheme-Implementierungen sind sehr verschieden voneinander, so dass Sie auch Ihre Scheme-Implementierung manuell ein verwenden werden viel auch.

Einige Orte über Scheme-Makros zu lernen:

Wenn Sie sich entscheiden, eine Sprache zu verwenden, die als Schema größer und unübersichtlicher, versuchen Common Lisp . Es gibt drei Bücher, die ich vorschlagen würde:

  • Zuerst "Practical Common Lisp" von Peter Seibel.Das wird dich auf Common Lisp und Makros bringen;
  • Zweitens, "On Lisp" von Paul Graham. Sie werden dann lernen, dass Makros mächtiger sind als das, was Sie vorher dachten, und werden wirklich nette Techniken lernen;
  • Drittens, "Let Over Lambda" von Doug Hoyte. Ein fortgeschrittenes Buch, am besten gelesen nach Graham's On Lisp.

Für Prolog, können Sie "Programming in Prolog" von Clocksin und Mellish (Holen Sie sich die aktuelle Ausgabe!) Und später den Weg zu "Prolog Programing in Tiefe" von Covington, Vellino und Nute lesen. Siehe Kapitel 6.

Es gibt viele gute Smalltalk-Bücher. Ich mag "Die Kunst und Wissenschaft von Smalltalk" von Simon Lewis. Es gibt eine sehr nette free tutorial/primer by Canol Gokel über Smalltalk auch (aber es geht nicht so weit wie Metaprogrammieren lehren).

+1

Ich mochte die Art, wie Sie das Thema behandelt haben. Ich denke auch, dass die Syntax-Metaprogrammierungs-Technologie (wie Sie beschrieben haben) eine bessere Wahl für die Laufzeit ist, wenn Sie über Enterprise-Apps und die Menge von Konzepten, die Implementierung und Wartbarkeit (Arbeiten in einem Team) nachdenken. – Erup

+1

@Erup: Studieren Sie keine Konzepte mit einer Sprache, die Ihr Team jetzt verwenden wird. Studieren Sie Konzepte, um die Konzepte zu lernen, und verwenden Sie dabei das am besten geeignete Tool. Wählen Sie anschließend Ihre Sprache aus, sobald Sie das Konzept verstanden haben. Sie können Metaprogrammierung in C++ durchführen, zum Beispiel, wenn Sie sehr gut mit Templates umgehen können, aber LEARNING Metaprogrammierung durch C++ wäre ... nicht-trivial. –

+0

Danke @JUST MEINE RICHTIGE MEINUNG, die Konzepte zu lernen ist was ich will. Wenn ich "in einem Team arbeiten" sage, meine ich die Idee, eine Technik zu verwenden, mit der man einfach arbeiten kann. Das ganze Team muss lernen! – Erup

2

Ich bin überrascht, dass niemand ML erwähnt hat. ML steht für Meta-Sprache. Also ... ja ... CaML ist eine Standardimplementierung. (OCaML, die nur meine korrekte OPINIO erwähnt ist die OO-Version von CaML, die wahrscheinlich Funktionen hinzugefügt, die die Meta-Programmierung weniger offensichtlich machen ...)

Ansonsten bin ich ein großer Fan von Scheme, aber hübsch Jede funktionale Programmiersprache ist dafür gut ... Es gibt immer den kleinen Lisper, äh, sorry, der kleine Schemer ...

+2

Leute, die in OCaml programmieren, neigen dazu, den O-Teil wirklich, wirklich schnell fallen zu lassen, nur das Caml zurücklassend. Ich glaube nicht, dass irgendein seriöser OCaml-Programmierer die objektorientierten Teile davon mit irgendeiner Frequenz benutzt. –