Fases del compilador con ejemplo, proceso y pasos.
โก Resumen inteligente
Las fases del compilador describen cรณmo un compilador transforma el cรณdigo fuente en cรณdigo mรกquina a travรฉs de seis etapas: anรกlisis lรฉxico, anรกlisis sintรกctico, anรกlisis semรกntico, generaciรณn de cรณdigo intermedio, optimizaciรณn del cรณdigo y generaciรณn de cรณdigo, con el apoyo de la gestiรณn de tablas de sรญmbolos y el manejo de errores en todo momento.
ยฟCuรกles son las fases del diseรฑo del compilador?
Compilador Funciona en varias fases, cada una de las cuales transforma el programa fuente de una representaciรณn a otra. Cada fase toma las entradas de la etapa anterior y envรญa su salida a la siguiente fase del compilador.
Hay 6 fases en un compilador. Cada una de estas fases ayuda a convertir el lenguaje de alto nivel en cรณdigo de mรกquina. Las fases de un compilador son:
- Anรกlisis lรฉxico
- Anรกlisis de sintaxis
- Anรกlisis semรกntico
- Generador de cรณdigo intermedio
- Code optimizador
- Code generador

Todas estas fases convierten el cรณdigo fuente dividiรฉndolo en tokens, creando รกrboles de anรกlisis y optimizando el cรณdigo fuente en diferentes fases.
Fase 1: Anรกlisis Lรฉxico
El anรกlisis lรฉxico es la primera fase en la que el compilador escanea el cรณdigo fuente. Este proceso se puede realizar de izquierda a derecha, carรกcter por carรกcter, y agrupar estos personajes en tokens.
Aquรญ, el flujo de caracteres del programa fuente se agrupa en secuencias significativas identificando los tokens. Realiza el ingreso de los tickets correspondientes en la tabla de sรญmbolos y pasa ese token a la siguiente fase.
Las funciones principales de esta fase son:
- Identificar las unidades lรฉxicas en un cรณdigo fuente.
- Clasifique unidades lรฉxicas en clases como constantes, palabras reservadas e introdรบzcalas en diferentes tablas. Ignorarรก los comentarios en el programa fuente.
- Identificar token que no forma parte del idioma.
Ejemplo:
x = y + 10
Tokens
| X | identificador |
| = | Operador de asignaciรณn |
| Y | identificador |
| + | Operador de suma |
| 10 | Nรบmero |
Fase 2: Anรกlisis de sintaxis
El anรกlisis de sintaxis consiste en descubrir la estructura del cรณdigo. Determina si un texto sigue o no el formato esperado. El objetivo principal de esta fase es asegurarse de que el cรณdigo fuente escrito por el programador sea correcto o no.
El anรกlisis de sintaxis se basa en las reglas basadas en el lenguaje de programaciรณn especรญfico mediante la construcciรณn del รกrbol de anรกlisis con la ayuda de tokens. Tambiรฉn determina la estructura del idioma de origen y la gramรกtica o sintaxis del idioma.
A continuaciรณn se muestra una lista de tareas realizadas en esta fase:
- Obtener tokens del analizador lรฉxico
- Comprueba si la expresiรณn es sintรกcticamente correcta o no.
- Informar todos los errores de sintaxis
- Construya una estructura jerรกrquica que se conoce como รกrbol de anรกlisis.
Ejemplo
Cualquier identificador/nรบmero es una expresiรณn.
Si x es un identificador e y+10 es una expresiรณn, entonces x= y+10 es una declaraciรณn.
Considere el รกrbol de anรกlisis para el siguiente ejemplo
(a+b)*c
En รกrbol de anรกlisis
- Nodo interior: registro con un campo de operador y dos campos para hijos
- Hoja: registros con 2 o mรกs campos; uno para el token y otra informaciรณn sobre el token
- Asegurar que los componentes del programa encajen de manera significativa.
- Reรบne informaciรณn de tipos y comprueba la compatibilidad de tipos.
- Comprueba que los operandos estรฉn permitidos por el idioma de origen
Fase 3: Anรกlisis Semรกntico
El anรกlisis semรกntico comprueba la coherencia semรกntica del cรณdigo. Utiliza el รกrbol de sintaxis de la fase anterior junto con la tabla de sรญmbolos para verificar que el cรณdigo fuente dado sea semรกnticamente consistente. Tambiรฉn comprueba si el cรณdigo transmite un significado apropiado.
Semantic Analyzer comprobarรก si hay discrepancias de tipos, operandos incompatibles, una funciรณn llamada con argumentos inadecuados, una variable no declarada, etc.
Funciones de la fase de anรกlisis semรกnticos son:
- Le ayuda a almacenar la informaciรณn de tipo recopilada y guardarla en una tabla de sรญmbolos o un รกrbol de sintaxis.
- Le permite realizar verificaciรณn de tipo
- En el caso de una discrepancia de tipos, donde no existen reglas de correcciรณn de tipos exactas que satisfagan la operaciรณn deseada, se muestra un error semรกntico.
- Recopila informaciรณn de tipos y comprueba la compatibilidad de tipos.
- Comprueba si el idioma de origen permite los operandos o no
Ejemplo
float x = 20.2; float y = x*30;
En el cรณdigo anterior, el analizador semรกntico encasillarรก el nรบmero entero 30 para que flote 30.0 antes de la multiplicaciรณn.
Fase 4: Intermedia Code Generation
Una vez finalizada la fase de anรกlisis semรกntico, el compilador genera cรณdigo intermedio para la mรกquina de destino. Este representa un programa para algรบn elemento.tracmรกquina t.
El cรณdigo intermedio se encuentra entre el lenguaje de alto nivel y el de mรกquina. Este cรณdigo intermedio debe generarse de tal manera que facilite su traducciรณn al cรณdigo de mรกquina de destino.
Funciones en el nivel intermedio Code Generacion:
- Debe generarse a partir de la representaciรณn semรกntica del programa fuente.
- Mantiene los valores calculados durante el proceso de traducciรณn.
- Le ayuda a traducir el cรณdigo intermedio al idioma de destino.
- Le permite mantener el orden de prioridad del idioma de origen.
- Contiene el nรบmero correcto de operandos de la instrucciรณn.
Ejemplo
Por ejemplo,
total = count + rate * 5
El cรณdigo intermedio con la ayuda del mรฉtodo del cรณdigo de direcciรณn es:
t1 := int_to_float(5)
t2 := rate * t1
t3 := count + t2
total := t3
Fase 5: Code Optimiza
La siguiente fase es la optimizaciรณn del cรณdigo o cรณdigo intermedio. Esta fase elimina lรญneas de cรณdigo innecesarias y organiza la secuencia de declaraciones para acelerar la ejecuciรณn del programa sin desperdiciar recursos. El objetivo principal de esta fase es mejorar el cรณdigo intermedio para generar un cรณdigo que se ejecute mรกs rรกpido y ocupe menos espacio.
Las funciones principales de esta fase son:
- Le ayuda a establecer un equilibrio entre la velocidad de ejecuciรณn y de compilaciรณn.
- Mejora el tiempo de ejecuciรณn del programa de destino.
- Genera cรณdigo simplificado aรบn en representaciรณn intermedia
- Eliminar cรณdigo inalcanzable y deshacerse de variables no utilizadas
- Eliminar declaraciones que no se modifican del bucle
Ejemplo:
Considere el siguiente cรณdigo
a = intofloat(10)
b = c * a
d = e + b
f = d
Puede llegar a ser
b =c * 10.0 f = e+b
Fase 6: Code Generation
Code La generaciรณn es la รบltima fase de un compilador. Recibe informaciรณn de las fases de optimizaciรณn del cรณdigo y produce el cรณdigo de pรกgina o el cรณdigo objeto. El objetivo de esta fase es asignar memoria y generar cรณdigo mรกquina reubicable.
Tambiรฉn asigna ubicaciones de memoria para la variable. Las instrucciones del cรณdigo intermedio se convierten en instrucciones de mรกquina. Esta fase convierte el cรณdigo optimizado o intermedio al idioma de destino.
El idioma de destino es el cรณdigo de mรกquina. Por lo tanto, todas las ubicaciones de memoria y registros tambiรฉn se seleccionan y asignan durante esta fase. El cรณdigo generado por esta fase se ejecuta para tomar entradas y generar resultados esperados.
Ejemplo
a = b + 60.0
Posiblemente se traducirรญa a registros.
MOVF a, R1 MULF #60.0, R2 ADDF R1, R2
Gestiรณn de tablas de sรญmbolos
Una tabla de sรญmbolos contiene un registro para cada identificador con campos para los atributos del identificador. Este componente facilita que el compilador busque el registro del identificador y lo recupere rรกpidamente. La tabla de sรญmbolos tambiรฉn le ayuda en la gestiรณn del alcance. La tabla de sรญmbolos y el controlador de errores interactรบan con todas las fases y la tabla de sรญmbolos se actualiza en consecuencia.
Rutina de manejo de errores
En el proceso de diseรฑo del compilador, pueden producirse errores en todas las fases que se detallan a continuaciรณn:
- Analizador lรฉxico: tokens mal escritos
- Analizador de sintaxis: falta parรฉntesis
- Generador de cรณdigo intermedio: operandos no coincidentes para un operador
- Code Optimizador: Cuando la instrucciรณn no es alcanzable
- Code Generator: Cuando la memoria estรก llena o no se asignan los registros adecuados
- Tablas de sรญmbolos: Error de mรบltiples identificadores declarados
Los errores mรกs comunes son secuencias de caracteres no vรกlidas en el escaneo, secuencias de tokens no vรกlidas en el tipo, error de alcance y anรกlisis sintรกctico en el anรกlisis semรกntico.
El error puede encontrarse en cualquiera de las fases anteriores. Despuรฉs de encontrar errores, la fase debe solucionarlos para continuar con el proceso de compilaciรณn. Estos errores deben informarse al controlador de errores que maneja el error para realizar el proceso de compilaciรณn. Generalmente, los errores se informan en forma de mensaje.


