¿Cuáles son ejemplos avanzados de software adaptativo que se reescribe a sí mismo?

Una gran cantidad de software similar a un compilador es “bootstrapped”, es decir, usa una versión para construir la siguiente. Esto es en esencia “reescribirse a sí mismo”.

Hubo una gran oleada de “metacompiladores” en los años 60 y 70 que funcionaban de manera adecuada; Estas son herramientas que mezclan BNF y la generación de código en lo que es un DSL orientado a la compilación. Muchos compiladores de C y C ++ (especialmente GCC y Clang) se utilizan para admitir su propia extensión y compilación.

Nuestro kit de herramientas de reingeniería de software DMS ofrece un conjunto de 6 DSL cooperantes. Grandes porciones de DMS se escriben usando esos mismos DSL, inspirados en gran medida por el trabajo del metacompilador. Los compiladores DSL implementados con DMS se utilizan para implementar las próximas iteraciones de DMS. Probablemente hagamos esto una vez cada dos semanas, continuamente desde 1995. Más importante aún, DMS puede leer sus propias descripciones, aplicar transformaciones y regenerar las descripciones con mejoras dictadas por las transformaciones. Hacemos esto también, pero no con tanta frecuencia.

Esa es una pregunta difícil que depende tanto de lo que constituye “reescribirse” (como todos han señalado) como de lo que constituye “software adaptativo”. Para el propósito de esta discusión, consideraré que el primero significa código auto modificable , y me enfocaré en el segundo.

Para mí, el “software adaptativo” sugiere como mínimo:

  • la capacidad de detectar la necesidad / conveniencia de auto-modificación ,
  • el uso activo de alguna forma de función de condición física para determinar si su auto-modificación realmente dio como resultado el beneficio deseado: tiempo de ejecución reducido, por ejemplo (esta función puede estar dentro o fuera del programa, pero cosas como “el mod simplemente bloqueó el programa” no cuenta), y
  • la capacidad de revertir de forma selectiva y dinámica las modificaciones individuales en función de los resultados de la función de estado físico (simplemente no se reinicia desde la imagen original del programa)

En resumen, debería poder ver que necesita cambiar, hacer el cambio, evaluar el cambio y retroceder o proceder según corresponda.

Como es de esperar, tales criterios descartan una gran cantidad de software. De todas las sugerencias hasta el momento, el “software de Jeff Darcy que genera dinámicamente código de máquina para fines de optimización” es el más cercano. En una nota personal, sé que la extensión Critcl Tcl me permitiría escribir programas Tcl que:

  • sintetizar código C personalizado / optimizado,
  • compilarlos dinámicamente en extensiones Tcl específicas de la plataforma,
  • cárguelos en línea para reemplazar los procedimientos Tcl originales, y
  • reemplace todo eso a su vez con el código Tcl original si no se cumple alguna condición.

No he tenido una razón para aprovechar esta capacidad, pero estoy seguro de que cualquier lenguaje interpretado con introspección lo suficientemente potente y las instalaciones de FFI deberían poder duplicar esta característica.

(Tenga en cuenta que, si bien muchas máquinas virtuales de alojamiento de idiomas (por ejemplo, JVM de Java y Dalvik de Android) admiten justo a tiempo optimización, ninguno de ellos AFAIK en realidad se optimiza, por lo que no cuentan).


El santo grial del “software adaptativo” es, por supuesto, un software que puede sintetizar nuevas lógicas y comportamientos sin agencia humana , en lugar de simplemente personalizar plantillas precodificadas. En este camino se encuentra el aprendizaje automático, los algoritmos genéticos, las redes neuronales y similares, pero como mi conocimiento personal en estos campos tiene varias generaciones (juego de palabras GA), alguien más puede ampliar eso.

Depende de lo que quieras decir con reescribirlo. No conozco ningún programa útil que pueda / reescribirá todo su propio código. Como mínimo, el núcleo que genera el nuevo código de máquina tiende a permanecer intacto. Por otro lado, hay bastante código que usa la generación dinámica de código como una forma de optimización. Dos ejemplos que conozco:

  • Generando dinámicamente código FFT en dispositivos móviles
  • Inside Cloudera Impala: Generación de código de tiempo de ejecución

