stringtranslate.com

Gráfico de flujo de control

Algunos ejemplos de CFG:
(a) un bucle if-then-else
(b) un bucle while
(c) un bucle natural con dos salidas, por ejemplo while con una interrupción if... en el medio; no estructurado pero reducible
(d) un CFG irreducible: un bucle con dos puntos de entrada, por ejemplo, ir a un bucle while o for
Un gráfico de flujo de control utilizado por el compilador Rust para realizar codegen.

En informática , un gráfico de flujo de control ( CFG ) es una representación , utilizando notación gráfica , de todos los caminos que pueden recorrerse a través de un programa durante su ejecución . El gráfico de control de flujo fue descubierto por Frances E. Allen , [1] quien señaló que Reese T. Prosser usó matrices de conectividad booleanas para el análisis de flujo antes. [2]

El CFG es esencial para muchas optimizaciones de compiladores y herramientas de análisis estático .

Definición

En un gráfico de flujo de control, cada nodo del gráfico representa un bloque básico , es decir, una secuencia de código en línea recta con un único punto de entrada y un único punto de salida, donde no se producen bifurcaciones ni saltos dentro del bloque. Los bloques básicos comienzan con objetivos de salto y terminan con saltos o instrucciones de bifurcación. Los bordes dirigidos se utilizan para representar saltos en el flujo de control . En la mayoría de las presentaciones, hay dos bloques especialmente designados: el bloque de entrada , a través del cual el control ingresa al gráfico de flujo, y el bloque de salida , a través del cual sale todo el flujo de control. [3]

Por su procedimiento de construcción, en un CFG, toda arista A→B tiene la propiedad de que:

grado externo (A) > 1 o grado interno (B) > 1 (o ambos). [4]

Por tanto, el CFG se puede obtener, al menos conceptualmente, partiendo del gráfico de flujo (completo) del programa (es decir, el gráfico en el que cada nodo representa una instrucción individual) y realizando una contracción de arista para cada arista que falsifique el predicado anterior, es decir, contrayendo cada borde cuyo origen tiene una única salida y cuyo destino tiene una única entrada. Este algoritmo basado en contracciones no tiene importancia práctica, excepto como ayuda de visualización para comprender la construcción del CFG, porque el CFG se puede construir de manera más eficiente directamente desde el programa al escanearlo en busca de bloques básicos . [4]

Ejemplo

Considere el siguiente fragmento de código:

0: (A) t0 = núm_lectura1: (A) si t0 mod 2 == 02: (B) imprime t0 + "es par".3: (B) ir a 54: (C) imprime t0 + "es impar".5: (D) finalizar el programa

En lo anterior, tenemos 4 bloques básicos: A de 0 a 1, B de 2 a 3, C en 4 y D en 5. En particular, en este caso, A es el "bloque de entrada", D el "bloque de salida". " y las líneas 4 y 5 son objetivos de salto. Un gráfico para este fragmento tiene aristas de A a B, de A a C, de B a D y de C a D.

Accesibilidad

La accesibilidad es una propiedad gráfica útil en la optimización.

Si un subgrafo no está conectado desde el subgrafo que contiene el bloque de entrada, ese subgrafo es inalcanzable durante cualquier ejecución, al igual que el código inalcanzable ; en condiciones normales se puede eliminar de forma segura.

Si no se puede acceder al bloque de salida desde el bloque de entrada, puede existir un bucle infinito . No todos los bucles infinitos son detectables; consulte Problema de detención . Allí también puede existir una orden de detención.

El código inalcanzable y los bucles infinitos son posibles incluso si el programador no los codifica explícitamente: optimizaciones como la propagación constante y el plegado constante seguidos de un subprocesamiento de salto pueden colapsar múltiples bloques básicos en uno, hacer que los bordes se eliminen de un CFG, etc., por lo que posiblemente desconectar partes del gráfico.

relación de dominación

Un bloque M domina un bloque N si cada camino desde la entrada que llega al bloque N tiene que pasar por el bloque M. El bloque de entrada domina todos los bloques.

En la dirección inversa, el bloque M postdomina el bloque N si cada camino desde N hasta la salida tiene que pasar por el bloque M. El bloque de salida postdomina todos los bloques.

Se dice que un bloque M domina inmediatamente al bloque N si M domina a N, y no hay ningún bloque P intermedio de modo que M domine a P y P domine a N. En otras palabras, M es el último dominador en todos los caminos desde la entrada a N. Cada bloque tiene un dominador inmediato único.

De manera similar, existe una noción de postdominador inmediato , análoga a dominador inmediato .

El árbol dominador es una estructura de datos auxiliar que representa las relaciones dominadoras. Hay un arco del Bloque M al Bloque N si M es un dominador inmediato de N. Este gráfico es un árbol, ya que cada bloque tiene un dominador inmediato único. Este árbol tiene sus raíces en el bloque de entrada. El árbol dominador se puede calcular de manera eficiente utilizando el algoritmo de Lengauer-Tarjan .

Un árbol postdominador es análogo al árbol dominador . Este árbol tiene sus raíces en el bloque de salida.

Bordes especiales

Un borde posterior es un borde que apunta a un bloque que ya se ha encontrado durante un recorrido en profundidad ( DFS ) del gráfico. Los bordes posteriores son típicos de los bucles.

