A call graph is a directed graph that represents calling relationships between subroutines in a computer program, where nodes represent functions and edges represent calls from one function to another. It is a crucial tool in static program analysis, helping developers understand program structure, optimize performance, and detect potential issues such as dead code or recursion cycles.