Red de conocimiento informático - Material del sitio web - Cómo utilizar AST para generar un gráfico de flujo de control de un programa

Cómo utilizar AST para generar un gráfico de flujo de control de un programa

La razón por la cual los árboles de sintaxis abstracta (AST) son incompatibles con el análisis de procesos en lenguajes de programación con características de programación estructuradas es que estos lenguajes tienen estructuras de sintaxis como ramificación, bucle, interrupción/continuación o estructuras de sintaxis restrictivas como C#. Aunque se omiten algunos detalles sintácticos, la estructura del AST todavía está cerca de la sintaxis del lenguaje, por lo que el flujo de control en el AST suele estar implícito en los nodos correspondientes a las estructuras sintácticas anteriores. Para empeorar las cosas, muchos de estos lenguajes de programación tienen expresiones condicionales (generalmente el operador ternario ?:) y expresiones lógicas con semántica de evaluación de cortocircuito (generalmente los operadores binarios &, ||). El flujo de control también está implícito en estos " expresiones", escondidas aún más profundamente.

Por lo tanto, los enfoques ortodoxos recomiendan exponer explícitamente el flujo de control convirtiendo el AST en una representación intermedia (IR) más detallada antes de realizar el análisis del flujo de datos. Es este enfoque el que enseña Tiger Books, donde el Capítulo 7 cubre la generación de IR a partir de AST y el Capítulo 8 cubre el flujo de control y los bloques básicos en los IR. Esto fue mencionado en respuestas anteriores de @vczh y @Wei Chen. La respuesta de @ShaoCheng mencionó los Capítulos 8-9 del libro Dragón, y creo que sería mejor incluir también el Capítulo 6 (especialmente 6.6 Control Flow).

Para el análisis del flujo de datos, no importa si el IR está en forma de árbol, DAG o lineal, siempre que el flujo de control y las dependencias de los datos sean fáciles de analizar. La forma SSA de inter-IC expone ambos aspectos, especialmente la relación uso-definición (algunos inter-IC mantienen además relaciones definición-uso) y, por lo tanto, es popular entre los compiladores y analizadores de programas modernos. .