7

Busco un lenguaje de programación para el que exista un compilador y que admita el código de auto modificación. He oído que Lisp admite estas funciones, pero me preguntaba si existe un lenguaje más similar a C/C++/D con estas características.Lenguaje dinámico compilado

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, cambiar ellos. Como si tuviera el AstTree de mi programa. Por supuesto que no puedo tener ese árbol en un lenguaje compilado, por lo que debe hacerse diferente. La compilación necesitaría traducir los comandos de modificación automática a sus modificaciones equivalentes binarias para que funcionen en tiempo de ejecución con el código compilado.

no quiero ser dependiente de una máquina virtual, eso es lo que quería decir con compilan :)

+0

http: //en.wikipedia.org/wiki/Self-modifying_code # High_level_languages ​​ –

+0

¿Qué quiere decir "código de auto modificación", y para el caso "dinámico"? Los dos generalmente no se consideran sinónimos. Si pudieras aclarar lo que quieres, probablemente te ayudemos mejor. –

+0

Sí, he echado un vistazo a la página wiki antes, pero esperaba otros idiomas, más c/C++ como. – Marenz

Respuesta

10

Probablemente hay una razón Lisp es como es? Lisp fue diseñado para programar otros lenguajes 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 código nuevo, traducir ese código y ejecutarlo. Por lo tanto, el código pre-analizado también usa las mismas estructuras de datos (símbolos, listas, números, caracteres, ...) que también se usan para otros programas.

Lisp conoce sus datos en tiempo de ejecución; puede consultar todo por su tipo o clase. Las clases son objetos en sí mismas, al igual que las funciones. Entonces estos elementos del lenguaje de programación y los programas también son objetos de primera clase, pueden ser manipulados como tales. El 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 metacategorías y el protocolo metaobjeto) y el programa (sus clases, funciones, métodos, ranuras, herencia, ...) pueden ser examinado en tiempo de ejecución y puede ser modificado en tiempo de ejecución.

Probablemente cuantas más funciones añada a un idioma, más se verá como Lisp. Dado que Lisp es prácticamente el máximo local de un lenguaje de programación simple, dinámico y programable. Si desea algunas de estas características, entonces quizás quiera pensar qué características de su otro lenguaje de programa debe abandonar o si está dispuesto a abandonar. Por ejemplo, para un lenguaje simple de código como datos, todo el modelo de sintaxis C podría no ser práctico.

Por lo tanto, el estilo de C y el "lenguaje dinámico" podrían no ser realmente adecuados: la sintaxis es una parte de la imagen completa. Pero incluso el modelo de sintaxis C nos limita lo fácil que podemos trabajar con un lenguaje dinámico.

+0

Gracias por esa respuesta elaboradora. Ya sabía algunas partes de él, pero aún me preguntaba si sería posible con un estilo más c y si alguien lo hizo. Creo que tendré una mirada más completa a lisp. – Marenz

0

"lenguaje dinámico" es un término amplio que abarca una amplia variedad de conceptos. La tipificación dinámica es compatible con 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á cerca de Lisp en términos de admitir el código de auto modificación.

Para admitir tal grado de dinamismo y código de auto modificación, debe tener un compilador con todas las funciones para llamar en tiempo de ejecución; esto es más o menos lo que realmente es un intérprete.

+0

Algunas implementaciones de Lisp no tienen intérpretes per se, pero simulan compilando sobre la marcha. Supongo que ayuda cuando tienes el código en una forma analizada en primer lugar. –

+0

David: De hecho. A eso me refería con "... debería tener un compilador con todas las funciones para llamar en tiempo de ejecución". Un intérprete proporciona estas facilidades a la perfección, mientras que en un entorno compilado, básicamente debe compilar cosas en tiempo de ejecución. Sin embargo, no se parece mucho al código compilado estáticamente. –

1

Es posible que desee considerar el uso de C++ con LLVM para generar (principalmente) código portátil. Incluso puede extraer clang para trabajar en árboles de análisis C (tenga en cuenta que clang tiene soporte incompleto para C++ actualmente, pero está escrito en C++)

Por ejemplo, podría escribir un núcleo de auto-modificación en C++ para interfaz con clang y LLVM, y el resto del programa en C. Guarde el árbol de análisis sintáctico para el programa principal junto con el código de auto-modificación, luego manipúlelo con clang en tiempo de ejecución. Clang te permitirá manipular directamente el árbol AST de cualquier manera, luego compilarlo hasta el código de la máquina.

Tenga en cuenta que manipular su AST en un lenguaje compilado siempre significará incluir un compilador (o intérprete) con su programa. LLVM es simplemente una opción fácil para esto.

+0

Sí, he leído mucho sobre LLVM. Es un proyecto muy bueno, pero no es lo que necesito en esta pregunta en particular :) – Marenz

+0

En realidad, parece exactamente lo que necesitas. He aclarado un posible uso en mi respuesta. – bdonlan

+0

En algún lugar de mi mente estaba esperando alguna forma de aplicar directamente tales modificaciones, sin tener que volver a compilarlas: manipulación directa del código binario. Pero parece que esto es casi imposible sin volver al ensamblador. – Marenz

2

C# siempre ha permitido el código de auto modificación.

  • C# 1 le permitió esencialmente crear y compilar el código sobre la marcha.
  • C# 3 agregó "árboles de expresión", que ofrecían una forma limitada de generar códigos dinámicamente utilizando un modelo de objetos y árboles de sintaxis abstracta.
  • C# 4 se basa en eso incorporando soporte para el "Dynamic Language Runtime". Probablemente, esto sea lo más cercano posible a las capacidades similares a LISP en la plataforma .NET en un lenguaje compilado.
+1

Reflection.Emit –

+1

pero no está compilado de forma nativa (se ejecuta dentro del clr). OP no fue claro acerca de eso sin embargo. –

+0

Eso no es necesariamente cierto. C# se compila con código nativo en algunas plataformas como iPhone y XBox 360. Sin embargo, no puede usar Reflection.Emit en esas plataformas. –

0

Prueba groovy. Es un lenguaje dinámico basado en Java-JVM que se compila en tiempo de ejecución. Debería poder ejecutar su propio código.

http://groovy.codehaus.org/

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

+0

Perl o PHP serían suficientes c/C++/d como, estaba intentando excluir cosas como cobol, lisp y similares. Pero no quiero JIT, realmente lo quiero completamente compilado e independiente ejecutable – Marenz

+0

En ese caso, definitivamente vaya con Perl ... nunca volverá. – Lincoln

0

JavaScirpt + V8 (el compilador Chrome JavaScript)

JavaScript es

  • dinámica
  • 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/

+1

V8 está compilado "Just In Time", pero aún se ejecuta en una máquina virtual y el solicitante no quiere eso. –

+1

Claramente, el lenguaje de autoevaluación debe ejecutarse en un compilador JIT o un intérprete; de ​​lo contrario, ¿cómo podría ejecutar datos como código? No existe un lenguaje de autoevaluación 100% precompilado. –

0

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

Si eso es todo estás buscando, recomendaría Python o Ruby. Ambos pueden ejecutarse en sus propias máquinas virtuales y la JVM y .Net CLR. Por lo tanto, puede elegir cualquier tiempo de ejecución que desee. De los dos, Ruby parece tener más facilidades de meta-programación, pero Python parece tener implementaciones más maduras en otras plataformas.

+0

Quería decir que no quiero tener ninguna máquina virtual de ese tipo. Ruby, java, todo eso, no está compilado. No quiero eso – Marenz

Cuestiones relacionadas