samp kbd etiquetas etiqueta descripcion code theory

theory - kbd - etiquetas html



¿Es posible escribir código para escribir código? (23)

He oído que hay algunas cosas que uno no puede hacer como programador de computadoras, pero no sé cuáles 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 ejecutarlo la copia del programa y terminar por sí mismo. ¿Es posible que el código escriba código?


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 termínelo

También puede generar código, compilarlo 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.


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


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


Claro que lo es. Escribí un efecto para Paint.NET * que le da un editor y le permite escribir un efecto gráfico "sobre la marcha". Cuando pausas al tipear, lo compila en un dll, lo carga y lo ejecuta. Ahora, en el editor, solo necesita escribir la función de representación real, todo lo demás necesario para crear un 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ó antes de que se envíe al compilador. El archivo de ayuda (vinculado arriba) habla sobre eso.

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

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




Estás confundiendo / combinando 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 de que un programa haga algo que el programador no tuvo la intención explícita de hacer es comportarse como una criatura viviente: mutar (incorporar partes del entorno) y replicar diferentes mutantes a diferentes velocidades (para evitar la extinción completa) , si una mutación es terminal).


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


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

La mayoría de los códigos se generan, toman alguna forma de entrada de 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. Con estos objetos, puede tomar el código C # (u otro idioma), compilarlo y vincularlo con su programa actualmente en ejecución.


Lo hago en PHP.

Para persistir en la configuración de una clase, conservo una variable local llamada $data . $ data es solo un diccionario / hashtable / assoc-array (dependiendo de dónde vienes).

Cuando carga la clase, incluye un archivo php que básicamente define los datos. Cuando guardo la clase, escribe el PHP para cada valor de datos. Es un proceso de escritura lento (y actualmente hay algunos problemas de concurrencia) pero es más rápido que la lectura ligera. 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. Funciona para mí en PHP porque PHP es mucho sobre la marcha.


Los lenguajes dinámicos generalmente no funcionan del modo que 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, recompile 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 en ese momento. Típicamente, esto será a través de una función llamada "eval" o algo similar. Perl tiene una función "eval", y generalmente es común que los lenguajes de scripting tengan la habilidad.

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


Sí, ciertamente lo es, aunque tal vez no en el contexto al que te refieres, echa un vistazo a esta publicación en t4.


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

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


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


Si desea conocer los límites de la computabilidad, lea sobre el problema de la detención.

En teoría de la computabilidad, el problema de detención es un problema de decisión que se puede expresar de la siguiente manera: dada una descripción de un programa y una entrada finita, decida si el programa termina de ejecutarse o si se ejecutará para siempre, dada esa entrada.

Alan Turing demostró en 1936 que no puede existir un algoritmo general para resolver el problema de detención para todos los posibles pares de entrada de programa.


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

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

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


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 tratar con archivos XML de otras compañías. Es relativamente sencillo escribir un programa que utiliza 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. Todavía 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 corta mucho utilizando este tipo de generador de código. En mi opinión, esto es parte de la fuerza de la tecnología XML.


¿No sería bueno tener una clase que podría 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 el mismo

Casi no hay casos en que eso pueda resolver un problema que no puede ser resuelto "mejor" usando un código que no se auto modifica.

Dicho esto, hay algunos casos muy comunes (útiles) de código que escribe otro código. El más obvio es cualquier aplicación web del lado del servidor, que genera HTML / Javascript (bueno, HTML es marcado, pero es idéntico en teoría). Además, cualquier secuencia de comandos que modifique un entorno de terminales suele generar un script de shell que evalúa el shell primario. wxGlade genera código para crear GUI bare-bone wx-based.


Comienza mirando quines , luego en Macro-Assemblers y luego lex & yacc , y flex & bison . Luego considera el código de auto modificación .

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 bien, si solo está buscando cosas que los programadores no pueden hacer, busquen lo opuesto a np-complete.


Echa un vistazo al bucle de Langtom . Este es el ejemplo más simple de "programa" autorreproductor.


Lisp lisp lisp lisp: p

Bromeando, si quieres código que genere código para ejecutar y tienes tiempo para perder el aprendizaje y romper tu mente con cosas recursivas generando más código, intenta aprender ceceo :)

(eval ''(or true false))