2010-05-21 18 views
13

Qual è la lingua migliore (in termini di semplicità, leggibilità ed eleganza del codice) secondo te, per imparare e lavorare con metaprogrammazione?Lingua per imparare metaprogramming

Penso che la metaprogrammazione sia il "futuro della codifica". Non dicendo che il codice si estinguerà, ma possiamo vedere questo scenario venire sulle nuove tecnologie.

+4

si potrebbe desiderare di fare questa domanda una comunità wiki per evitare la chiusura sulla base soggettiva e polemico . –

+1

È ora wiki della comunità. – Erup

+2

+1 Buona domanda. La vera vergogna è stata chiusa perché c'è molto da dire sull'argomento. Lisp (1960) è la madre di tutti i linguaggi metaprogrammanti. Scheme è un Lisp facile da apprendere. La famiglia di linguaggi MetaLanguage (ML, 1970) è stata progettata specificamente per la metaprogrammazione e le derivate moderne (OCaml, Haskell, F #) hanno un grande supporto. Scopri le lingue che ti consentono di indirizzare VM come .NET ma anche LLVM. Le espressioni regolari sono un esempio pratico convincente dell'utilità della metaprogrammazione. –

risposta

2

Ruby offre funzionalità di metaprogrammazione molto potenti e flessibili.

+4

Ruby continua ad essere acclamato come un meta-linguaggio, ma non ha una struttura di meta-programmazione ben strutturata - utilizza solo la sua natura dinamica, come Python. La meta-programmazione dell'apprendimento IMHO merita una revisione di meta-classi e linguaggi autoriflessivi, anche se la pratica comune è usare un linguaggio dinamico basato su hash. –

0

Non so se abbiamo la stessa definizione di "meta-programmazione", ma non c'è sicuramente UNO migliore linguaggio per imparare. Proporrei di dare un'occhiata più approfondita alla programmazione funzionale. Quale lingua scegliere dipende dal contesto e dall'ambiente di lavoro. Al momento selezionerei F #, ma anche Haskel dovrebbe essere una buona scelta.

applausi, Achim

4

Che cosa si intende per metaprogrammazione? Metaprogramming è un insieme di concetti, piuttosto che una tecnica specifica.

Vedere this answer dove ho elencato vari concetti e lingue correlate. Ecco un riassunto:

  • Metaprogrammazione con macro -> Lisp
  • Metaprogrammazione con DSL -> Molte lingue per DSL interno, DSL esterno è più difficile
  • Reflection -> Smalltalk, Ruby
  • Annotazioni -> Java
  • Byte-code o AST trasformazione -> Groovy

Vedere la risposta completa per maggiori dettagli. In generale, penso che un buon tuttofare OO sia Ruby. Altrimenti qualsiasi Lisp-like farà il lavoro: è come un mastice nelle tue mani. Ma ciò dipenderà da ciò che vorresti fare ...

+0

Pensare alle app aziendali e all'insieme di concetti, non solo una tecnica, ma tutto ciò che si può fare con la metaprogrammazione. Voglio dire, usare un lavoro facile con e imparare la tecnologia. Ruby vede una buona scelta. – Erup

+0

Come @Jay elencato, la tecnica di metaprogrammazione della sintassi sembra essere migliore in un ambiente aziendale, a mio parere. Manipolare a runtime non è adatto, a volte (come Ruby?). – Erup

5

I Lisps sono praticamente il linguaggio di scelta per un'ampia varietà di tecniche di metaprogrammazione. Dei moderni Lisp disponibili, consiglierei Clojure come un Lisp più accessibile che abbia accesso a una libreria ENORME positiva (qualsiasi cosa in Java land) se si desidera qualcosa che sia potente e immediatamente utile.

Per altri approcci alla metaprogrammazione quasi tutte le lingue funzionali faranno il trucco. Haskell è una buona scelta per le tecniche di apprendimento e la programmazione funzionale, ma non è quello che definirei il linguaggio più pratico per fare un vero lavoro in questo momento. Erlang è più pratico, ma non abbastanza suscettibile di metaprogrammazione. OCaml è un'altra scelta possibile ma soffre un po 'anche sul fronte della praticità. Tuttavia, è più accessibile di Haskell per molti aspetti.

Nel mondo del linguaggio di scripting Ruby è un linguaggio in cui la metaprogrammazione è una tecnica popolare. Il suo approccio è vagamente simile a Lisp, ma con una sintassi molto più convenzionale. Manca però la piena potenza e flessibilità del Lisps, ma d'altra parte, con l'eccezione di Clojure sopra, ha un'utilità pratica molto più immediata.

2

Ci sono diverse lingue che vorrei raccomandare per studiare la meta-programmazione.

Il primo è Prolog. Un programma Prolog è un database. Il "codice" Prolog, le clausole, fanno parte dei dati. Il programma può leggerli, compreso il loro contenuto. Può anche generare un nuovo codice come struttura dati e affermarlo, cambiando così se stesso in fase di esecuzione. Tutto questo senza usare l'espansione del termine, che è il sistema di smart macros di Prolog. Alcuni libri Prolog AI iniziano con l'implementazione di un meta-interprete in Prolog, e poi lo cambiano in base alle necessità.

Il secondo è, come detto, Lisp, e in particolare CLOS (Common List Object System), che include i comandi per meta-OOP.

Infine, Python supportano un meccanismo piacevole e non troppo oscuro per la meta-programmazione run-time, che è la sua meta-classe (classi che creano classi).

8

In primo luogo - non credo Sono d'accordo con la tua affermazione che "metaprogrammazione è il 'futuro della codifica'". E 'un grande strumento, ma non a tutti piace (per esempio, i progettisti di Java lasciato macro fuori del linguaggio intenzionalmente - non che mi piace di Java, ma la gente fare hanno motivi per opporsi a metaprogrammazione).

In ogni caso ... Posso pensare a due modi diversi di eseguire metaprogrammazione: a livello sintatico e in fase di esecuzione.

Per la sintassi metaprogrammazione, penso Scheme è una buona opzione (se tu non avessi menzionato semplicità ecc Io suggerirei di Common Lisp). Per la metaprogrammazione di runtime, suppongo che sia Prolog sia Smalltalk siano molto interessanti. (È possibile aggiungere, modificare e rimuovere fatti in un database Prolog al volo e modificare gli oggetti Smalltalk al volo su). Probabilmente puoi fare metaprogrammazione in runtime anche in Ruby, ma non conosco Ruby.

Così --Ci sono diversi metodi di metaprogrammazione diversi in Scheme (diversi sistemi di macro). Ti suggerisco di dare un'occhiata ad un libro di Scheme di base e in seguito leggere su due diversi sistemi macro.

Alcuni buoni libri Schema:

implementazioni Scheme sono molto diversi gli uni dagli altri, così potrai anche usare il vostro schema di manuale di implementazione di un anche molto

Alcuni posti per imparare sulle macro Schema:

Se si decide di utilizzare un linguaggio che è più grande e più disordinato di Scheme, provare Common Lisp . Ci sono tre libri che suggerirei:

  • Prima, "Practical Common Lisp" di Peter Seibel.Ciò ti farà iniziare su Common Lisp e macro;
  • Secondo, "On Lisp" di Paul Graham. Scoprirai quindi che le macro sono più potenti di quanto avevi pensato prima e apprenderanno tecniche davvero belle;
  • In terzo luogo, "Let Over Lambda" di Doug Hoyte. Un libro avanzato, la migliore da leggere dopo Graham's On Lisp.

Per Prolog, si può leggere "Programmazione in Prolog" di orologi per e Mellish (ottenere l'ultima edizione!) E poi passare a "Prolog Programmazione in Depth" di Covington, Vellino e Nute. Vedere il Capitolo 6.

Ci sono un sacco di buoni libri Smalltalk. Mi piace "The Art and Science of Smalltalk" di Simon Lewis. C'è anche un bello free tutorial/primer by Canol Gokel su Smalltalk (ma non arriva a insegnare come metaprogrammare).

+1

Mi è piaciuto il modo in cui hai trattato l'argomento. Inoltre, pensando alle applicazioni di enterpise e all'insieme di concetti, all'implementazione e alla manutenibilità (lavorando su un team), comprendo che la sintassi metaprogramming tech (come hai descritto) è una scelta migliore rispetto al runtime. – Erup

+1

@Erup: non studiare i concetti utilizzando una lingua che il tuo team utilizzerà ora. Studia i concetti per apprendere i concetti, usando qualunque strumento ti aiuti meglio, quindi scegli la tua lingua una volta compreso il concetto. Puoi fare metaprogrammazione in C++, ad esempio, se sei molto bravo con i modelli, ma IMPARARE metaprogrammazione attraverso C++ sarebbe ... non banale. –

+0

Grazie a @JUST IL MIO OPINIONE corretto, l'apprendimento dei concetti è ciò che voglio. Quando ho detto "lavorare in una squadra", intendo l'idea di usare una tecnologia che sarà facile da lavorare. Tutto il team dovrà imparare! – Erup

2

Mi sorprende che nessuno ha menzionato ML. ML sta per Meta Language. quindi ... sì ... CaML è un'implementazione standard. (OCaML, che JUST MY corretto OPINIO menzionato è la versione OO di CaML, che probabilmente aggiunge funzionalità che rendono la meta-programmazione meno ovvia ...)

Oltre a questo, sono un grande fan di Scheme, ma piuttosto molto qualsiasi linguaggio di programmazione funzionale è un bene per questo ... C'è sempre il Piccolo lisper, ehm, scusate, lo Schemer Little ...

+2

Le persone che programmano in OCaml tendono a rilasciare la parte O molto, molto velocemente, lasciando solo il Caml. Non penso che nessun programmatore OCaml serio usi le parti orientate agli oggetti di esso con qualsiasi frequenza. –