Un borde crítico es un borde que no es el único borde que sale de su bloque de origen ni el único borde que ingresa a su bloque de destino. Estos bordes deben dividirse : se debe crear un nuevo bloque en el medio del borde para poder insertar cálculos en el borde sin afectar ningún otro borde.

Una arista anormal es una arista cuyo destino se desconoce. Las construcciones de manejo de excepciones pueden producirlas. Estos bordes tienden a inhibir la optimización.

Una arista imposible (también conocida como arista falsa ) es una arista que se ha agregado al gráfico únicamente para preservar la propiedad de que el bloque de salida domina todos los bloques. Nunca se puede atravesar.

Gestión de bucles

Un encabezado de bucle (a veces llamado punto de entrada del bucle) es un dominador que es el objetivo de un borde posterior que forma un bucle. El encabezado del bucle domina todos los bloques del cuerpo del bucle. Un bloque puede ser un encabezado de bucle para más de un bucle. Un bucle puede tener múltiples puntos de entrada, en cuyo caso no tiene un "encabezado de bucle".

Supongamos que el bloque M es un dominador con varios bordes entrantes, algunos de ellos son bordes posteriores (por lo que M es un encabezado de bucle). Es ventajoso realizar varias pasadas de optimización para dividir M en dos bloques M pre y M loop . El contenido de M y los bordes posteriores se mueven a M loop , el resto de los bordes se mueven para apuntar a M pre y se inserta un nuevo borde de M pre a M loop (de modo que M pre sea el dominador inmediato de M loop). ). Al principio, M pre estaría vacío, pero los pases como el movimiento del código invariante en bucle podrían poblarlo. M pre se llama encabezado previo del bucle y M loop sería el encabezado del bucle.

Reducibilidad

Un CFG reducible es aquel con bordes que se pueden dividir en dos conjuntos disjuntos: bordes delanteros y bordes traseros, de modo que: [5]

Los lenguajes de programación estructurados a menudo están diseñados de manera que todos los CFG que producen sean reducibles, y las declaraciones de programación estructuradas comunes como IF, FOR, WHILE, BREAK y CONTINUE producen gráficos reducibles. Para producir gráficos irreducibles, se necesitan declaraciones como GOTO . Algunas optimizaciones del compilador también pueden producir gráficos irreducibles.

Conexión de bucle

La conectividad del bucle de un CFG se define con respecto a un árbol de búsqueda en profundidad (DFST) dado del CFG. Este DFST debe tener su raíz en el nodo inicial y cubrir todos los nodos del CFG.

Los bordes en el CFG que van desde un nodo hasta uno de sus ancestros DFST (incluido él mismo) se denominan bordes posteriores.

La conectividad del bucle es el mayor número de bordes posteriores que se encuentran en cualquier ruta libre de ciclos del CFG. En un CFG reducible, la conectividad del bucle es independiente del DFST elegido. [6] [7]

La conectividad de bucle se ha utilizado para razonar sobre la complejidad temporal del análisis del flujo de datos . [6]

Gráfico de flujo de control entre procedimientos

Mientras que los gráficos de flujo de control representan el flujo de control de un solo procedimiento, los gráficos de flujo de control entre procedimientos representan el flujo de control de programas completos. [8]

Ver también

Referencias

  1. ^ Frances E. Allen (julio de 1970). "Análisis de flujo de control". Avisos SIGPLAN . 5 (7): 1–19. doi :10.1145/390013.808479.
  2. ^ Reese T. Prosser (1959). "Aplicaciones de matrices booleanas al análisis de diagramas de flujo". Artículos presentados en la conferencia informática conjunta IRE-AIEE-ACM del este del 1 al 3 de diciembre de 1959 . págs. 133-138. doi :10.1145/1460299.1460314.
  3. ^ Yousefi, Javad (2015). "Enmascarar errores de flujo de control de sucesores incorrectos mediante redundancia de datos". 2015 V Congreso Internacional de Ingeniería Informática y del Conocimiento (ICCKE). IEEE. págs. 201-205. doi :10.1109/ICCKE.2015.7365827. ISBN 978-1-4673-9280-8.
  4. ^ ab Peri L. Tarr; Alexander L. Lobo (2011). Ingeniería de software: las continuas contribuciones de Leon J. Osterweil . Medios de ciencia y negocios de Springer. pag. 58.ISBN 978-3-642-19823-6.
  5. ^ "Copia archivada" (PDF) . Archivado desde el original (PDF) el 1 de agosto de 2020 . Consultado el 24 de marzo de 2018 .{{cite web}}: CS1 maint: archived copy as title (link)
  6. ^ ab Kam, John B.; Ullman, Jeffrey D. (1 de enero de 1976). "Análisis de flujo de datos global y algoritmos iterativos". Revista de la ACM . 23 (1): 158-171. doi : 10.1145/321921.321938 . ISSN  0004-5411. S2CID  162375.
  7. ^ Offner, Carl. "Notas sobre los algoritmos gráficos utilizados en la optimización de los compiladores" (PDF) . Archivado (PDF) desde el original el 25 de julio de 2008 . Consultado el 13 de abril de 2018 .
  8. ^ "Análisis de flujo de control" (PDF) . 2016. Archivado (PDF) desde el original el 19 de diciembre de 2016.

Enlaces externos

Ejemplos