Backpatching en el diseño del compilador

Backpatching es básicamente un proceso de cumplimiento de información no especificada. Esta información es de etiquetas. Básicamente utiliza las acciones semánticas apropiadas durante el proceso de generación de código. Puede indicar la dirección de la etiqueta en declaraciones goto mientras produce TAC para las expresiones dadas. Aquí, básicamente, se utilizan dos pases porque asignar las posiciones de estas declaraciones de etiquetas en un solo paso es bastante desafiante. Puede dejar estas direcciones sin identificar en la primera pasada y luego completarlas en la segunda ronda. Backpatching es el proceso de llenar vacíos en transformaciones e información incompletas.

Necesidad de parchear:

Backpatching se utiliza principalmente para dos propósitos:

1. Expresión booleana:

Las expresiones booleanas son declaraciones cuyos resultados pueden ser verdaderos o falsos. Una expresión booleana que lleva el nombre del matemático George Boole es una expresión que se evalúa como verdadera o falsa. Veamos algunos ejemplos de lenguaje común:

  • Mi color favorito es el azul. → cierto
  • Tengo miedo a las matemáticas. → falso
  • 2 es mayor que 5. → falso

2. Declaraciones de flujo de control:

El flujo de declaraciones de control debe controlarse durante la ejecución de declaraciones en un programa. Por ejemplo:

The flow of control statements

El flujo de sentencias de control

3. Etiquetas y Gotos:

La construcción de lenguaje de programación más elemental para cambiar el flujo de control en un programa es una etiqueta y goto . Cuando un compilador encuentra una sentencia como goto L , debe verificar que haya exactamente una sentencia con la etiqueta L en el alcance de esta sentencia goto . Si la etiqueta ya apareció, entonces la tabla de símbolos tendrá una entrada que proporciona la etiqueta generada por el compilador para la primera instrucción de tres direcciones asociada con la declaración fuente etiquetada como L . Para la traducción, generamos una instrucción goto de tres direcciones con esa etiqueta generada por el compilador como destino.

Cuando se encuentra una etiqueta L por primera vez en el programa fuente, ya sea en una declaración o como el destino del ir hacia adelante, ingresamos L en la tabla de símbolos y generamos una tabla simbólica para L .

Generación de código de un solo paso usando backpatching:

En una sola pasada, se puede usar backpatching para crear un programa de expresiones booleanas, así como el flujo de declaraciones de control. Las propiedades sintetizadas truelist y falselist de no terminal B se utilizan para manejar etiquetas en código de salto para declaraciones booleanas. La etiqueta a la que debe ir el control si B es verdadero debe agregarse a B.truelist, que es una lista de instrucciones de salto o salto condicional. B.falselist es la lista de instrucciones que finalmente obtienen la etiqueta a la que se asigna el control cuando B es falsa. Los saltos a verdadero y falso existen, así como el campo de etiqueta, se dejan en blanco cuando se genera el programa para B. Las listas B.truelist y B.falselist, respectivamente, contienen estos primeros saltos.

Una declaración S, por ejemplo, tiene un atributo sintetizado S.nextlist, que indica una lista de saltos a la instrucción inmediatamente después del código para S. Puede generar instrucciones en una array de instrucciones, con etiquetas que sirven como índices. Utilizamos tres funciones para modificar la lista de saltos:

  • Lista de creación (i): crea una nueva lista que incluye solo i, un índice en la array de instrucciones y la lista de creación también devuelve un puntero a la lista recién generada.
  • Fusionar (p1, p2): concatena las listas a las que apuntan p1 y p2 y devuelve un puntero a la lista concatenada.
  • Backpatch (p, i): inserta i como la etiqueta de destino para cada una de las instrucciones en el registro señalado por p.

Backpatching para expresiones booleanas:

Usando una técnica de traducción, puede crear código para expresiones booleanas durante el análisis de abajo hacia arriba . En gramática, un marcador no terminal M crea una acción semántica que recoge el índice de la siguiente instrucción que se creará en el momento adecuado.

Por ejemplo, Backpatching usando la tabla de reglas de producción de expresiones booleanas:

Paso 1: Generación de la tabla de producción

Production Table for Backpatching

Mesa de Producción para Backpatching

Paso 2: tenemos que encontrar el TAC (código de tres direcciones) para la expresión dada usando backpatching:

A < B OR C < D AND P < Q
Three address code for the given example

Tres códigos de dirección para el ejemplo dado

Paso 3: Ahora haremos el árbol de análisis para la expresión:

Parse tree for the example

árbol de análisis para el ejemplo

El flujo de declaraciones de control:

Las sentencias de control son aquellas que alteran el orden en que se ejecutan las sentencias. Las declaraciones If, If-else, Switch-Case y while-do son ejemplos. Las expresiones booleanas se utilizan a menudo en lenguajes informáticos para

  • Altere el flujo de control: las expresiones booleanas son expresiones condicionales que cambian el flujo de control en una instrucción. El valor de tal instrucción booleana está implícito en la posición del programa. Por ejemplo, si (A) B, la expresión A debe ser verdadera si se alcanza la afirmación B.
  • Calcular valores lógicos: durante el análisis de abajo hacia arriba, puede generar código para declaraciones booleanas a través de un mecanismo de traducción. Un marcador no terminal M en la gramática establece una acción semántica que toma el índice de la siguiente instrucción para formarse en el momento apropiado.

Aplicaciones de Backpatching:

  • Backpatching se utiliza para traducir sentencias de flujo de control en una sola pasada.
  • Backpatching se utiliza para producir cuádruples para expresiones booleanas durante el análisis de abajo hacia arriba.
  • Es la actividad de llenar información no especificada de etiquetas durante el proceso de generación de código.
  • Ayuda a resolver las ramas hacia adelante que se han plantado en el código.

Publicación traducida automáticamente

Artículo escrito por vipul1501 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *