Compiladores
Compiladores
Compiladores
Concepto:
Compilador: es un programa que traduce código escrito en
un lenguaje de programación (llamado fuente) a otro
lenguaje (conocido como objeto).
Compiladores cruzados: generan código para una plataforma distinta a aquella en la que están
funcionando
Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del
código fuente.
Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder
producir el código máquina.
Compiladores JIT (just in time): forman parte de un intérprete y compilan partes del código según
se necesitan.
Proceso de compilación
El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y
se agrupa en componentes léxicos (tókenes), que son secuencias de caracteres que tienen un
significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y demás
información innecesaria se elimina del programa fuente. También se comprueba que los símbolos del
lenguaje (palabras clave, operadores, etc.) se han escrito correctamente.
Como la tarea que realiza el analizador léxico es un caso especial de coincidencia de patrones, se
necesitan los métodos de especificación y reconocimiento de patrones, se usan principalmente los
autómatas finitos que acepten expresiones regulares. Sin embargo, un analizador léxico también es
la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo
involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera tan
eficiente como sea posible.
Análisis sintáctico
En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente en frases gramaticales que el compilador utiliza para
sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintácticamente correcto (obedece a la gramática del
lenguaje). Por lo general, las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico.
La estructura jerárquica de un programa normalmente se expresa utilizando reglas recursivas. Por ejemplo, se pueden dar las
siguientes reglas como parte de la definición de expresiones:
Un identificador puede ser una expresión.
Un número puede ser una expresión.
Si expresión1 y expresión2 son expresiones, entonces también lo son:
expresión1 + expresión2
expresión1 * expresión2
( expresión1 )
Las reglas 1 y 2 son reglas básicas (no recursivas), en tanto que la regla 3 define expresiones en función de operadores aplicados a
otras expresiones.
La división entre análisis léxico y análisis sintáctico es algo arbitraria. Un factor para
determinar la división es si una construcción del lenguaje fuente es inherentemente
recursiva o no. Las construcciones léxicas no requieren recursión, mientras que las
construcciones sintácticas suelen requerirla. No se requiere recursión para
reconocer los identificadores, que suelen ser cadenas de letras y dígitos que
comienzan con una letra. Normalmente, se reconocen los identificadores por el
simple examen del flujo de entrada, esperando hasta encontrar un carácter que no
sea ni letra ni dígito, y agrupando después todas las letras y dígitos encontrados
hasta ese punto en un componente léxico llamado identificador. Por otra parte, esta
clase de análisis no es suficientemente poderoso para analizar expresiones o
proposiciones. Por ejemplo, no podemos emparejar de manera apropiada los
paréntesis de las expresiones, o las palabras begin y end en proposiciones sin
imponer alguna clase de estructura jerárquica o de anidamiento a la entrada.
Análisis semántico
La fase de análisis semántico revisa el programa fuente para tratar de encontrar errores semánticos
y reúne la información sobre los tipos para la fase posterior de generación de código. En ella se
utiliza la estructura jerárquica determinada por la fase de análisis sintáctico para identificar los
operadores y operandos de expresiones y proposiciones.