2009-09-25 12 views
19

Creo que esta podría ser una pregunta clásica, pero no conozco ninguna respuesta. ¿Puede un programa generar una copia de sí mismo y, de ser así, hay un programa corto que hace esto?¿Puede un programa generar una copia de sí mismo?

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 en algo como esto:

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

pero no sé cómo continuar ...

+5

Ragnarius - Es posible que desee leer "Gödel, Escher y Bach" Por Douglas Hoffstader. Su libro describe otras formas de algoritmos y la naturaleza de los algoritmos que es similar a su interés en quines. Consideraría este texto "clásico" de ciencias de la computación que tiene una gran relación con su pregunta. –

+2

Pruebe esta búsqueda: http://stackoverflow.com/search?q=quine – dmckee

Respuesta

14

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

  1. se escribe código que toma una cadena literal s y lo imprime, mientras que las ocurrencias reemplazar (o la los sucesos) de una subcadena especial foo en s por el valor de s.

  2. Toma el código fuente completo del programa hasta el momento y lo utiliza como la definición de s. pero excluye la definición desde la cadena, sustituyéndola por foo.

Bueno, esa es la idea general. El resto son detalles de formateo de cadenas, realmente.

5

Esto se llama un Quine:

Un quine es un programa de ordenador que no toma ninguna entrada y produce una copia de su propio código fuente como su único resultado. Los términos estándar para estos programas en la teoría de computabilidad y la literatura de ciencias de la computación son programas autoreplicantes, programas de autorreproducción y programas de autocopia.

Un quine es un punto fijo de un entorno de ejecución, cuando el entorno de ejecución se ve como una función. Quines son posibles en cualquier lenguaje de programación completo de Turing, como consecuencia directa del teorema de recursión de Kleene. Por diversión, los programadores a veces intentan desarrollar la quine más corta posible en cualquier lenguaje de programación dado.

Fuente: Wikipedia

+0

¡Muchas gracias!/ragnarius – ragnarius

1

Si escribe un quine, tenga cuidado de que las copias tampoco escriban copias de sí mismas hasta el infinito y acaben dominando el mundo.

+0

Esa es la diferencia entre escribir una copia y ejecutarla. –

+0

Si las copias comienzan a reproducirse, deberán ejecutarse. – Buggieboy

+2

No fue hasta este momento que equiparé un quine con RNA. ¿Dónde están las vacunas Quine, pregunto? ¡Sálvense, gente! –

1

En el language invented by Jon Skeet, el siguiente operador imprime "¡Hola, mundo! \ N".

h 

que puede hacer una modificación de este lenguaje para que los siguientes programa imprime "Hola, mundo! \ N":

Hello, world! 

Así que ese es el programa que imprima en sí.

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

+0

Esto es profundo. – Buggieboy

+2

Sí, y cuando lo pienso también podría imaginarme un lenguaje donde el operador h realmente emite h. – ragnarius

+0

Esto, como usar solo 'H' para Hello World ya se ha documentado en HQ9 +, en el cual' Q' es un comando que imprime el código fuente del programa. También '9' imprime la letra de '99 botellas de cerveza en una pared 'y' + 'aumenta el acumulador. Casualmente, solía tener un intérprete HQ9 + completamente funcional en mi calculadora gráfica. :) – Joren

4

¡Esta es una pregunta clásica!

Más allá de la existencia de determinada quines, un resultado importante en la teoría de la computabilidad es que por cualquier función es posible que desee calcular, existe un programa que "conoce su propio texto del programa", es decir, que podrían imprimirse si se desea . Este teorema se llama Kleene's second recursion theorem.

1

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

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

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

0

“Introducción a la Teoría de la Computación” de Michael Sipser explica en uno de los capítulos cómo construir un 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 obtenga ese libro e intente implementar el programa usted mismo en su idioma favorito. Hay muchos otros teoremas divertidos en ese libro.

-kiran

0
// save it as file.cpp 

#include <iostream> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    system("cat file.cpp"); 
    return 0; 
} 
0

es posible en Java, pero con algunas limitaciones

He escrito un código simple en Java que imprime en sí. Puede usar literales de C/C++ para usar el mismo programa. Puedes agregar lo que quieras dentro de este programa, se imprimirá por completo.

Condiciones

  1. archivo Java no debe estar dentro de cualquier paquete

  2. Estructura de la carpeta no debe contener ninguna carpeta con espacios en su nombre

  3. objetivo recopilación debería ser por defecto o misma carpeta donde reside el archivo java

import java.io.FileInputStream; import java.net.URL;

PrintYourself public class {

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); 
    } 

} 

}

Cuestiones relacionadas