2010-09-07 28 views
17

Estoy esbozando un diseño de algo (aprendizaje automático de funciones) que preferiblemente querrá un lenguaje de programación funcional, y también introspección, específicamente la capacidad de examinar el código del programa en un formato agradablemente manejable, y preferiblemente también la capacidad de obtener código generado por la máquina compilado en tiempo de ejecución, y me pregunto cuál es el mejor lenguaje para escribirlo. Lisp, por supuesto, tiene una gran capacidad de introspección, pero los lenguajes estáticos también tienen ventajas; los que estoy considerando son:Introspección de lenguajes de programación funcional

F # - la plataforma .Net tiene una buena historia aquí, puedes leer el código de bytes en tiempo de ejecución y también emitir código de bytes y compilarlo; Supongo que no hay ningún problema para acceder a estas instalaciones desde F #.

Haskell, Ocaml - ¿tienen estas instalaciones similares, ya sea a través de código de bytes o árbol de análisis sintáctico?

¿Hay otros idiomas que también debería estar mirando?

+2

¿Por qué necesita introspección? –

+1

Del lado de la lectura, es esencial porque una característica central del sistema previsto es la capacidad de analizar el código escrito humano. Del lado de la escritura, no es esencial, pero es agradable, porque en los casos en que un código generado por la máquina se ejecuta con frecuencia, compilarlo lo hará funcionar más rápido. – rwallace

+0

Buena pregunta, en realidad me he estado preguntando sobre esto recientemente. Mi trabajo diario es un ceceo común y he hecho algunas cosas para generar automáticamente gráficas de llamadas graphviz usando introspección y me he estado preguntando si haskell tiene algo lo suficientemente poderoso como para hacer algo similar. – asm

Respuesta

9

El mecanismo de introspección de Haskell es Template Haskell, que admite la metaprogramación de tiempo de compilación, y cuando se combina con, p. Ej. llvm, proporciona instalaciones de metaprogramación en tiempo de ejecución.

2

También vería Scala o Clojure, que incluyen todas las bibliotecas desarrolladas para Java. Nunca tendrá que preocuparse si una biblioteca no existe. Pero más al punto de su pregunta, estos lenguajes le dan el mismo reflejo (o tipos más potentes) que encontrará en Java.

10

Ocaml tiene:

  • Camlp4 para manipular ocaml árboles de sintaxis concretas en Ocaml. La implementación mantenida de Camlp4 es Camlp5.

  • MetaOCaml para la programación en etapas múltiples a escala completa.

  • Ocamljit para generar código nativo en tiempo de ejecución, pero no creo que se haya actualizado recientemente.

  • Ocaml-Java para compilar el código Ocaml para la máquina virtual Java. No sé si hay buenas capacidades de reflexión.

+0

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

5

Es posible revisar la typed variant de Racket (anteriormente conocido como PLT Scheme). Conserva la mayor parte de la simplicidad sintáctica de Scheme, pero proporciona un sistema de tipo estático. Como Racket es un Scheme, la metaprogramación es el par del curso, y el tiempo de ejecución puede emitir código nativo a través del a JIT.

3

El enfoque de Haskell estaría más en la línea de analizar la fuente. La plataforma Haskell incluye un analizador fuente completo, o puede usar la API GHC para obtener acceso de esa manera.

1

estoy dibujando un diseño de algo (aprendizaje de la máquina de funciones) que desee preferentemente un lenguaje funcional de programación, así como la introspección, específicamente la capacidad de examinar propio código del programa en un formato muy bien manejable, y preferiblemente también la capacidad de obtener código generado por máquina compilado en tiempo de ejecución, y me pregunto cuál es el mejor lenguaje para escribirlo. Lisp, por supuesto, tiene una gran capacidad de introspección, pero los lenguajes estáticos también tienen ventajas; los que estoy considerando son:

¿No se puede simplemente analizar el código fuente como un intérprete o compilador común? ¿Por qué necesitas introspección?

F # - la plataforma .Net tiene una buena historia aquí, puedes leer el código de bytes en tiempo de ejecución y también emitir código de bytes y compilarlo; Supongo que no hay ningún problema para acceder a estas instalaciones desde F #.

F # tiene un mecanismo de cotización rudimentario, pero solo se pueden citar algunas expresiones y no otros tipos de código, sobre todo las definiciones de tipo. Además, su mecanismo de evaluación es de un orden de magnitud más lento que la compilación genuina, por lo que es básicamente completamente inútil. Puede usar la reflexión para analizar las definiciones de tipo pero, de nuevo, es bastante rudimentario.

Puede leer el código de bytes pero se ha compilado, por lo que se ha perdido mucha información y estructura.

F # también tiene tecnología de lectura y análisis (más notablemente fslex, fsyacc y FParsec) pero no es tan madura como la de OCaml.

Haskell, Ocaml - ¿tienen estas instalaciones similares, ya sea a través de código de bytes o árbol de análisis?

Haskell tiene Template Haskell pero nunca he escuchado que alguien lo haya usado (abandonware?).

OCaml tiene su sistema macro Camlp4 y algunas personas lo usan pero es poorly documented.

En cuanto a lex y análisis, Haskell tiene algunas bibliotecas (sobre todo Parsec) y OCaml tiene many libraries.

¿Hay otros idiomas que también debería estar mirando?

Los lenguajes de reescritura de términos como Mathematica serían una opción obvia porque hacen que sea trivial manipular el código. El lenguaje Pure podría ser de interés.

También podría considerar MetaOCaml por sus capacidades de compilación en tiempo de ejecución.

+0

Bueno, sí, había estado esperando evitar la necesidad de escribir mi propio analizador y tiempo de ejecución, pero resultó ser necesario, así que voy adelante y hacerlo. Gracias por la lista de todos modos, sin embargo, upvoted. – rwallace

+0

Plantilla Haskell se usa en la plataforma web yesod. También lo he usado en algunos proyectos. –

Cuestiones relacionadas