2010-09-07 5 views
17

Sto abbozzando un progetto di qualcosa (apprendimento automatico di funzioni) che preferibilmente vorrà un linguaggio di programmazione funzionale, e anche l'introspezione, in particolare la capacità di esaminare il codice del programma in qualche formato piacevolmente trattabile, e preferibilmente anche la possibilità di ottenere il codice generato dalla macchina compilato in fase di runtime, e mi chiedo quale sia il linguaggio migliore per scriverlo. Lisp ha ovviamente potenti capacità di introspezione, ma i linguaggi tipizzati staticamente hanno anche dei vantaggi; quelli che sto considerando sono:Linguaggi di programmazione funzionale introspezione

F # - la piattaforma .Net ha una buona storia qui, è possibile leggere il codice byte in fase di esecuzione e anche emettere il codice byte e ottenerlo compilato; Presumo che non ci siano problemi ad accedere a queste strutture da F #.

Haskell, Ocaml - hanno strutture simili, tramite codice byte o albero di analisi?

Ci sono altre lingue che dovrei anche guardare?

+2

Perché hai bisogno di introspezione? –

+1

Dal lato della lettura, è essenziale perché una caratteristica centrale del sistema immaginato è la capacità di analizzare il codice scritto umano. Dal lato della scrittura, non essenziale ma piacevole, perché nei casi in cui un codice generato dalla macchina viene spesso eseguito, la sua compilazione lo renderà più veloce. – rwallace

+0

Bella domanda, di recente mi sono interrogato su questo. Il mio lavoro diurno è un comune gioco di parole e ho fatto alcune cose per generare automaticamente graficamente call graphviz usando l'introspezione e mi sono chiesto se haskell ha qualcosa di abbastanza potente per fare qualcosa di simile. – asm

risposta

9

Il meccanismo di introspezione di Haskell è Template Haskell, che supporta la metaprogrammazione del tempo di compilazione e quando combinato con ad es. llvm, fornisce funzionalità di metaprogrammazione runtime.

2

Vorrei anche dare un'occhiata a Scala o Clojure che includono tutte le librerie sviluppate per Java. Non dovrai mai preoccuparti se una biblioteca non esiste. Ma più al punto della tua domanda, questi linguaggi ti danno lo stesso riflesso (o tipi più potenti) che troverai in Java.

10

O'Caml ha:

  • Camlp4 per manipolare OCaml alberi di sintassi concreti in OCaml. L'implementazione gestita di Camlp4 è Camlp5.

  • MetaOCaml per la programmazione multistadio su larga scala.

  • Ocamljit per generare codice nativo in fase di esecuzione, ma non penso che sia stato mantenuto di recente.

  • Ocaml-Java per compilare il codice Ocaml per la macchina virtuale Java. Non so se ci sono buone capacità di riflessione.

+0

Wiki Camlp4: http://groups.google.com/group/fa.caml/browse_thread/thread/632bb527a6762d89 – nlucaroni

5

Si potrebbe verificare il typed variant di Racket (precedentemente conosciuto come PLT Scheme). Mantiene la maggior parte della semplicità sintattica di Scheme, ma fornisce un sistema di tipo statico. Poiché Racket è uno schema, la metaprogrammazione è la parte del corso e il runtime può emettere il codice nativo tramite a JIT.

3

L'approccio Haskell sarebbe più simile a quello di analizzare la fonte. La piattaforma Haskell include un parser di origine completo oppure è possibile utilizzare l'API GHC per ottenere l'accesso in questo modo.

1

Sto abbozzando un progetto di qualcosa (machine learning di funzioni) che preferibilmente vorrà un linguaggio di programmazione funzionale, e anche l'introspezione, in particolare la possibilità di esaminare il codice del programma in qualche formato piacevolmente trattabile, e preferibilmente anche la possibilità di ottenere il codice generato dalla macchina compilato in fase di runtime, e mi chiedo quale sia il linguaggio migliore per scriverlo. Lisp ha ovviamente potenti capacità di introspezione, ma i linguaggi tipizzati staticamente hanno anche dei vantaggi; quelli che sto considerando sono:

Non si può semplicemente analizzare il codice sorgente come un normale interprete o compilatore? Perché hai bisogno di introspezione?

F # - la piattaforma .Net ha una buona storia qui, è possibile leggere il codice byte in fase di esecuzione e anche emettere il codice byte e ottenerlo compilato; Presumo che non ci siano problemi ad accedere a queste strutture da F #.

F # ha un meccanismo di quotazione rudimentale ma è possibile solo citare alcune espressioni e non altri tipi di codice, in particolare definizioni di tipo. Inoltre, il suo meccanismo di valutazione è di ordine di grandezza più lento della compilazione originale, quindi è fondamentalmente completamente inutile. È possibile utilizzare la riflessione per analizzare le definizioni dei tipi, ma, ancora una volta, è abbastanza rudimentale.

È possibile leggere il codice byte ma è stato compilato in modo da perdere molte informazioni e strutture.

F # ha anche la tecnologia di lexing e parsing (in particolare fslex, fsyacc e FParsec) ma non è maturo come OCaml.

Haskell, Ocaml - hanno strutture simili, tramite codice byte o albero di analisi?

Haskell ha Template Haskell ma non ho mai sentito di nessuno che lo usi (abandonware?).

OCaml ha il suo sistema macro Camlp4 e alcune persone lo usano ma è poorly documented.

Come per il lexing e l'analisi, Haskell ha alcune librerie (in particolare Parsec) e OCaml ha many libraries.

Ci sono altre lingue che dovrei anche guardare?

I linguaggi di riscrittura a termine come Mathematica sarebbero una scelta ovvia perché rendono banale la manipolazione del codice. La lingua Pure potrebbe essere di interesse.

Si potrebbe anche considerare MetaOCaml per le sue funzionalità di compilazione in fase di esecuzione.

+0

Ebbene sì, speravo di evitare la necessità di scrivere il mio parser e il mio runtime, ma si è scoperto essere necessario, quindi vado avanti e lo faccio. Grazie comunque per l'elenco, però, con le votazioni in su. – rwallace

+0

Modello Haskell viene utilizzato nella piattaforma web yesod. L'ho usato anche in alcuni progetti. –