Gráfico de llamadas

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 6 de mayo de 2020; las comprobaciones requieren 4 ediciones .

Un gráfico de llamadas ( ing.  Call graph ) en la teoría de compiladores de construcción  es un gráfico dirigido que representa llamadas entre subrutinas en un programa de computadora . En particular, cada nodo representa un procedimiento, y cada arco (f, g) muestra que el procedimiento f llama al procedimiento g.

Un gráfico de llamadas es el resultado de un análisis de programa que se puede utilizar para la comprensión humana del programa o como base para un análisis posterior. Un uso simple del gráfico de llamadas es buscar procedimientos que nunca se llaman.

El gráfico de llamadas puede ser dinámico o estático. El gráfico de llamadas dinámicas es un registro de la ejecución del programa. El gráfico de llamadas estáticas pretende representar todas las variantes posibles de ejecución del programa.

Definición

El llamado grafo de un programa es un conjunto de nodos y aristas , en el sentido de que [1]

  1. cada procedimiento del programa corresponde a un nodo,
  2. cada punto de llamada, es decir, el lugar en el programa donde se llama al procedimiento, corresponde a un nodo del gráfico,
  3. si el punto de llamada c puede llamar al procedimiento p , el gráfico tiene una arista desde el nodo c hasta el nodo p .

Muchos programas escritos en lenguajes de programación como C y Fortran realizan llamadas de procedimiento directamente, de modo que el código de destino de cada llamada se puede determinar de forma estática. En este caso, cada punto de llamada en el gráfico tiene un borde único para exactamente un procedimiento. Las llamadas indirectas son muy comunes en los lenguajes de programación orientados a objetos.

Ejemplo

Un programa en el lenguaje de programación C que declara un puntero global pf a una función que toma como parámetro y devuelve un número entero . Hay dos funciones de este tipo, fun1 y fun2, y una función principal cuyo tipo no coincide con el puntero pf. Los tres puntos de llamada están etiquetados como c1 , c2 y c3  ; estas etiquetas no forman parte del programa [2] .

int ( * pf ) ( int ); int fun1 ( int x ) { si ( x < 10 ) c1 : retorno ( * pf )( x + l ); si no devuelve x ; } int fun2 ( int y ) { pf = & diversión1 ; c2 : retorno ( * pf )( y ); } vacío principal () { pf = & diversión2 ; c3 : ( * pf )( 5 ); }

El análisis más simple de lo que pf podría señalar es examinar los tipos de funciones. Las funciones fun1 y fun2 son del mismo tipo que el puntero pf, mientras que la función principal es de un tipo diferente. Un análisis más cuidadoso del programa revela que el puntero pf en la función principal se vuelve igual a fun2, y luego en la función fun2 se le asigna el valor fun1. No hay otras asignaciones al puntero pf en el programa, por lo que, en particular, el puntero pf no puede apuntar a la función principal [2] .

Notas

  1. Aho, Lam et al., 2008 , pág. 1062.
  2. 1 2 Aho, Lam et al., 2008 , pág. 1063.

Literatura

en ruso

  • Alfred W. Aho, Monica S. Lam, Ravi Seti, Jeffrey D. Ullman. Compiladores: Principios, Técnicas y Herramientas = Compiladores: Principios, Técnicas y Herramientas. - Editorial Williams, 2008. - ISBN 0-321-48681-1 .

en inglés

  • Ryder, BG, "Construcción del gráfico de llamadas de un programa", Ingeniería de software, IEEE Transactions on, vol. SE-5, n.º 3pp. 216-226, mayo de 1979 [1]
  • Grove, D., DeFouw, G., Dean, J. y Chambers, C. 1997. Construcción de gráficos de llamadas en lenguajes orientados a objetos, SIGPLAN Not. 32, 10 (octubre de 1997), 108-124. [2]
  • Callahan, D.; Carle, A.; Hall, MW; Kennedy, K., "Construcción del multigrafo de llamada de procedimiento", Ingeniería de software, IEEE Transactions on, vol.16, no.4pp.483-487, abril de 1990 [3]