virtuales software programas programa produccion pistas para musicales musical musica mejores instrumentos gratis daw crear con componer algorithm compression complexity-theory quine

algorithm - software - ¿Puede un programa producir una copia de sí mismo?



programas para crear pistas (11)

¡Esta es de hecho una pregunta clásica!

Más allá de la existencia de Quine específicos, un resultado importante en la teoría de la computabilidad es que para cualquier función que quiera calcular, existe un programa que "conoce su propio texto de programa", es decir, que podría imprimirse si lo desea. Este teorema se llama segundo teorema de recursión de Kleene .

Creo que esta podría ser una pregunta clásica, pero no estoy al tanto de una respuesta. ¿Puede un programa emitir una copia de sí mismo y, si es así, hay un programa corto que haga esto?

No acepto el "programa vacío" como respuesta, y no acepto programas que tengan acceso a su propio código fuente. Más bien, estoy pensando algo como esto:

int main(int argc, char** argv){ printf("int main(argc, char** argv){ printf...

Pero no sé cómo continuar ...


En el lenguaje inventado por Jon Skeet, el siguiente operador imprime "¡Hola, mundo! / N".

h

Puedo hacer una modificación de este idioma para que el siguiente programa imprima "¡Hola, mundo! / N":

Hello, world!

Así que ese es el programa que se imprime solo.

Oh, ¿sientes algo extraño al respecto, mientras que tiene una definición matemática precisa y correcta? Ese es tu problema. "No aceptaré ..." ¡ja! Las matemáticas aceptan, y ella es la amante a la que sirvo, así que publico esta respuesta.


Es posible en Java, pero con algunas restricciones.

He escrito un código simple en java que se imprime solo. Puedes usar literales de C / C ++ para usar el mismo programa. Puedes agregar lo que quieras dentro de este programa, se imprimirá completamente.

Condiciones

  1. El archivo Java no debe estar dentro de ningún paquete

  2. La estructura de carpetas no debe contener ninguna carpeta con espacios en su nombre

  3. El destino de la compilación debe ser predeterminado o la misma carpeta donde reside el archivo java

    import java.io.FileInputStream; import java.net.URL; public class PrintYourself { public static void main(String[] args) { // TODO Auto-generated method stub URL location = PrintYourself.class.getProtectionDomain().getCodeSource().getLocation(); String path=location.getFile(); path=path.replace("/bin", "/src"); System.out.println(path); try{ FileInputStream st=new FileInputStream(path+"PrintYourself.java"); int i=0; while((i=st.read())!=-1){ System.out.print((char)i); } st.close(); } catch(Exception e){ System.out.println(e); } } }


Esto se llama un Quine :

Una quine es un programa de computadora que no toma ninguna entrada y produce una copia de su propio código fuente como su única salida. Los términos estándar para estos programas en la teoría de la computabilidad y en la literatura de informática son programas de autorreplicación, programas de reproducción automática y programas de copia automática.

Una quina es un punto fijo de un entorno de ejecución, cuando el entorno de ejecución se ve como una función. Las quines son posibles en cualquier lenguaje de programación completo de Turing, como consecuencia directa del teorema de recursión de Kleene. Para entretenerse, los programadores a veces intentan desarrollar la cita más corta posible en cualquier lenguaje de programación dado.

Fuente: Wikipedia


La "Introducción a la teoría de la computación" de Michael Sipser explica en uno de los capítulos cómo construir una quine. Recientemente escribí un programa Java basado en esa idea y lo publiqué en: http://bornagainprogrammer.net/2009/11/07/hello-world-from-the-tm-self/

Le sugiero que consiga ese libro e intente implementar el programa usted mismo en su idioma favorito. Hay muchos otros teoremas divertidos en ese libro.

-kirán


La idea básica de la mayoría de las quines es:

  1. Usted escribe el código que toma una cadena literal s y la imprime, mientras reemplaza las ocurrencias (o la ocurrencia) de una subcadena especial foo en s por el valor de s mismo.

  2. Tomas el código fuente completo del programa hasta ahora y lo usas como la definición de s . pero excluye la definición de s de la cadena , en lugar de reemplazarla por foo .

Bueno, esa es la idea general. El resto son detalles de formato de cadena, realmente.




Si escribe una cita, tenga cuidado de que las copias no escriban copias de sí mismas hasta el infinito y terminen apoderándose del mundo.


Supongo que permiten los idiomas interpretados. (En algún nivel, se interpretan todos los idiomas). Alguien escribe el intérprete, y si lo está escribiendo, puede agregarle las funciones integradas que desee, como una función (lispy) (foo) que no hace nada excepto imprimir " (foo) ".

O puede agregar una función de tipo macro más compleja (printMeAndMyArgs ...) .

Así que el truco está en cómo se define el problema.


// save it as file.cpp #include <iostream> #include <cstdlib> using namespace std; int main() { system("cat file.cpp"); return 0; }