Estoy bastante seguro de que algunas bases de datos relacionales generan dinámicamente código para consultas complejas, y lo han hecho durante mucho tiempo, pero no puedo citar ningún ejemplo específico.

Kernel de Linux. Eso es un software bastante avanzado en mi opinión, así como enormemente útil.

Linux tiene una función llamada apply_alternatives que apply_alternatives dinámicamente el código de objeto del núcleo (ya sea en el arranque o cuando se carga un nuevo módulo del núcleo). El propósito de esta función es reemplazar algunas instrucciones de código de máquina “predeterminadas” con otras instrucciones específicas de CPU que son más eficientes / más adecuadas para el sistema en el que se ejecuta el núcleo.

Supongo que el uso principal de esto es ejecutar un núcleo compilado para un sistema multiprocesador en un sistema de procesador único sin pérdida de rendimiento, en comparación con un núcleo que se compila específicamente para un sistema de procesador único. La diferencia es que un código que se ejecuta en un sistema multiprocesador necesita bloquear recursos en más lugares. Obviamente, adquirir y liberar un bloqueo lleva algo de tiempo, y ese es el caso incluso cuando no hay contención de bloqueo. Por lo tanto, cada bloqueo en el código conduce a una sobrecarga de tiempo de ejecución pequeña pero constante. El parche dinámico permite insertar las rutinas de bloqueo / desbloqueo según sea necesario, es decir, solo cuando el número de CPU> 1.

Por otro lado, si estamos hablando de la vieja idea de “evolucionar la inteligencia artificial a través del código de auto-modificación”, realmente no ha dado resultados interesantes. Ve a entender por qué. Tampoco aguantaría la respiración por nada emocionante de esto en el futuro: demasiadas personas inteligentes ya lo han intentado y fracasado.

Un código de software nunca se reescribe a sí mismo. Es posible que los datos y el comportamiento del software se adapten en función de los nuevos datos.
Por ejemplo, la corrección automática en teclados móviles mejora en función del vocabulario de los usuarios.

Si alguien afirma que diseñó un software que reescribe su propio código, debería ser un caso de uso poco común y también se vuelve inutilizable con el tiempo.

More Interesting

Cómo hacer una IA que juegue un juego

¿Cuáles son las restricciones de R en el aprendizaje de máquina práctico / industrial?

¿Cuál es la mejor manera de aprender robótica completa? ¿Cómo obtengo los conocimientos básicos de robótica para poder construir cualquier tipo de robot?

¿Cuáles son las fallas en el modelo teórico que sugieren un vínculo entre Inteligencia y Entropía?

Si los robots están reemplazando a los humanos, ¿necesitamos el crecimiento de la población para impulsar el crecimiento económico?

¿Cómo entrenó una red neuronal de Caffe en un conjunto de datos de grano fino como automóviles, pájaros, etc.?

¿Cuáles son ejemplos de industrias poco atractivas que tienen problemas que podrían resolverse mediante el uso del aprendizaje automático y la inteligencia artificial?

Cuando la inteligencia artificial (IA) se negocia en los mercados de valores, ¿qué fuente de noticias siguen la mayoría de las IA?

¿Cómo funciona una red neuronal deconvolucional?

¿Para qué sirve la extracción de características cuando puedo pasar una imagen completa a través de un clasificador de aprendizaje automático?

Si utilizamos todo nuestro conocimiento sobre IA y aprendizaje automático / profundo, ¿podríamos emplearlo para modelar la forma en que funcionan las neuronas humanas?

¿Son las computadoras reales idénticas a las máquinas de Turing?

¿Cuál es la diferencia entre inteligencia artificial y algoritmos?

¿Por qué el Servicio Meteorológico Nacional no usa inteligencia artificial para predecir el clima?

¿Sería mejor un robot formado por una simulación física en comparación con el diseñado y desarrollado por nosotros con procedimientos deterministas?