Generación de código de destino en el diseño del compilador

La generación de código de destino es la fase final del compilador.

  1. Entrada: Representación intermedia optimizada.
  2. Salida: código de destino.
  3. Tarea Realizada: Registro de métodos de asignación y optimización, código de nivel de ensamblaje.
  4. Método: tres estrategias populares para la asignación y optimización de registros.
  5. Implementación: Algoritmos.
  6. La generación de código de destino se ocupa del lenguaje ensamblador para convertir el código optimizado en un formato comprensible para la máquina. El código de destino puede ser un código legible por máquina o un código ensamblador. Cada línea en el código optimizado puede asignarse a una o más líneas en el código de máquina (o) ensamblador, por lo que existe una asignación 1:N asociada con ellas.

    1 : N Asignación

    Por lo general, se supone que los cálculos se realizan en ubicaciones de memoria de alta velocidad, conocidas como registros. Realizar varias operaciones en registros es eficiente ya que los registros son más rápidos que la memoria caché. Los compiladores utilizan esta característica de manera efectiva. Sin embargo, los registros no están disponibles en grandes cantidades y son costosos. Por lo tanto, debemos tratar de usar un número mínimo de registros para incurrir en un bajo costo general.

    Código optimizado:

    Example 1 :
    L1: a = b + c * d
    
    optimization :
    t0 = c * d
    a  = b + t0
    Example 2 :
    L2: e = f - g / d
    
    optimization :
    t0 = g / d
    e  = f - t0
    

    Asignación de registros: la
    asignación de registros es el proceso de asignar variables de programa a los registros y reducir el número de intercambios dentro y fuera de los registros. El movimiento de variables a través de la memoria requiere mucho tiempo y esta es la razón principal por la que los registros se utilizan, ya que están disponibles en la memoria y son la ubicación de almacenamiento de acceso más rápido.

    Example 1:
    R1<--- a
    R2<--- b
    R3<--- c
    R4<--- d
    
    MOV R3, c
    MOV R4, d
    MUL R3, R4
    MOV R2, b
    ADD R2, R3
    MOV R1, R2
    MOV a, R1
    Example 2:
    R1<--- e
    R2<--- f
    R3<--- g
    R4<--- h
    
    MOV R3, g
    MOV R4, h
    DIV R3, R4
    MOV R2, f
    SUB R2, R3
    MOV R1, R2
    MOV e, R1 

    ventajas :

  • Almacenamiento de rápido acceso
  • Permite realizar cálculos sobre ellos.
  • Determinista ya que no incurre en fallas
  • Reducir el tráfico de memoria
  • Reduce el tiempo total de cálculo

Desventajas:

  • Los registros generalmente están disponibles en pequeñas cantidades (hasta unos pocos cientos de Kb)
  • Los tamaños de registro son fijos y varían de un procesador a otro
  • Los registros son complicados.
  • Necesidad de guardar y restaurar los cambios durante el cambio de contexto y las llamadas de procedimiento

Publicación traducida automáticamente

Artículo escrito por jayaramsingh 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 *