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.
¿Por qué necesita introspección? –
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
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