Está en la página 1de 10

REPÚBLICA BOLIVARIANA DE VENEZUELA

UNIVERSIDAD PRIVADA RAFAEL BELLOSO CHACÍN


FACULTAD DE INGENIERÍA
ESCUELA DE INFORMÁTICA
CÁTEDRA: COMPILADORES
SECCIÓN: N-713

TALLER COMPILADORES UNIDAD I

Presentado por:
Rincón, Pedro. C.I: 27.849.021
Zambrano, Marien. CI: 27.139.826

Maracaibo, Septiembre del 2019


ÍNDICE GENERAL
PROGRAMAS QUE MANIPULAN FUENTES
¿Qué son?..........................………………………………………Página 3
Ejemplos y cómo funcionan………………………………………Página 3-5
FASES DEL PROCESO DE COMPILACIÓN
Análisis léxico…………………………………………………..Página 6
Análisis sintáctico………………………………………………Página 7
Análisis semántico……………………………………….Página 7-8
Generación de código intermedio…………………………..……Página 8
Generación de código…………………………………………….Página 8-9
Optimizadores de código…………………………………………Página 9
Tabla de símbolos……………………………………….…….….Página 9
Detección de errores……………………………….....................Página 10
1. PROGRAMAS QUE MANIPULAN FUENTES

¿Qué son?
Es una noción que se emplea como sinónimo de código fuente. Se trata de las
instrucciones que un programa informático transmite a una computadora para
que pueda ejecutarse. Dichas instrucciones son líneas de texto escritas en
un lenguaje de programación (una estructura capaz de impartir instrucciones
informáticas a partir de una determinada base semántica y sintáctica).
EJEMPLOS Y COMO FUNCIONAN

1. EDITORES DE ESTRUCTURA

Un editor de estructuras toma como entrada una secuencia de órdenes para


construir un programa fuente. El editor de estructuras no sólo realiza las
funciones de creación y modificación de textos de un editor de textos ordinario,
sino que también analiza el texto del programa, imponiendo al programa fuente
una estructura jerárquica apropiada. De esa manera, el editor de estructuras
puede realizar tareas adicionales útiles para la preparación de programas.

Por ejemplo, puede comprobar si la entrada está formada correctamente,


puede proporcionar palabras clave de manera automática (por ejemplo,
cuando el usuario escribe while, el editor proporciona el correspondiente do y
le recuerda al usuario que entre las dos palabras debe ir un condicional) y
puede saltar desde un begin o un paréntesis izquierdo hasta su
correspondiente end o paréntesis derecho. Además, la salida de tal editor
suele ser similar a la salida de la fase de análisis de un compilador.

2. IMPRESORAS ESTETICAS

Una impresora estética analiza un programa y lo imprime de forma que la


estructura del programa resulte claramente visible. Por ejemplo, los
comentarios pueden aparecer con un tipo de letra especial, y las proposiciones
pueden aparecer con una indentación proporcional a la profundidad de su
anidamiento en la organización jerárquica de las proposiciones.
3. VERIFICADORES ESTATICOS

Lee un programa, lo analiza e intenta descubrir errores potenciales sin ejecutar


el programa, puede detectar si hay partes de un programa que nunca se
podrán ejecutar o si cierta variable se usa antes de ser definida
Funcionamiento de un verificador estático:
La parte de análisis a menudo es similar a la que se encuentra en los
compiladores de optimización. Así, un verificador estático puede detectar si
hay partes de un programa que nunca se podrán ejecutar o si cierta variable
se usa antes de ser definida.

4. INTERPRETES

En lugar de producir un programa objeto como resultado de una traducción,


un intérprete realiza las operaciones que implica el programa fuente. Para una
proposición de asignación, por ejemplo, un intérprete podría construir un árbol
como el de la figura 1 y después efectuar las operaciones de los nodos
conforme “recorre” el árbol. En la raíz descubriría que tiene que realizar una
asignación, y llamaría a una rutina para evaluar la expresión de la derecha y
después almacenaría el valor resultante en la localidad de memoria asociada
con el identificador posición. En el hijo derecho de la raíz, la rutina descubriría
que tiene que calcular la suma de dos expresiones.

Se llamaría a sí misma de manera recursiva para calcular el valor de la


expresión velocidad*60. Después sumaría ese valor de la variable inicial.
Muchas veces los intérpretes se usan para ejecutar lenguajes de órdenes,
pues cada operador que se ejecuta en un lenguaje de órdenes suele ser una
invocación de una rutina compleja, como un editor o un compilador. Del mismo
modo algunos lenguajes de “muy alto nivel”, normalmente son interpretados,
porque hay muchas cosas sobre los datos, como el tamaño y la forma de las
matrices, que no se pueden deducir en el momento de la compilación.

5. COMPILADORES
Es un programa especial que traduce de código fuente de un programa a
lenguaje de máquina. El compilador informa al usuario de la presencia de
errores en el programa fuente.
Un compilador funciona de la siguiente forma:
1. El código fuente se lee en la memoria de la computadora.

2. El código fuente se convierte en código objeto o módulo de objeto. Un

