Articulo de referencia

Compilador de una sola pasada

En programación informática , un compilador de una sola pasada procesa cada unidad de compilación una sola vez, traduciendo secuencialmente cada instrucción o declaración del có...

En programación informática , un compilador de una sola pasada procesa cada unidad de compilación una sola vez, traduciendo secuencialmente cada instrucción o declaración del código fuente a un código máquina similar al final. Esto contrasta con un compilador de múltiples pasadas , que convierte el programa en una o más representaciones intermedias en pasos entre el código fuente y el código máquina, y que reprocesa toda la unidad de compilación en cada pasada secuencial.

Un compilador de una sola pasada debe dejar sin resolver las direcciones de los saltos hacia adelante. Estas pueden gestionarse de diversas maneras (por ejemplo, mediante tablas de saltos y destinos) sin necesidad de realizar otra pasada completa. Algunos compiladores nominalmente de una sola pasada, en la práctica, "pasan la responsabilidad" generando código ensamblador y dejando que el ensamblador resuelva las referencias hacia adelante, pero esto requiere una o más pasadas del ensamblador.

Los compiladores de una sola pasada son más pequeños y rápidos que los compiladores de múltiples pasadas. [ 1 ]

Los compiladores de una sola pasada no pueden generar programas tan eficientes como los compiladores de múltiples pasadas debido al alcance limitado de la información disponible. Muchas optimizaciones efectivas del compilador requieren múltiples pasadas sobre un bloque básico , un bucle (especialmente bucles anidados), una subrutina o un módulo completo. Algunas requieren pasadas sobre todo el programa.

Dificultades

Un requisito fundamental para cualquier lenguaje de programación destinado a la compilación en una sola pasada es que todos los identificadores definidos por el usuario, excepto posiblemente las etiquetas, deben declararse antes de su uso:

  • Pascal incluye una especificación anticipada que permite que las rutinas sean mutuamente recursivas.
  • PL/I permite colocar las declaraciones de datos en cualquier parte de un programa, específicamente, después de algunas referencias a los elementos aún no declarados, por lo que se necesita una pasada para resolver las declaraciones de datos, seguida de una o más pasadas para generar el código.

Algunos tipos de hardware (por ejemplo, x86) pueden tener instrucciones de salto cortas y largas: cortas si el destino está a unos 127 bytes, y largas en caso contrario. Un compilador de una sola pasada debe asumir que todos los saltos son largos, mientras que un compilador de varias pasadas puede comprobar la distancia del salto y generar código posiblemente más corto.

Los lenguajes que dependen del contexto para la identificación de sentencias en lugar de utilizar palabras clave reservadas o con restricciones también pueden causar problemas. Los siguientes ejemplos son de Fortran 77:

SI (B) l1,l2 ! bifurcación bidireccional, donde B es una expresión booleana/lógica SI (N) l1,l2,l3 ! bifurcación de tres vías, donde N es una expresión numérica SI (B) ENTONCES ! inicio bloque condicional SI (B) ENTONCES = 3.1 ! asignación condicional a variable ENTONCES SI (B) X = 10 ! sentencia condicional simple SI (B) IR A l4 ! salto condicional SI (N) = 2 ! asignación a una variable con subíndice llamada SI HACER 12 I = 1,15 ! inicio de un bucle controlado por conteo HACER 12 I = 1.15 ! asignación del valor 1.15 a una variable llamadaDO12I

Es necesario analizar la declaración completa para determinar su naturaleza; solo entonces se puede traducir. Por lo tanto, cualquier declaración potencialmente ambigua debe procesarse al menos dos veces.

Véase también

Referencias

  1. "Compiladores de una pasada, de dos pasadas y de múltiples pasadas" . GeeksforGeeks . 13 de marzo de 2019. Consultado el 15 de mayo de 2023 .