Un grafic de apel ( ing. Graficul de apel ) în teoria construirii compilatoarelor este un grafic direcționat care descrie apeluri între subrutine dintr-un program de calculator . În special, fiecare nod reprezintă o procedură, iar fiecare arc (f, g) arată că procedura f apelează procedura g.
Un grafic de apel este rezultatul unei analize de program care poate fi utilizat pentru înțelegerea umană a programului sau ca bază pentru analize ulterioare. O utilizare simplă a graficului de apel este de a căuta proceduri care nu sunt niciodată apelate.
Graficul de apel poate fi dinamic sau static. Graficul de apel dinamic este o înregistrare a execuției programului. Graficul de apel static este destinat să reprezinte toate variantele posibile de execuție a programului.
Graficul de apel al unui program este un set de noduri și muchii , în sensul că [1]
Multe programe scrise în limbaje de programare precum C și Fortran fac apeluri de procedură direct, astfel încât codul țintă al fiecărui apel poate fi determinat static. În acest caz, fiecare punct de apel din grafic are o margine unică pentru exact o procedură. Apelurile indirecte sunt foarte frecvente în limbajele de programare orientate pe obiecte.
Un program în limbajul de programare C care declară un pointer global pf la o funcție care ia ca parametru și returnează un număr întreg . Există două funcții de acest tip, fun1 și fun2, și o funcție principală al cărei tip nu se potrivește cu indicatorul pf. Cele trei puncte de apel sunt etichetate c1 , c2 și c3 - aceste etichete nu fac parte din programul [2] .
int ( * pf )( int ); int fun1 ( int x ) { dacă ( x < 10 ) c1 : return ( * pf )( x + l ); altfel returnează x ; } int fun2 ( int y ) { pf = & fun1 ; c2 : return ( * pf )( y ); } void main () { pf = & fun2 ; c3 : ( * pf )( 5 ); }Cea mai simplă analiză a ceea ce ar putea indica pf este examinarea tipurilor de funcții. Funcțiile fun1 și fun2 sunt de același tip ca și indicatorul pf, în timp ce funcția principală este de alt tip. O analiză mai atentă a programului arată că indicatorul pf din funcția principală devine egal cu fun2, iar apoi în funcția fun2 i se atribuie valoarea fun1. Nu există alte atribuiri pentru pointerul pf în program, deci, în special, pointerul pf nu poate indica funcția principală [2] .