En la construcción de compiladores , un bloque básico es una secuencia de código en línea recta sin ramificaciones de entrada excepto en la entrada y sin ramificaciones de salida excepto en la salida. [1] [2] Esta forma restringida hace que un bloque básico sea muy susceptible al análisis. [3] Los compiladores suelen descomponer los programas en sus bloques básicos como primer paso en el proceso de análisis. Los bloques básicos forman los vértices o nodos en un gráfico de flujo de control .
El código en un bloque básico tiene:
En estas circunstancias, siempre que se ejecuta la primera instrucción de un bloque básico, el resto de las instrucciones se ejecutan necesariamente exactamente una vez y en orden. [4] [5]
El código puede ser código fuente , código ensamblador o alguna otra secuencia de instrucciones.
Más formalmente, una secuencia de instrucciones forma un bloque básico si:
Esta definición es más general que la intuitiva en algunos aspectos. Por ejemplo, permite saltos incondicionales a etiquetas que no son el objetivo de otros saltos. Esta definición incorpora las propiedades que hacen que sea fácil trabajar con bloques básicos al construir un algoritmo.
Los bloques a los que se puede transferir el control después de llegar al final de un bloque se denominan sucesores de ese bloque , mientras que los bloques de los que puede haber venido el control al entrar en un bloque se denominan predecesores de ese bloque . Se puede saltar al inicio de un bloque básico desde más de una ubicación.
El algoritmo para generar bloques básicos a partir de una lista de código es simple: el analizador recorre el código y marca los límites de los bloques , que son instrucciones que pueden comenzar o finalizar un bloque porque transfieren el control o lo aceptan desde otro punto. Luego, la lista simplemente se "corta" en cada uno de estos puntos y los bloques básicos permanecen.
Tenga en cuenta que este método no siempre genera bloques básicos máximos , según la definición formal, pero generalmente son suficientes (los bloques básicos máximos son bloques básicos que no se pueden extender mediante la inclusión de bloques adyacentes sin violar la definición de un bloque básico [6] ).
Entrada : Una secuencia de instrucciones (principalmente códigos de tres direcciones ). [7]
Salida : Una lista de bloques básicos con cada instrucción de tres direcciones en exactamente un bloque.
Las instrucciones que finalizan un bloque básico incluyen las siguientes:
longjmp
exit
Las instrucciones que inician un nuevo bloque básico incluyen las siguientes:
Tenga en cuenta que, debido a que el control nunca puede pasar por el final de un bloque básico, es posible que sea necesario modificar algunas instrucciones para encontrar los bloques básicos. En particular, las bifurcaciones condicionales de paso deben cambiarse a bifurcaciones de dos vías, y las llamadas a funciones que lanzan excepciones deben tener saltos incondicionales agregados después de ellas. Para hacer esto, es posible que sea necesario agregar etiquetas al comienzo de otros bloques.