stringtranslate.com

Segmentación de programas

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]

Corte estático

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).

Ejemplo

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:

  1. rebanada( suma = suma + i + w, suma),
  2. rebanada(suma = suma + i + w, i),
  3. rebanada( suma = suma + i + w, w), y
  4. { int suma=0 }.

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 sumno 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.

Enfoque de corte estático hacia adelante y ligero

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]

Corte dinámico

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 ifbloques elseque 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 ifse ejecuta el bloque y las instrucciones afectadas en el elsebloque 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 ifbloque.

Véase también

Notas

  1. ^ Korel, Bogdan; Laski, Janusz (1988). "Corte dinámico de programas". Cartas de procesamiento de información . 29 (3): 155–163. CiteSeerX  10.1.1.158.9078 . doi :10.1016/0020-0190(88)90054-3.
  2. ^ Jhala, Ranjit; Majumdar, Rupak (2005). "Path slicing". Actas de la conferencia ACM SIGPLAN de 2005 sobre diseño e implementación de lenguajes de programación . PLDI '05. Nueva York, NY, EE. UU.: ACM. págs. 38–47. doi :10.1145/1065010.1065016. ISBN 9781595930569.S2CID 5065847  .
  3. ^ Weiser, Mark David (1979). Program Slices: Formal, Psychological, and Practical Investigations of an Automatic Program Abstraction Method (Tesis doctoral). Ann Arbor, MI, EE. UU.: Universidad de Michigan.
  4. ^ Alomari, Hakam W.; Collard, Michael L.; Maletic, Jonathan I.; Alhindawi, Nouh; Meqdadi, Omar (19 de mayo de 2014). "srcSlice: segmentación estática hacia delante muy eficiente y escalable". Journal of Software: Evolution and Process . 26 (11): 931–961. CiteSeerX 10.1.1.641.8891 . doi :10.1002/smr.1651. ISSN  2047-7473. S2CID  18520643. 

Referencias

Enlaces externos