Está en la página 1de 8

Diseño de compiladores

LABORATORIO SUMATIVO N° 1
GRUPO: William Abrego – 8-805-929
FECHA DE ENTREGA: lunes 18 de abril de 2022

1. ¿Qué es una expresión regular?,


2. Defina qué es un autómata finito (determinista y no determinista)
3. Defina los diagramas de transiciones
4. ¿Qué es un traductor y cuáles son los tipos de traductores?
5. ¿Cuál es la diferencia entre traductor e intérprete
6. ¿Cuáles son las dos fases que componen el proceso de compilación?
7. ¿Cómo se clasifican los compiladores?
8. Dada la siguiente tabla, completar las columnas en blanco:

Desarrollo

1. Una Expresión Regular: Es una secuencia de caracteres y símbolos que definen un conjunto de cadenas
y que son útiles para validar la entrada y asegurar que los datos estén en un formato específico.

Ejemplo: Consideremos el alfabeto simple constituido por sólo tres caracteres alfabéticos: Σ= {a, b, c).
También el conjunto de todas las cadenas en este alfabeto que contengan exactamente una b. Este
conjunto es generado por la expresión regular (a/c) *b(a/c) *.

Aunque b aparece en el centro de la expresión regular, la letra b no necesita estar en el centro de la


cadena que se desea definir. En realidad, la repetición de a o c antes y después de la b puede presentarse
en diferentes números de veces. Por consiguiente, todas las cadenas siguientes están generadas mediante
la expresión regular anterior: b, abc, abaca, baaaac, ccbaca, ccccccb.
Diseño de compiladores

2. Autómata es una máquina matemática M formada por 5 elementos M = (Σ, Q, s, F, δ) donde Σ es un


alfabeto de entrada, Q es un conjunto finito de estados, s es el estado inicial, F es un conjunto de estados
finales o de aceptación y δ (delta) es una relación de transición.
• Autómata Finito Determinista (AFD): Es un autómata en donde δ (delta) es una función de
transición, es decir, que para cada par (estado actual y símbolo de entrada) le corresponde un
único estado siguiente.

Ejercicio: obtenga un AFD dado el siguiente lenguaje definido en el alfabeto Σ = {0, 1}. El conjunto de
cadenas que inician en “0”.
Conjunto de cadenas que inician en "0". AFD.

• Autómata Finito No Determinista (AFND): Es un autómata en donde δ no es necesariamente una


función de transición, es decir, que para cada par (estado actual y símbolo de entrada) le
corresponde cero, uno, dos o más estados siguientes, Normalmente la relación de transición para
un AFND se denota con ∆.

Ejercicio: Obtenga un AFND dado el siguiente lenguaje definido en el alfabeto Σ = {0, 1}. El conjunto
de cadenas que inician en 0.
Conjunto de cadenas que inician en "0". AFND.
Diseño de compiladores

3. Diagrama de Transición (DT): Es una herramienta de modelado que sirve para describir el
comportamiento requerido de los sistemas de tiempo real, al igual que la porción de la interfaz humana
que la mayoría de los sistemas en línea tiene, como ejemplo de estos sistemas se tienen el control de
procesos, sistemas de conmutación telefónica, sistemas de captura de datos de alta velocidad y sistemas
de control y mando militares.
El DT se usa para desarrollar un modelo esencial del sistema, es decir, un modelo de cómo se
comportaría el sistema si hubiera la tecnología perfecta (ideal).
Componentes del DT:
• Estados: Los estados representan los diferentes comportamientos del sistema que son
observables y que perduran en algún periodo de tiempo finito. Los estados se representan con un
rectángulo o con círculos.
• Cambios de Estados: Si un sistema solo tiene un estado se lo llama estático y no tiene sentido
estudiarlo. En cambio, se estudian los sistemas que cambian a través del tiempo. Se identifican
los estados inicial y final, entre otros intermedios. Puede haber más de un estado inicial y final.
Se representan con flechas.
• Condiciones: Una condición es un acontecimiento en el ambiente externo que el sistema es
capaz de detectar (señal, interrupción) y son las causantes de los cambios de estados.
• Acciones: Son las acciones que realiza el sistema cuando cambia de estado. Como parte del
cambio de estado, el sistema hará una o más acciones (producir una salida, llevar a cabo un
cálculo), las acciones son respuestas regresadas al ambiente externo para poder responder a algún
acontecimiento futuro.

4. Los traductores: Son programas que traducen los programas en código fuente, escritos en lenguajes de
alto nivel, a programas escritos en lenguaje máquina. Los traductores pueden ser de dos tipos:
compiladores e intérpretes.
Diseño de compiladores

• Compilador: Es un programa que lee el código escrito en un lenguaje (lenguaje origen), y lo


traduce en un programa equivalente escrito en otro lenguaje (lenguaje objetivo). Como parte
fundamental de este proceso de traducción, el compilador le hace notar al usuario la presencia de
errores en el código fuente del programa.

