Pregunta

He escuchado que hay algunas cosas que uno no puede hacer como programador informático, pero no sé qué son. Una cosa que se me ocurrió recientemente fue: ¿no sería bueno tener una clase que pudiera hacer una copia de la fuente del programa que ejecuta, modificar ese programa y agregar un método a la clase que es, y luego ejecutar La copia del programa y se terminará. ¿Es posible que el código escriba código?

¿Fue útil?

Solución

Comience mirando quines , luego en Macro-Assemblers y luego lex & amp; yacc , y flex & amp; bisonte . Luego considere código de modificación automática .

Aquí hay una quine (formateada, use la salida como la nueva entrada):

#include<stdio.h>

main()
{
  char *a = "main(){char *a = %c%s%c; int b = '%c'; printf(a,b,a,b,b);}";
  int b = '"';
  printf(a,b,a,b,b);
}

Ahora, si solo está buscando cosas que los programadores no pueden hacer, busque el opuesto de np-complete.

Otros consejos

Si desea obtener información sobre los límites de computabilidad, lea sobre el problema de detención

  

En teoría de la computabilidad, la detención   problema es un problema de decisión que   Se puede afirmar como sigue: dada una   Descripción de un programa y un finito.   entrada, decidir si el programa   termina de correr o correrá para siempre,   dada esa entrada.

     

Alan Turing demostró en 1936 que una   Algoritmo general para resolver el problema de parada para todos.   los posibles pares de entrada de programa no pueden existir

Claro que lo es. ¡Así es como funcionan muchos virus!

Ponga su cabeza en torno a esto: teoría de computabilidad .

Sí, eso es lo que hacen la mayoría de las macros de Lisp (solo para un ejemplo).

Sí, ciertamente lo es, aunque tal vez no en el contexto al que se refiere consulte este publicación en t4.

Si observa la Programación Funcional que tiene muchas oportunidades de escribir código que genera más código, la forma en que un lenguaje como Lisp no distingue entre código y datos es una parte importante de su poder.

Rails genera las diversas clases de controlador y modelo predeterminadas a partir del esquema de la base de datos cuando crea una nueva aplicación. Es bastante estándar hacer este tipo de cosas con lenguajes dinámicos. Tengo algunos fragmentos de PHP que generan archivos php, simplemente porque era la solución más simple al problema con el que estaba lidiando en ese momento.

Entonces es posible. Sin embargo, en cuanto a la pregunta que está haciendo, eso es quizás un poco vago, ¿qué entorno e idioma está utilizando? ¿Qué espera que haga el código y por qué debe agregarse? Un ejemplo concreto puede traer respuestas más directamente relevantes.

Sí, es posible crear generadores de código. La mayoría de las veces toman la entrada del usuario y producen un código válido. Pero hay otras posibilidades.

Los programas de auto-modificación también son posibles. Pero eran más comunes en la era dos.

Por supuesto que puedes! De hecho, si usa un lenguaje dinámico, la clase puede cambiar a sí misma (u otra clase) mientras el programa aún se está ejecutando. Incluso puede crear nuevas clases que no existían antes. Esto se denomina metaprogramación y le permite a su código ser muy flexible.

Estás confundiendo / confundiendo dos significados de la palabra "escribir". Un significado es la escritura física de bytes en un medio, y el otro es el diseño de software. Por supuesto, puede hacer que el programa haga lo primero, si fue diseñado para hacerlo.

La única forma en que un programa puede hacer algo que el programador no pretendía hacer de manera explícita, es comportarse como una criatura viva: mutar (incorporar en sí mismos fragmentos de entorno) y replicar diferentes mutantes a diferentes velocidades (para evitar la extinción completa, si una mutación es terminal).

Claro que lo es. Escribí un efecto para Paint.NET * que te da un editor y te permite escribir un efecto gráfico "al vuelo". Cuando haces una pausa para escribirlo, lo compila en un dll, lo carga y lo ejecuta. Ahora, en el editor, solo necesita escribir la función de procesamiento real, todo lo necesario para crear una dll lo escribe el editor y se envía al compilador de C #.

Puede descargarlo gratis aquí: http://www.boltbait.com/pdn/codelab /

De hecho, incluso hay una opción para ver todo el código que se escribió para usted antes de que se envíe al compilador. El archivo de ayuda (vinculado arriba) habla de todo.

El código fuente también está disponible para descargar desde esa página.

* Paint.NET es un editor de imágenes gratuito que puede descargar aquí: http://getpaint.net

En relación con la inteligencia artificial, eche un vistazo a Algoritmos evolutivos .

  

haga una copia de la fuente del programa que ejecuta, modifique ese programa y agregue un método a la clase que es, y luego ejecute la copia del programa y finalice solo

