Ir al contenido principal
Compiladores

- ¿Qué es un Compilador? Un compilador es
un programa informático que traduce el código fuente escrito
en un lenguaje de programación (llamado fuente) a otro
lenguaje (conocido como objeto). En este proceso, el
lenguaje fuente generalmente es un lenguaje de alto nivel, mientras que el
lenguaje objeto puede ser assembly o código máquina. En resumen, el
compilador convierte el código legible por los humanos en instrucciones
comprensibles por la máquina.
- Contexto de un Compilador El
contexto de un compilador implica las fases que componen su proceso de
traducción. Estas fases se agrupan en dos tareas principales: análisis y síntesis.
El análisis verifica la corrección del programa fuente y comprende el
análisis léxico (descomposición en componentes léxicos), análisis
sintáctico (agrupación en frases gramaticales) y análisis semántico
(validación semántica). La síntesis se enfoca en generar el código objeto
y optimizarlo.
- Proceso de Generación de Código El
proceso de generación de código consta de varias fases:
- Análisis léxico: Escanea el
código fuente y agrupa caracteres en tokens significativos.
- Análisis sintáctico: Descubre la
estructura del código y construye un árbol de análisis.
- Análisis semántico: Verifica la
corrección semántica del código aceptado en la fase anterior.
- Generación de código intermedio:
Produce una representación intermedia del programa.
- Optimización de código: Mejora
la eficiencia del código intermedio.
- Generación de código objeto:
Traduce el código intermedio al lenguaje de máquina.
- Criterios de Optimización Independiente En la optimización independiente de la máquina, el
compilador transforma partes del código intermedio que no involucran
registros de CPU ni ubicaciones de memoria absolutas. Ejemplos de tareas incluyen:
- Plegado de constantes.
- Propagación de constantes.
- Eliminación de computaciones redundantes.
- Eliminación de código “muerto” (nunca ejecutado).
- Optimización Dependiente La
optimización dependiente de la máquina ocurre después de generar el código
de destino. Se adapta al hardware específico y puede usar registros de CPU
y referencias de memoria absolutas. Aprovecha la jerarquía de memoria
y se ajusta a la arquitectura del equipo de destino.
- Fases de Optimización Dependiente Las
fases específicas pueden variar, pero generalmente incluyen:
- Análisis de flujo de control:
Identificación de bloques básicos y control de flujo.
- Análisis de dependencia:
Determina dependencias entre instrucciones.
- Asignación de registros: Asigna
registros de CPU a variables.
- Programación de instrucciones:
Reorganiza instrucciones para optimizar el rendimiento.
Comentarios
Publicar un comentario