Pregunta

Búsqueda de un lenguaje de programación para el que existe un compilador y que soporta auto modificar el código. He heared que Lisp es compatible con estas características, pero me preguntaba si hay una C / C ++ lenguaje más / D-Al igual que con estas características.

Para aclarar lo que quiero decir:

Quiero ser capaz de tener de alguna manera el acceso al código Programms en tiempo de ejecución y aplicar cualquier tipo de cambios en la misma, es decir, la eliminación de los comandos, la adición de comandos, cambiarlas. Como si no tuviera la AstTree de mi Programm. Por supuesto que no puedo tener ese árbol en un lenguaje compilado, lo que debe ser hecho diferente. La compilación tendría que traducir los comandos de auto-modificación en sus modificaciones equivalentes binarios para que pudieran trabajar en tiempo de ejecución con el código compilado.

No quiero depender de una máquina virtual, eso es lo que quería decir con compilado:)

¿Fue útil?

Solución

Probablemente hay una razón Lisp es como es? Lisp fue diseñado para programar otros idiomas y para calcular con representaciones simbólicas de código y datos . El límite entre el código y los datos ya no está allí. Esto influye en el diseño y la implementación de un lenguaje de programación.

Lisp tiene sus características sintácticas para generar nuevo código, traducir ese código y ejecutarlo. Así código pre-analizada también está utilizando las mismas estructuras de datos (símbolos, listas, números, caracteres, ...) que se utilizan para otros programas también.

Lisp conoce sus datos en tiempo de ejecución - se puede consultar todo para su tipo o clase. Las clases son objetos en sí, como lo son las funciones. Por lo que estos elementos del lenguaje de programación y los programas también son objetos de primera clase, que pueden ser manipulados como tal. lenguaje dinámico no tiene nada que ver con 'tipado dinámico'.

'lenguaje dinámico' significa que los elementos del lenguaje de programación (por ejemplo a través de las clases de meta y el protocolo de meta-objeto) y el programa (su clases, funciones, métodos, ranuras, herencia, ...) puede ser mirado en tiempo de ejecución y puede ser modificado en tiempo de ejecución.

Probablemente la más de estas características que se agregan a una lengua, más se parecerá a Lisp. Desde Lisp es más o menos el máximo local de una forma sencilla, lenguaje de programación, dinámico programable. Si quieres algunas de estas características, entonces es posible que desee pensar qué características de su otro lenguaje de programa que tiene que renunciar o están dispuestos a renunciar. Por ejemplo, para un simple lenguaje de código-como-datos, todo el modelo sintaxis de C puede no ser práctico.

Así similar a C y 'lenguaje dinámico' no podrían realmente ser un buen ajuste - la sintaxis es una parte de la imagen completa. Pero incluso el modelo sintaxis de C nos limita lo fácil que podemos trabajar con un lenguaje dinámico.

Otros consejos

C # siempre ha permitido código mutante.

  • C # 1 le ha permitido crear y compilar código sobre la marcha en esencia.
  • C # 3 añadió "árboles de expresión", que ofrecía una manera limitada para generar dinámicamente código utilizando un modelo de objeto y los árboles de sintaxis abstracta.
  • C # 4 se basa en que mediante la incorporación de soporte para el "Dynamic Language Runtime". Esto es probablemente lo más cerca que se van a poner a las capacidades de LISP que se extienden sobre la plataforma .NET en un lenguaje compilado.

Es posible que desee considerar el uso de C ++ con LLVM de (la mayoría) de generación de código portátil. Incluso se puede tirar en sonido metálico así a trabajar en árboles de análisis sintáctico C (sonido metálico en cuenta que tiene soporte incompleto para C ++ Actualmente, pero está escrito en C ++ sí mismo)

Por ejemplo, se podría escribir un núcleo de auto-modificación en C ++ para interactuar con sonido metálico y LLVM, y el resto del programa en C. Almacenar el árbol de análisis sintáctico para el programa principal junto con el código de auto-modificación, luego manipularla con sonido metálico en tiempo de ejecución. Tañido le permitirá manipular directamente el árbol AST en modo alguno, a continuación, compilar todo el camino hacia abajo a código máquina.

Tenga en cuenta que la manipulación de su AST en un lenguaje compilado siempre significará que incluye un compilador (o intérprete) con su programa. LLVM es sólo una opción fácil para esto.

"lenguaje dinámico" es un término amplio que abarca una amplia variedad de conceptos. tipado dinámico se apoya en C # 4.0, que es un lenguaje compilado. Objective-C también es compatible con algunas características de los lenguajes dinámicos. Sin embargo, ninguno de ellos está ni siquiera cerca de Lisp en términos de apoyo de código auto de modificación.

Para apoyar un grado de dinamismo y de código auto-modificable por ejemplo, usted debe tener un compilador con todas las funciones para llamar en tiempo de ejecución; esto es más o menos lo que un intérprete es en realidad.

Trate maravilloso. Es un lenguaje basado en Java JVM-dinámica que se compila en tiempo de ejecución. Debe ser capaz de ejecutar su propio código.

http://groovy.codehaus.org/

De lo contrario, siempre has conseguido Perl, PHP, etc ... pero los que no lo son, como usted sugiere, C / C ++ / D como idiomas.

JavaScirpt + V8 (el compilador de JavaScript Chrome)

JavaScript es

  • dinámico
  • auto-modificable (auto-evaluación) (bueno, más o menos, dependiendo de su definición)
  • tiene una sintaxis similar a C (de nuevo, más o menos, eso es lo mejor que obtendrá de dinámica)

Y ahora se puede compilar con V8: http://code.google.com/p / V8 /

  

No quiero depender de una máquina virtual, eso es lo que quería decir con compilado:)

Si eso es todo lo que está buscando, me gustaría recomendar Python o Ruby. Ambos pueden ejecutar en sus propias máquinas virtuales y la JVM y .NET CLR. Por lo tanto, se puede elegir cualquier funcionamiento que se desea. De los dos, Ruby parece tener facilidades de programación meta más, pero Python parece tener implementaciones más maduros en otras plataformas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top