También puede generar código, construirlo en una biblioteca en lugar de un ejecutable y luego cargar dinámicamente la biblioteca sin siquiera salir del programa que se está ejecutando actualmente.

Los lenguajes dinámicos por lo general no funcionan como usted sugiere, ya que no tienen un paso de compilación completamente separado. No es necesario que un programa modifique su propio código fuente, vuelva a compilarlo y comience desde cero. Normalmente, la nueva funcionalidad se compila y se vincula sobre la marcha.

Common Lisp es un lenguaje muy bueno para practicar esto, pero hay otros en los que puedes crear código y ejecutarlo allí mismo. Normalmente, esto se realizará a través de una función llamada " eval " o algo similar. Perl tiene un " eval " función, y generalmente es común que los lenguajes de scripting tengan la capacidad.

Hay muchos programas que escriben otros programas, como yacc o bison, pero no tienen la misma calidad dinámica que parece estar buscando.

Eche un vistazo a bucle de Langtom . Este es el ejemplo más simple de reproducción automática " programa " ;.

Hay toda una clase de cosas llamadas "Generadores de código". (Aunque, un compilador también se ajusta a la descripción cuando la configura). Y esos describen las dos áreas de estas bestias.

La mayoría del código se genera, toma algún tipo de información del usuario (la mayoría toma un esquema de base de datos) y el código fuente del producto que luego se compila.

Los más avanzados pueden generar código ejecutable. Con .NET, hay un espacio de nombres completo (System.CodeDom) dedicado a la creación de código ejecutable. Estos objetos, puede tomar código C # (u otro idioma), compilarlo y vincularlo a su programa que se está ejecutando actualmente.

Hago esto en PHP.

Para conservar la configuración de una clase, mantengo una variable local llamada $ data . $ data es solo un diccionario / tabla hash / assoc-array (dependiendo de donde vienes).

Cuando carga la clase, incluye un archivo php que básicamente define datos. Cuando guardo la clase, escribe el PHP para cada valor de los datos. Es un proceso de escritura lento (y actualmente hay algunos problemas de concurrencia) pero es más rápido que leerlo. Mucho más rápido (y más ligero) que usar una base de datos.

Algo como esto no funcionaría para todos los idiomas. A mí me funciona en PHP porque PHP es muy rápido.

Siempre ha sido posible escribir generadores de código. Con la tecnología XML, el uso de generadores de código puede ser una herramienta esencial. Supongamos que trabaja para una empresa que tiene que lidiar con archivos XML de otras compañías. Es relativamente sencillo escribir un programa que use el analizador XML para analizar el nuevo archivo XML y escribir otro programa que tenga todas las funciones de devolución de llamada configuradas para leer archivos XML de ese formato. Aún tendría que editar el nuevo programa para hacerlo específico a sus necesidades, pero el tiempo de desarrollo cuando un nuevo archivo XML (nueva estructura, nuevos nombres) se reduce mucho al usar este tipo de generador de código. En mi opinión, esto es parte de la fortaleza de la tecnología XML.

Lisp lisp lisp lisp lisp: p

Bromeando, si quieres que el código que se genera se ejecute y tienes tiempo para perder el aprendizaje y romper tu mente con cosas recursivas que generan más código, intenta aprender lisp :)

(eval '(or true false))
  

¿no sería bueno tener una clase que pudiera hacer una copia de la fuente del programa que ejecuta, modificar ese programa y agregar un método a la clase que es, y luego ejecutar la copia del programa y terminar en sí mismo

Casi no hay casos en que eso resuelva un problema que no pueda resolverse " mejor " utilizando código no auto-modificable ..

Dicho esto, hay algunos casos muy comunes (útiles) de código que escriben otro código ... El más obvio es cualquier aplicación web del lado del servidor, que genera HTML / Javascript (bueno, HTML es un marcado, pero es idéntico en teoría). Además, cualquier secuencia de comandos que modifique un entorno de terminales normalmente genera una secuencia de comandos de shell que es evaluada por la shell principal. wxGlade genera código para que cree interfaces gráficas de usuario basadas en wx.

Consulte nuestro Kit de herramientas de reingeniería de software DMS . Esta es una maquinaria de propósito general para leer y modificar programas, o generar programas mediante el ensamblaje de fragmentos.

Esta es una de las cuestiones fundamentales de la Inteligencia Artificial. Personalmente espero que no sea posible, de lo contrario, pronto me quedaré sin trabajo. :)

Se llama meta-programación y es una buena forma de escribir programas útiles , y un interesante tema de investigación. Seres Artificiales de Jacques Pitrat: la conciencia de una máquina consciente debería interesarle mucho. Está mayormente relacionado con programas informáticos basados ??en el metaconocimiento.

Otro término relacionado es programación de múltiples etapas (porque hay varias etapas de programas, cada uno generando el siguiente).

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