¿Una inteligencia artificial podría depurar un programa de computadora?

Esto depende de cuánto cambio se requiera para el programa de computadora. Si usa una técnica como la programación genética de John Koza, ya está comenzando con los programas. Su población inicial podría ser mutaciones del programa para depurar. Su función de condición física sería un conjunto de entradas y salidas esperadas. Utilizando la evolución como mutación y cruce de subárbol, debería poder encontrar programas correctos que sean variaciones del programa original que se va a depurar.

Los programas genéticos como el programa “e” de SDI usarán las técnicas anteriores simultáneamente con la escalada para optimizar las instrucciones y los coeficientes.

La IA probablemente haría un buen trabajo al depurar un programa. Además, le daría una métrica de la cantidad de resultados esperados que produce. No sería tan bueno comentar y sentarse a través de recorridos de código.

Posiblemente sí, esto ya es posible en algunos casos. Las técnicas involucradas en muchos problemas de verificación caen dentro del alcance original de la IA simbólica (búsqueda, inferencia, prueba de teoremas). Estos ciertamente encuentran errores. Por ejemplo:

  • KLEE: Generación automática y sin asistencia de pruebas de alta cobertura para programas de sistemas complejos
  • SAPIC: un cálculo de Pi aplicado con estado
  • La página de inicio de TLA
  • CoProVe: verificador de protocolo de seguridad basado en restricciones
  • Herramienta Scyther

En casi todos los lugares en los que escuchas sobre la “verificación formal” o el código “probadamente correcto”, se están aplicando técnicas tradicionales de “IA”. De hecho, estas herramientas a menudo son tan cercanas como su compilador: la comprobación de tipo estático y la inferencia (unificación de estilo Prolog a nivel de tipo) es cada vez más común. Estos encuentran muchos errores en tiempo de compilación que de otro modo serían errores de tiempo de ejecución.

Este blog puede resultarle interesante: verificación, cobertura y maximización: el panorama general

¿Teóricamente o usando la tecnología de hoy?

En realidad, la respuesta a ambas es sí, es solo que hay muchos más asteriscos al lado si estás hablando de IA que podemos hacer hoy.

El problema con las IA modernas es que todavía están en la etapa útil de desarrollo idiota. Son sorprendentemente flexibles y útiles, pero carecen de la capacidad para el tipo de comprensión que necesita para depurar inteligentemente el código.

Cuando una IA de nivel humano o humano teórico se acerca al código, tiene ciertas ventajas en las que no tendemos a pensar. Saben lo que se supone que debe hacer el código (o al menos esperamos que lo hagan) y tienen al menos una familiaridad pasajera con las técnicas utilizadas para llevar a cabo ciertas cosas. Como tal, pueden determinar dónde estas técnicas no se están implementando correctamente o donde la lógica no necesariamente lo lleva a la conclusión correcta.

Sin embargo, las IA modernas no saben realmente cómo funciona el código. Tampoco son capaces de descifrar el propósito del programa o lo que constituye “trabajo”. Eso debe ser proporcionado por una fuente externa, generalmente humana, capaz de hacer el razonamiento que no pueden.

Entonces, lo que obtienes es una IA que tiene una idea general de cómo se supone que debe ser el resultado final y no tiene idea de lo que hacen las partes componentes. Entonces, dado que no puede distinguir la diferencia entre algo que funciona y algo que no funciona, simplemente comenzará a cambiar las cosas al azar y comprobará si eso lo acerca o aleja de su objetivo mal entendido.

Imagine el tipo de trabajo que obtendría de un plomero que tuviera una comprensión similar del trabajo y comenzará a ver por qué esta no es una técnica en la que generalmente se confía en el campo.

El proceso es lento, requiere muchos recursos, y aunque las estadísticas nos dicen que eventualmente llegará a la solución correcta, también nos dice que podríamos estar esperando mucho, mucho tiempo antes de que eso suceda realmente. Lo bueno es que de vez en cuando tienes accidentes felices. Debido a que el programa no conoce mejor, a veces hará algo que ningún ser humano sensato contemplaría y llegaría a una solución verdaderamente novedosa. Pero eso no es porque es más inteligente que nosotros. Es porque cuando estás pasando por tantas permutaciones tan rápido, la suerte tonta es inevitable.

Difícil de decir porque el concepto de error es esquivo.

Hay una especie de errores simples que de alguna manera ya han sido resueltos por analizadores estáticos de código. Por ejemplo, muchos errores de puntero nulo se pueden ver con frecuencia simplemente analizando estáticamente el código.

Los errores lógicos son mucho más difíciles.

¿Qué es un error?

Puede ser una desviación de las especificaciones. Por ejemplo, las especificaciones indican que en un campo en pantalla se encuentra la suma de todos los pagos en el extranjero y, debido a un error, algunos de ellos no se cuentan o se incluyen algunos pagos nacionales.

En este caso, una opción posible es tener algunos casos de prueba, es decir, pagos predefinidos de los cuales ya sabemos cuál debería ser la suma. Esto no es AI, esto es Prueba de Unidad o Prueba de Integración y ya está disponible.

O puede ser un problema con las especificaciones. Por ejemplo, en los ejemplos mencionados anteriormente, algunos pagos en el extranjero incluyen pagos a una compañía hermana que pertenece al grupo de compañías a las que pertenece nuestra compañía. No debe incluirse, pero nadie lo descubrió mientras escribía las especificaciones.

Entonces, la IA en este caso sería un programa capaz de comprender todo el contexto e inferir que, de hecho, hay dos tipos de pagos de ultramar, solo algunos de los cuales deberían incluirse … un poco difícil, ¿no?

Si. En algún momento, esperamos que los AI puedan reprogramarse, y eso implica la depuración, en cierto sentido. Sin embargo, estamos bastante lejos de eso.