Los lenguajes C y C++ son lenguales que utilizan un compilador. El trabajo del compilador y su
función es llevar el código fuente escrito en C/C++ a un programa escrito en lenguaje maquina.
Entrando en mas detalle, un programa en código fuente es compilado obteniendo un archivo
parcial (objeto) que tiene extensión obj. Luego el compilador invoca el “linker” que convierte al
archivo objeto en un ejecutabl con extensión exe; este ultimo archivo es un archivo en formato
binario y puede funcionar por sí solo.
Además, el compilador al realizar su tarea realiza tambien una comprobación de errores en el
programa; es decir, revisa que todo esté en orden. Por ejemplo variables y funciones bien
definidas, todo lo referente a cuestiones sintácticas, etc. Está fuera de su alcance que el algoritmo
utilizado en el problema funcione bien.
Diseño de compiladores

• Interprete: No producen un lenguaje objetivo como en los compiladores. Un interprete lee el


código como está escrito e inmediatamente lo convierte en acciones; es decir, lo ejecuta en ese
instante.
Existe el lenguaje de programación javascript que utiliza un interprete (javascript), que traduce
en el instante mismo de lectura el código de en lenguaje máquina para que pueda ser ejecutado.
La siguiente figura muestra el funcionamiento de un intérprete.

5. Los compiladores difieren de los interpretes en varios aspectos: Un programa que ha sido compilado
puede correr por sí solo, pues en el proceso de compilación se le transformó en otro lenguaje (lenguaje
máquina).
Un interprete traduce el programa cuando lo lee, convirtiendo el código del programa directamente en
acciones. La ventaja del intérprete es que dado cualquier programa se puede interpretar en cualquier
plataforma (sistema operativo). En cambio, el archivo generado por el compilador solo funciona en la
plataforma donde se le ha creado.
Sin embargo, hablando de la velocidad de ejecución, un archivo compilado es de 10 a 20 veces más
rápido que un archivo interpretado.

6. Las dos fases del proceso de compilación son: Análisis y Síntesis.


Análisis: El cual se trata de la escritura correcta del código fuente.
Esta a su vez comprende varias fases:
• Análisis léxico: esta fase es la encargada de leer el código fuente y separarlo en lotes para poder
ser leído por el análisis sintáctico. ·
• Análisis sintáctico: esta fase evalúa los lotes de código con el fin de que este cumpla con los
requerimientos definidos por el compilador. ·
Diseño de compiladores

• Análisis semántico: en esta fase se busca establecer que el código fuente cumpla con la
semántica solicitada por el compilador, es decir que el código este correctamente escrito para
poder ser interpretado.
Síntesis: Consiste en generar el código objeto equivalente al programa fuente. Sólo se genera código
objeto cuando el programa fuente está libre de errores de análisis, lo cual no quiere decir que el
programa se ejecute correctamente, ya que un programa puede tener errores de concepto o expresiones
mal calculadas.
• · Generación de código intermedio: este código se genera con el fin de mejorar el uso de la
memoria con el fin de optimizar código fuente. ·
• Optimización de código: el objeto de esta fase es mejorar el código para que sea más rápido
ejecutarlo. ·
• Generación de código: Aquí se crea el código final de salida que va a ser interpretado por la
máquina.

7. Clasificación de los compiladores: En un sentido más amplio, un compilador traduce las instrucciones
que el usuario hace (en alto nivel) a instrucciones que la computadora pueda interpretar y ejecutar
(código binario). Por lo tanto, estas instrucciones son pulsaciones electrónicas ejecutables y para cada
lenguaje de programación se requiere un compilador separado.
Diseño de compiladores

Los compiladores pueden ser:


a) Una sola pasada: se examina el código fuente una vez, generando el código o programa objeto.
b) Pasadas múltiples: se requieren pasos intermedios para producir un código en otro lenguaje, y
una pasada final para producir y optimizar el código producido durante los pasos anteriores.
c) Optimación: lee un código fuente, lo analiza y descubre errores potenciales sin ejecutar el
programa.
d) Incrementales: generan un código objeto instrucción por instrucción cuando el usuario teclea
cada orden individual.
e) Ensamblador: el lenguaje fuente es el lenguaje ensamblador (assembler) y posee estructura
sencilla.
f) Compilador cruzado: genera código en lenguaje objeto (binario) para una máquina diferente de
la que se está usando para compilar. Un ejemplo es construir un compilador de Pascal que genere
código para MS-DOS y que el compilador funcione en LINUX y se haya escrito en C++.
g) Compilador con montador: compila distintos módulos de forma independiente y después es
capaz de enlazarlos.
h) Auto compilador: compilador que está escrito en el mismo lenguaje que va a compilar.
Lógicamente no se puede ejecutar a la primera vez. En otras palabras, hace ampliaciones al
lenguaje, mejora el código existente, etc.
i) Meta compilador: recibe como entrada las especificaciones del lenguaje para que el que se
desea obtener un compilador y genera como salida el compilador deseado. Sin embargo, tiene
una dificultad de unir la generación de código con la parte de análisis. Lo que si se ha hecho
gracias al meta compilador es el desarrollo de analizadores léxicos y sintácticos. Un ejemplo:
Generadores de analizadores léxicos LEX Analizadores sintácticos: YACC.
j) Descompilador: programa que acepta como entrada código máquina y lo traduce a un lenguaje
de alto nivel. En otras palabras, hace las funciones inversas a un compilador.
Diseño de compiladores

8.

También podría gustarte