En programación informática , la segmentación de programas es el cálculo del conjunto de sentencias de programa, la segmentación de programa , que puede afectar a los valores en algún punto de interés, denominado criterio de segmentación . La segmentación de programas se puede utilizar en la depuración para localizar la fuente de los errores con mayor facilidad. 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 segmentación 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 segmentació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 segmentación, por ejemplo, la segmentación de rutas. [2]
Basándonos en la definición original de Weiser [3] , informalmente, una porción estática de un programa S consiste en todas las declaraciones en el programa P que pueden afectar el valor de la variable v en una declaración x. La porción se define para un criterio de división C=(x,v) donde x es una declaración en el programa P y v es una variable en x. Una porción estática incluye todas las declaraciones que pueden afectar el valor de la variable v en la declaración x para cualquier entrada posible. Las porciones estáticas se calculan retrocediendo las dependencias entre declaraciones. Más específicamente, para calcular la porción estática para (x,v), primero encontramos todas las declaraciones que pueden afectar directamente el valor de v antes de que se encuentre la declaración x. De manera recursiva, para cada declaración y que puede afectar el valor de v en la declaración x, calculamos las porciones para todas las variables z en y que afectan el valor de v. La unión de todas esas porciones es la porción estática para (x,v).
Por ejemplo, considere el programa C que se muestra a continuación. Calculemos la porción para ( write(sum), sum ). El valor de sum se ve afectado directamente por las instrucciones "sum = sum + i + w" si N>1 y "int sum = 0" si N <= 1. Por lo tanto, slice( write(sum), sum) es la unión de tres porciones y la instrucción "int sum = 0" que no tiene dependencias:
Es bastante fácil ver que slice(sum = sum + i + w, sum) consta de "sum = sum + i + w" y "int sum = 0" porque esas son las únicas dos declaraciones anteriores que pueden afectar el valor de sum en "sum = sum + 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 sentencias, no tenemos código ejecutable, por lo que para convertir la porción en una porción ejecutable simplemente agregamos la llave final para el bucle for y la declaración de i. La porción ejecutable estática resultante se muestra debajo del código original.
int i ; int suma = 0 ; int producto = 1 ; int w = 7 ; para ( i = 1 ; i < N ; ++ i ) { suma = suma + i + w ; producto = producto * i ; } escribir ( suma ); escribir ( producto );
La porción ejecutable estática para los criterios ( write(sum)
, suma) es el nuevo programa que se muestra a continuación.
int i ; int suma = 0 ; int w = 7 ; para ( i = 1 ; i < N ; ++ i ) { suma = suma + i + w ; } escribir ( suma );
De hecho, la mayoría de las técnicas de segmentación estática, incluida la técnica del propio Weiser, también eliminarán la write(sum)
declaración, ya que, en la declaración write(sum)
, el valor de sum
no depende de la declaración en sí. A menudo, una segmentación para una declaración particular x incluirá más de una variable. Si V es un conjunto de variables en una declaración x, entonces la segmentación para (x, V) es la unión de todas las segmentaciones con criterios (x, v) donde v es una variable en el conjunto V.
Un enfoque de segmentación muy rápido y escalable, aunque ligeramente menos preciso, es extremadamente útil por varias razones. Los desarrolladores tendrán un costo muy bajo y medios prácticos para estimar el impacto de un cambio en cuestión de minutos en lugar de días. Esto es muy importante para planificar la implementación de nuevas características y comprender cómo se relaciona un cambio con otras partes del sistema. También proporcionará una prueba económica para determinar si se justifica un análisis completo, más costoso, del sistema. Un enfoque de segmentación rápido abrirá nuevas vías de investigación en métricas y la extracción de historiales basados en segmentación. Es decir, la segmentación ahora se puede realizar en sistemas muy grandes y en historiales de versiones completos en marcos de tiempo muy prácticos. Esto abre la puerta a una serie de experimentos e investigaciones empíricas que antes eran demasiado costosos de llevar a cabo. [4]
La segmentación dinámica utiliza información sobre una ejecución particular de un programa. Una segmentación dinámica contiene todas las instrucciones que realmente afectan el valor de una variable en un punto del programa para una ejecución particular del programa, en lugar de todas las instrucciones que pueden haber afectado el valor de una variable en un punto del programa para cualquier ejecución arbitraria del programa.
Un ejemplo para aclarar la diferencia entre el corte estático y el dinámico. Consideremos una pequeña parte de una unidad de programa, en la que hay un bloque de iteración que contiene un bloque if-else. Hay algunas instrucciones en ambos if
bloques else
que tienen un efecto sobre una variable. En el caso del corte estático, dado que se observa toda la unidad de programa independientemente de una ejecución particular del programa, las instrucciones afectadas en ambos bloques se incluirían en el corte. Pero, en el caso del corte dinámico, consideramos una ejecución particular del programa, en la que if
se ejecuta el bloque y las instrucciones afectadas en el else
bloque no se ejecutan. Por lo tanto, es por eso que en este caso de ejecución particular, el corte dinámico contendría solo las instrucciones en el if
bloque.