Esto es difícil de responder porque, al igual que con la inteligencia artificial, una vez que lo hayamos logrado, habremos escrito un programa que lo haga. Y los críticos dirán: "bueno, ¡esta máquina no se está programando realmente en sí misma! ¡Simplemente sigue exactamente el programa que le diste!"
Bueno, sí. Lo que sea que logremos con las computadoras, lo haremos dándole un programa y lo ejecutará. Si eso es un argumento en contra, entonces no podemos lograr nada. Y sin embargo, en algún momento, la gente pensó que una computadora de ajedrez sería obviamente inteligente. Ahora pueden, y sabemos exactamente cómo, y no creemos que eso sea inteligente. Los submarinos todavía no pueden nadar.
Entonces, considera algunos ejemplos.
Desde hace décadas, hemos tenido generadores de analizadores . Les da una descripción de un idioma, se procesa y el resultado es un código para un analizador para ese idioma. Sabemos exactamente cómo se hace, pero ¿no es eso una programación de computadora en sí misma?
Segundo: editores que le informan que ha cometido un error (error de sintaxis, variable no existente, etc.). No programa nada en sí mismo, pero puede decirte que hiciste algo mal. Está muy solo en la superficie.
Idiomas en los que puedes hacer clic y arrastrar los controles de la IU, y el código que realmente los hará funcionar se genera automáticamente.
compiladores JIT. El software que puede reconocer los hotspots en el software actualmente en ejecución y reemplazar algunos de ellos por un código compilado altamente optimizado, optimizándose efectivamente mientras se ejecuta. Creo que este es un ejemplo de lo que puede parecer una programación de máquina en sí misma, hasta que sepa exactamente cómo sucede, y luego resulta que simplemente está haciendo lo que el programador le dijo, como siempre.
Juego general de juego. Este es un campo de investigación interesante, en el que los investigadores escriben programas que pueden leer descripciones de las reglas de los juegos, que luego los programas juegan unos contra otros. Entonces, en lugar de un programa de tic-tac-toe o un programa de ajedrez, estos son programas que leen las reglas de tic-tac-toe o ajedrez o algún juego nuevo creado al momento, y luego pueden jugarlos. El programa no se está programando, pero sí juega al ajedrez sin que las reglas del ajedrez hayan sido codificadas. Hubo un momento en que esto se consideraría claramente como la computadora que se enseña a sí misma algo.
Hemos dado muchos pasos pequeños en la dirección general.
Pero no puedo pensar en ningún programa que se reescriba en función de los resultados de ejecuciones anteriores, o que pueda reconocer rutinas obsoletas o ineficientes en su propio código. Creo que un día lo tendremos y no lo consideraremos nada especial, ya que será solo una característica del último compilador ...