programa puede tener muchos objetos y bibliotecas que necesitan ser

unidas entre sí para crear el ejecutable.

3. Se crean los conectores, para enlazar todos los componentes del

programa.

4. Se reasignan los bloques de memoria dentro del programa de modo

que una pieza no sobreponga a otra parte en la memoria.

5. Los archivos compilados se graban en el disco u otro tipo de memoria

permanente.

6. El resultado es un archivo o programa ejecutable.


2. Fases del Proceso de Compilación
a. Análisis Léxico
Es la primera fase de un compilador consistente en un programa que
lee los caracteres del programa fuente y se agrupa en cadenas que
representan los componentes léxicos. Cada componente léxico es una
secuencia lógicamente coherente de caracteres relativa a un identificador, una
palabra reservada, un operador o un carácter de puntuación. A la secuencia
de caracteres que representa un componente léxico se le llama lexema (o con
su nombre en inglés token). En el caso de los identificadores creados por el
programador no solo se genera un componente léxico, sino que se genera otro
lexema en la tabla de símbolos. Estos tokens sirven para una posterior etapa
del proceso de traducción, siendo la entrada para el analizador sintáctico.
La especificación de un lenguaje de programación a menudo incluye un
conjunto de reglas que definen el léxico. Estas reglas consisten comúnmente
en expresiones regulares que indican el conjunto de posibles secuencias de
caracteres que definen un token o lexema.
En algunos lenguajes de programación es necesario establecer
patrones para caracteres especiales (como el espacio en blanco) que la
gramática pueda reconocer sin que constituya un token en sí.
Ejemplo:
b. Análisis Sintáctico
En esta fase, los componentes léxicos se agrupan en frases
gramaticales que el compilador utiliza para sintetizar la salida.
La salida del análisis sintáctico suele ser un árbol sintáctico con la
estructura sintáctica del programa fuente.
Ejemplo:

c. Análisis Semántico
La fase de análisis semántico se intenta detectar instrucciones que
tengan la estructura sintáctica correcta, pero que no tengan significado para la
operación implicada. Generalmente, a partir del árbol sintáctico.
Al mismo tiempo reúnen información sobre los tipos de datos del
programa fuente (variables, constantes, etc.) que será utilizada en la fase de
generación de código.
La salida del análisis semántico suele ser un árbol semántico, que no
es más que un árbol sintáctico en el que cada nodo ha adquirido su significado.
Ejemplo:
ValorX = ValorY + 1
- Que ValorX haya sido declarado antes de utilizarse
- Que ValorY haya sido declarado antes de utilizarse
- Si el lenguaje lo requiere, que ValorY haya sido inicializado
- Que ValorY y el entero 1 sean del mismo tipo o compatible.
- Que el operador suma se pueda aplicar al tipo de ValorY y al de 1.
- Que el tipo de ValorX y el tipo resultante de ValorY + 1 sean el
mismo o compatibles.

d. Generación de Código Intermedio


Algunos compiladores generan una representación intermedia explícita
del programa fuente, una vez que se han realizado las fases de análisis. Se
puede considerar esta operación intermedia como un subprograma 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 al
programa objeto.
Ejemplo:

e. Generación de Código
Se genera el código objeto que por lo general consiste en código en
lenguaje máquina (código relocalizable) o código en lenguaje ensamblador.
Se asigna espacio de memoria para cada nombre del programa fuente
(variables, tipos, constantes, etc.).
Se traduce cada una de las instrucciones en código intermedio a una
secuencia de instrucciones en código objeto que ejecuten la misma tarea.
Ejemplo:
C := A + B Código Fuente
Código Objeto Equivalente:
LOAD A
SUM B
STO C

f. Optimizadores de Código
En esta fase se trata de mejorar el código intermedio, de modo que
resulte un código de máquina más rápido de ejecutar: reduciendo el espacio
ocupado por el código generado, aumentando la rapidez de ejecución,
haciendo que se necesite menos memoria cuando se ejecute.
Ejemplo:
a=b+c a=b+c
d=a-d d=a-d
e = (b + c)*d e = a*d
g. Tabla de Símbolos
Una tabla de símbolos es una estructura de datos que contiene un
registro por cada identificador. El registro incluye los campos para los atributos
del identificador. La tabla de símbolos interactúa con casi todas las fases del
compilador: el analizador léxico, el analizador sintáctico o el analizador
semántico pueden introducir identificadores dentro de la tabla. El administrador
de la tabla de símbolos se encarga de manejar los accesos a la tabla de
símbolos, en cada una de las etapas de compilación de un programa.
Ejemplo:
h. Detección de Errores.
En cada fase del proceso de compilación es posibles encontrar errores.
Es conveniente que el tratamiento de los errores se haga de manera
centralizada a través de un manejador de errores. De esta forma podrán
controlarse más eficientemente los errores encontrados en cada una de las
fases de la compilación de un programa.
Ejemplo:

En el análisis léxico Símbolos ajenos al lenguaje


En el análisis sintáctico Expresiones mal construidas
En el análisis semántico Variables sin declarar

También podría gustarte