Está en la página 1de 6

Universidad Centroccidental

“Lisandro Alvarado”
Decanato de Ciencias y Tecnología

Procesos Realizados Por El Compilador.

Integrante:

José Gabino Pérez 20.666.029

Lenguaje de programación.
En esta breve investigación profundizaremos un poco acerca del
compilador, específicamente en los procesos y fases que este realiza durante la
traducción de un lenguaje de alto nivel a código ejecutable.

Son un total de 6 fases y las mencionaremos a continuación así como el objetivo


principal de cada fase, elementos de entrada y salida y la explicación del proceso
que se lleva a cabo.

Por otra parte también mencionaremos otro tema similar visto que algunos
lenguajes modernos aceptan lo denominado Sobrecarga de operadores y en los
lenguajes orientados a objeto existe lo denominado polimorfismo analizaremos y
explicaremos en que fases de la traducción estas características son procesadas y
como afectan, si es que ocurre, los procesos del compilador.

Fases o Procesos del Compilador:

1- Análisis léxico: A la primera fase de un compilador se le llama análisis


de léxico o escaneo. El analizador de léxico lee el flujo de caracteres que
componen el programa fuente y los agrupa en secuencias significativas, conocidas
como lexemas. Para cada lexema, el analizador léxico produce como salida un
token de la forma: <nombre-token, valor-atributo>.
Que pasa a la fase siguiente, el análisis de la sintaxis. En el token, el primer
componente nombre-token es un símbolo abstracto que se utiliza durante el
análisis sintáctico, y el segundo componente valor-atributo apunta a una entrada
en la tabla de símbolos para este token. La Información de la entrada en la tabla
de símbolos se necesita para el análisis semántico y la generación de código.

El objetivo principal de esta fase es consiste en leer los caracteres de entrada y


elaborar como salida una secuencia de componentes léxicos que utiliza el
analizador sintáctico para hacer el análisis.

Los elementos de entrada de esta fase es el código fuente de otro programa


(secuencia de caracteres) y produce una salida compuesta
de tokens (componentes léxicos) o símbolos.

2- Analisis sintáctico: La segunda fase del compilador es el análisis


sintáctico o parsing. El parser (analizador sintáctico) utiliza los primeros
componentes de los tokens producidos por el analizador de léxico para crear una
representación intermedia en forma de árbol que describa la estructura gramatical
del flujo de tokens. Una representación típica es el árbol sintáctico, en el cual cada
nodo interior representa una operación y los hijos del nodo representan los
argumentos de la operación.
El Analisis Sintáctico descubre la estructura sintáctica (normalmente jerárquica) de
la cadena de entrada usando las reglas que definen las cadenas válidas en
el Lenguaje fuente.

Dichas reglas viene expresadas en forma de una Gramática que describe de


manera relativamente breve las frases o secuencias válidas en un Lenguaje. Una
gramática también describe la estructura jerárquica o sintáctica de las frases de un
lenguaje.

El objetivo principal es transformar una entrada en un árbol sintáctico de


derivación.

Los elementos de entrada de esta fase son texto de entrada en otras estructuras
(comúnmente árboles), que son más útiles para el posterior análisis y capturan la
jerarquía implícita de la entrada. Un analizador léxico crea tokens de una
secuencia de caracteres de entrada y son estos tokens los que son procesados
por el analizador sintáctico para construir la estructura de datos, por ejemplo un
árbol de análisis o árboles de sintaxis abstracta.

3- Análisis semántico: El analizador semántico utiliza el árbol sintáctico y


la información en la tabla de símbolos para comprobar la consistencia semántica
del programa fuente con la definición del lenguaje. También recopila información
sobre el tipo y la guarda, ya sea en el árbol sintáctico o en la tabla de símbolos,
para usarla más tarde durante la generación de código intermedio. Una parte
importante del análisis semántico es la comprobación (verificación) de tipos, en
donde el compilador verifica que cada operador tenga operandos que coincidan.
Por ejemplo, muchas definiciones de lenguajes de programación requieren que el
índice de un arreglo sea entero; el compilador debe reportar un error si se utiliza
un número de punto flotante para indexar el arreglo.

La especificación del lenguaje puede permitir ciertas conversiones de tipo


conocidas como coerciones. Por ejemplo, puede aplicarse un operador binario
aritmético a un par de enteros o a un par de números de punto flotante. Si el
operador se aplica a un número de punto flotante y a un entero, el compilador
puede convertir u obligar a que se convierta en un número de punto flotante.

El objetivo principal del analizador semántico es asegurarse de que el programa


analizado satisfaga las reglas requeridas por la especificación del lenguaje, para
garantizar su correcta ejecución.

El análisis semántico utiliza como entrada el árbol sintáctico detectado por el


análisis sintáctico para comprobar restricciones de tipo y otras limitaciones
semánticas y preparar la generación de código. Luego Se utiliza una pila donde se
genera la salida.
4- Generación de código intermedio: En el proceso de traducir un
programa fuente a código destino, un compilador puede construir
Una o más representaciones intermedias, las cuales pueden tener una variedad
de formas. Los árboles sintácticos son una forma de representación intermedia;
por lo general, se utilizan durante el análisis sintáctico y semántico.
Después del análisis sintáctico y semántico del programa fuente, muchos
compiladores generan un nivel bajo explícito, o una representación intermedia
similar al código máquina, que podemos considerar como un programa para una
máquina abstracta. Esta representación intermedia debe tener dos propiedades
importantes: debe ser fácil de producir y fácil de traducir en la máquina destino.

El objetivo del código intermedio es reducir el número de programas necesarios


para construir traductores, y permitir más fácilmente la transportabilidad de unas
máquinas a otras.

