Arquitectura y Componentes Fundamentales de un Compilador
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 7,38 KB
Arquitectura y Fases del Compilador
Un compilador se divide principalmente en dos etapas: Análisis (entrada y estructuras intermedias) y Síntesis (salida basada en dichas estructuras).
Fases de Análisis
- Análisis Léxico: Lee de izquierda a derecha y agrupa caracteres en componentes léxicos (tokens) con significado colectivo (números, identificadores, palabras reservadas).
- Análisis Sintáctico: Comprueba que la estructura de los tokens sea correcta según reglas gramaticales, usualmente generando un árbol sintáctico.
- Análisis Semántico: Determina el significado, realiza chequeo de tipos, verifica la existencia de variables y rangos de valores. Su salida es el árbol semántico.
Fases de Síntesis
- Generación de Código Intermedio: Crea un código independiente de la máquina (facilita la optimización).
- Optimización de Código: Puede ser independiente o dependiente de la máquina para mejorar el rendimiento.
- Generación de Código Máquina: Produce el archivo final (ej.
.exeo.obj).
Tabla de Símbolos
Es una estructura (también llamada tabla de nombres) que almacena información sobre los identificadores del programa.
- Funciones principales: Efectuar chequeos semánticos y ayudar en la generación de código.
- Información almacenada: Nombre, tipo, dirección de memoria, tamaño y, en arrays, el número de dimensiones.
- Persistencia: Generalmente solo existe en tiempo de compilación, excepto en intérpretes donde permanece todo el tiempo.
- Eficiencia: Su gestión es crítica porque consume gran parte del tiempo de compilación; se recomiendan estructuras como árboles AVL o hash perfecto.
Análisis Semántico y Comprobación de Tipos
El análisis semántico comprueba las restricciones de tipo y otras limitaciones lógicas.
- Análisis Estático: Se realiza en tiempo de compilación (ej. verificar inicialización de variables).
- Análisis Dinámico: Ocurre durante la ejecución (ej. detectar divisiones por cero).
- Comprobación Fuerte: Garantiza que los errores de tipo se detecten siempre en compilación.
- Conceptos de Conversión:
- Coerción: Conversión de tipos implícita realizada por el compilador.
- Conversión Explícita: Realizada directamente por el programador (Casting).
- Sobrecarga: Resolución de operadores según el tipo de los operandos.
Árbol de Sintaxis Abstracta (AST) y Decoración
El AST es una simplificación del árbol sintáctico que elimina información innecesaria (como paréntesis o nodos intermedios).
- Decoración/Anotación: Es el proceso de añadir atributos a los nodos del AST, como el tipo de una expresión o si es un lvalue (si puede estar a la izquierda de una asignación).
- Compiladores de una pasada: Realizan todas las fases en un único recorrido; son rápidos pero generan código menos eficiente.
Pila Semántica y Esquemas de Traducción
- Pila Semántica: Se utiliza para gestionar variables y tipos durante el análisis sintáctico, permitiendo verificar la coherencia de las expresiones.
- Esquema de Traducción: Especificación formal que define cómo transformar el lenguaje fuente al destino. Utiliza acciones semánticas encerradas entre llaves
{ }dentro de las reglas gramaticales.
Manejo de Errores
Los errores se envían a un módulo central que informa el código de error y la línea donde ocurrió.
- Errores Léxicos: Caracteres inválidos o mal escritos (ej.
@,$). - Errores Sintácticos: El más complejo de manejar. Métodos de recuperación:
- Modo Pánico (Panic mode): Ignora la entrada hasta encontrar un delimitador seguro.
- Recuperación a nivel de frase: Intenta corregir el error localmente.
- Errores Semánticos: Difíciles de detectar porque la sintaxis es correcta pero el significado es erróneo (error lógico).
Ejemplos de Lógica de Programación (Prolog)
El siguiente código ilustra la definición de hechos y reglas, común en lenguajes declarativos:
JUGOS
jugo(verde, [alfalfa, pina, pinguica, nopal]).
jugo(vampiro, [betabel, zanahoria, naranja]).
jugo(antigripal, [naranja, pina, ajo, jengibre, limon]).
sirve(verde, adelgazar).
sirve(vampiro, energia).
sirve(antigripal, sistema_inmune).
horario(verde, ayunas).
horario(vampiro, por_la_tarde).
horario(antigripal, por_la_noche).
aporta(verde, [a, c, k]).
aporta(vampiro, [calcio, fibra, potasio, vit_c]).
aporta(antigripal, [vit_c, b6, b12, potasio, magnesio]).
mi_member(X, [X|_]).
mi_member(X, [_|T]) :- mi_member(X, T).
contiene(Jugo, Ingrediente) :-
jugo(Jugo, Lista),
mi_member(Ingrediente, Lista).
tiene_nutriente(Jugo, Nutriente) :-
aporta(Jugo, ListaN),
mi_member(Nutriente, ListaN).
recomienda_completo(Jugo, Objetivo, Momento, Ingredientes, Nutrientes) :-
jugo(Jugo, Ingredientes),
sirve(Jugo, Objetivo),
horario(Jugo, Momento),
aporta(Jugo, Nutrientes).
jugo_ideal(Jugo, Objetivo, Ingrediente, Nutriente) :-
sirve(Jugo, Objetivo),
contiene(Jugo, Ingrediente),
tiene_nutriente(Jugo, Nutriente).
Ejemplo de Reglas de Compatibilidad (Outfit)
Definición de reglas para determinar conjuntos compatibles, utilizando la recursividad y la negación por falla:
OUTFIT
arriba(blusa,guinda).
arriba(playera,azul).
arriba(camisa,naranja).
abajo(falda,guinda).
abajo(pantalon,negro).
abajo(short,azul).
zapatos(botas,cafe).
zapatos(tenis,blancos).
zapatos(vestir,negros).
color(naranja,oliver).
color(guinda,mayeli).
color(azul,ricardo).
neutral(negro).
neutral(negros).
neutral(blanco).
neutral(blancos).
neutral(cafe).
compatible(C,C).
compatible(_,X) :- neutral(X).
outfit(Persona, Arriba, C1, Abajo, C2, Zap, C3) :-
color(C1, Persona),
arriba(Arriba, C1),
abajo(Abajo, C2),
zapatos(Zap, C3),
compatible(C1, C2),
compatible(C1, C3).
outfit(Persona) :-
outfit(Persona, A, C1, B, C2, Z, C3),
format('~w ~w ~w ~w ~w ~w~n', [A,C1,B,C2,Z,C3]),
fail.
outfit(_).
Ejemplo de Relaciones Familiares
Definición de relaciones basadas en hechos:
FAMILIA
mama(juana,inocencio).
mama(juana,juan).
mama(juana,dulce).
mama(lucrecia,juana).
mama(lucrecia,odilia).
mama(honorina,jose).
mama(honorina,daniel).
papa(jose,inocencio).
papa(jose,juan).
papa(jose,dulce).
papa(chencho,jose).
papa(chencho,daniel).
papa(bonifacio,juana).
papa(bonifacio,odilia).
hermano(H1,H2):-papa(P,H1),papa(P,H2),H1\=H2.