Programa de corte


En programación de computadoras , la división del programa es el cálculo del conjunto de declaraciones del programa, la división del programa , que puede afectar los valores en algún punto de interés, lo que se conoce como criterio de división . La segmentación del programa se puede utilizar en la depuración para localizar el origen de los errores más fácilmente. Otras aplicaciones de la segmentación incluyen el mantenimiento de software , la optimización , el análisis de programas y el control del flujo de información .

Las técnicas de rebanado han experimentado un rápido desarrollo desde la definición original de Mark Weiser . Al principio, la segmentación era solo estática, es decir, se aplicaba al código fuente sin más información que el código fuente. Bogdan Korel y Janusz Laski introdujeron la división dinámica , que funciona en una ejecución específica del programa (para un seguimiento de ejecución determinado). [1] Existen otras formas de corte, por ejemplo, corte de ruta. [2]

Basado en la definición original de Weiser, [3]informalmente, un segmento de programa estático S consta de todos los enunciados del programa P que pueden afectar el valor de la variable v en un enunciado x. El corte se define para un criterio de corte C = (x, v) donde x es una declaración en el programa P yv es variable en x. Un segmento estático incluye todas las declaraciones que pueden afectar el valor de la variable v en la declaración x para cualquier entrada posible. Los cortes estáticos se calculan retrocediendo las dependencias entre declaraciones. Más específicamente, para calcular el corte estático para (x, v), primero encontramos todas las declaraciones que pueden afectar directamente el valor de v antes de encontrar la declaración x. Recursivamente, para cada declaración y que puede afectar el valor de v en la declaración x, calculamos los cortes para todas las variables z en y que afectan el valor de v. La unión de todos esos cortes es el corte estático para (x, v) .

Por ejemplo, considere el programa C a continuación. Calculemos la porción para (escribir (suma), suma). El valor de sum se ve directamente afectado por las declaraciones "sum = sum + i + w" si N> 1 e "int sum = 0" si N <= 1. Por tanto, slice (write (sum), sum) es la unión de tres rebanadas y la declaración "int sum = 0" que no tiene dependencias:

Es bastante fácil ver que el segmento (suma = suma + i + w, suma) consta de "suma = suma + i + w" e "int suma = 0" porque esas son las únicas dos declaraciones previas que pueden afectar el valor de suma en "suma = suma + i + w". De manera similar, slice (sum = sum + i + w, i) solo contiene "for (i = 1; i <N; ++ i) {" y slice (sum = sum + i + w, w) solo contiene la declaración "int w = 7".

Cuando unimos todas esas declaraciones, no tenemos código ejecutable, por lo que para convertir el segmento en un segmento ejecutable, simplemente agregamos la llave final para el ciclo for y la declaración de i. El segmento ejecutable estático resultante se muestra debajo del código original a continuación.