Las entradas de esta fase constan en la representación intermedia del programa


fuente producida por la etapa inicial junto con la información de la tabla de
símbolos. Que se utiliza para determinar las direcciones durante la ejecución de
los objetos de datos denotados por los nombres de la representación intermedia. Y
la salida de esta fase ya es el programa objeto .

5- Optimización de código independiente: La fase de optimización de


código independiente de la máquina trata de mejorar el código intermedio,

De manera que se produzca un mejor código destino. Por lo general, mejor


significa más rápido, pero pueden lograrse otros objetivos, como un código más
corto, o un código de destino que consuma menos poder. Transforman un
fragmento de código en otro fragmento con un comportamiento equivalente y
que se ejecuta de forma más eficiente, es decir, usando menos recursos de
cálculo como memoria o tiempo de ejecución. Existen diferentes técnicas para
optimizar el código, cada una de las cuales intenta mejorar un aspecto
diferenciado del código. En general pueden clasificarse en dos categorías, las
de flujo de datos (data-flow) y las de flujo de control (control-flow). Las
optimizaciones del flujo de datos pretenden mejorar la eficiencia de los diferentes
cálculos realizados en el programa: recalculando expresiones con valor conocido
en tiempo de compilación, reaprovechando cálculos ya realizados en otras partes
del código o suprimiendo cálculos innecesarios,  Por contra, las optimizaciones del
flujo de control intentan utilizar las instrucciones de salto condicional e
incondicional de la forma más eficiente posible (ya sea desplazando código o
eliminando saltos innecesarios).

Como objetivo principal se puede mencionar que este sirve como un código más
corto, o un código de destino que consuma menos poder.
La entrada de esta fase es que toma en el código intermedio y transforma(salida)
una parte del código que no implique un registros de la CPU y/o ubicaciones de
memoria absoluta.

6- Generación de código objeto: Esta fase por lo general consiste en


código de máquina relocalizarle o código ensamblador. Las posiciones de
memoria se seleccionan para cada una de las variables usadas por el programa.
Después, cada una de las instrucciones intermedias se traduce a una secuencia
de instrucciones de máquina que ejecuta la misma tarea. Un aspecto decisivo es
la asignación de variables a registros.

El generador de código objeto puede considerarse como la penúltima fase de un


compilador, en esta fase se toma la versión optimizada del código intermedio y se
mapea a la lenguaje de máquina objetivo.

El objetivo principal de esta fase es la generación de código, traduce entonces el


código intermedio en una secuencia reubicable de código de máquina, más tarde
el enlazador del sistema operativo tomara estas instrucciones y les asignara un
espacio en la memoria para así poder funcionar.

Como entrada toma el código intermedio generado por el front-end, y producir


código objeto de la arquitectura target para luego entrar en la fase de optimización
de código.  Toma como  entrada de  representación intermedia  el programa 
fuente y produce  como salida  un programa objeto equivalente.

Por otra parte hablando a cerca de los lenguajes modernos mencionaremos un


punto importante el cual es el de la SOBRECARGA DE OPERADORES y el
POLIMORFISMO El cual ocurre en un momento de la traducción del compilador.

El primero debemos recalcar que ocurre en la tercera fase (Análisis semántico) del
proceso de traducción del compilador y se define como aquellos operadores
que son de tipo tokens que indican al compilador la realización de determinadas
operaciones sobre variables u otros. La sobrecarga de operadores permite
redefinir ciertos operadores, como '+' y '-', para usarlos con las clases que hemos
definido. Se llama sobrecarga de operadores cuando reutilizando el mismo
operador con un número de usos diferentes, y el compilador decide cómo usar ese
operador dependiendo sobre qué opera.

La sobrecarga de operadores solo se puede utilizar con clases, no se pueden


redefinir los operadores para los tipos simples predefinidos.
Los operadores lógicos && y pueden ser sobrecargados para las clases definidas
por el programador, pero no funcionaran como operadores de short circuit. Todos
los miembros de la construcción lógica serán evaluados sin ningún problema en lo
que se refiere a la salida. Naturalmente los operadores lógicos predefinidos
continuaran siendo operadores de short circuit como era de esperar, pero no los
sobrecargados.

Los operadores aceptan uno o varios operandos de tipo específico (alguno de los
tipos básicos preconstruidos en el lenguaje), produciendo y/o modificando un valor
de acuerdo con ciertas reglas. Sin embargo, C++ permite redefinir la mayor parte
de ellos. Es decir, permite que puedan aceptar otro tipo de operando (distintos de
los tipos básicos) y seguir otro comportamiento, al tiempo que conservan el
sentido y comportamiento originales cuando se usan con los operandos normales.
Esta posibilidad recibe el nombre de sobrecarga del operador.

Esta sobrecarga afecta considerablemente al compilador en su tarea de traducción


ya que La sobrecarga añade complejidad a un sistema de tipos de un compilador.
Si unimos a ésta otras características ya mencionadas, como la coerción de tipos,
pueden darse contextos ambiguos en los que la sobrecarga no pueda ser resuelta,
y se tenga que generar un error en la compilación.

El segundo mencionado es EL POLIMORFISMO el cual indica la posibilidad de


establecer varias operaciones con el mismo nombre, diferenciándolas únicamente
en los parámetros de entrada. Dependiendo del objeto que se introduzca como
parámetro de entrada, se elegirá automáticamente cuál de las operaciones se va a
realizar.

Este opera también en la tercera fase del proceso de traducción (Análisis


semántico), esto afecta de una manera similar a la que ocurre en los lenguajes de
alto nivel. Ya que si hay una ambigüedad en la declaración de estos operadores
dificultara el proceso de traducción y no se completara.

También podría gustarte