Unidad Uno Compiladores.docx

  • April 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Unidad Uno Compiladores.docx as PDF for free.

More details

  • Words: 2,183
  • Pages: 14
INSTITUTO SUPERIORES DE CHIPAS

UNIVERSIDAD SALAZAR Unidad. 1 Compiladores.

Trabajo Presentado Por Los Alumnos Miguel, Maira, Samuel, Angélica y Aury Yesenia En Cumplimiento De La Materia De Compiladores, Impartido Por El Lic. Lorenzo Bastard Martínez

Ingeniería en Sistemas Computacionales

5° cuatrimestre

12 de febrero del 2017

INTRODUCCION

En esta unidad analizaremos los diversos conceptos, diferencias de los compiladores, el uso de la gramática y su importante función en los lenguajes de programación y sus funcionalidades, así como también estudiaremos las expresiones regulares, el uso de las diferentes fases de funcionamiento de los compiladores.

Contenido 1.1 Definición de compiladores ........................................................................................................ 4 1.2 Diferencia entre compiladores e intérpretes. ............................................................................ 5 1.3 Gramáticas Y Lenguajes. .......................................................................................................... 6 Gramática ambigua. ..................................................................................................................... 7 1.4 Autómatas finitos y expresiones regulares. ............................................................................... 8 1.5 Funcionamiento de un compilador. ......................................................................................... 10 1.6 Fases de un compilador............................................................................................................. 12 Conclusión........................................................................................................................................ 13 Bibliografía ........................................................................................................................................ 14

1.1 Definición de compiladores

Los compiladores son programas de computadora que traducen de un lenguaje a otro. Un compilador toma como su entrada un programa escrito en lenguaje fuente y produce un programa equivalente escrito en lenguaje objeto.

Definición de compilador. • Generalmente al lenguaje fuente se le asocia como lenguaje de alto nivel, mientras al lenguaje objeto se le conoce como código objeto (código de maquina) escrito específicamente para una maquina objeto. A lo largo del proceso de traducción el compilador debe informar la presencia de errores en el lenguaje fuente. • Diseñar y desarrollar un compilador, no es tarea fácil, y quizás pocos profesionales de la computación se vean involucrados en esta tarea. No obstante, los compiladores se utilizan en casi todas las formas de la computación y cualquiera involucrado en esta área debería conocer la organización y el funcionamiento básico de un compilador.

1.2 Diferencia entre compiladores e intérpretes.

Interpretes

Compiladores

Es un programa que lee línea a línea un Es un programa que lee totalmente un programa escrito en un lenguaje; en lenguaje programa escrito en un lenguaje; el lenguaje fuente y lo va traduciendo a un código fuente, y lo traduce a un programa intermedio, para ejecutarlo

equivalente a otro lenguaje, lenguaje objeto.

Un intérprete traduce el programa cuando lo Un programa que ha sido compilado puede lee, convirtiendo el código del programa correr por sí solo, pues en el proceso de directamente en acciones.

compilación se lo transformo en otro lenguaje (lenguaje máquina).

La ventaja del intérprete es que dado El archivo generado por el compilador solo cualquier programa se puede interpretarlo en funciona en la plataforma en donde se lo ha cualquier plataforma (sistema operativo).

creado.

No genera un ejecutable

Un archivo compilado puede ser distribuido fácilmente

conociendo

la

plataforma,

mientras que un archivo interpretado no funciona si no se tiene el intérprete El código fuente es necesario en cada El ejecutable va dirigido a una plataforma ejecución, así que no puede permanecer en concreta (una CPU, un sistema operativo, y secreto

quizá alguna otra consideración), siendo prácticamente imposible portarlo a otra. En ocasiones, se puede recompilar el programa, aunque normalmente esto plantea serias dificultades.

Un

programa

interpretado

con

un Una vez compilado el programa, el código

comportamiento torpe normalmente puede fuente no es necesario para ejecutarlo, así que ser interrumpido sin dificultad, ya que su puede permanecer en secreto si se desea. ejecución está bajo el control del intérprete, y no sólo del sistema operativo.

1.3 Gramáticas Y Lenguajes.

La gramática es la formación de la jerarquía de las estructuras en los lenguajes de programación suficientemente sencillos o simples para obtener así la eficiencia de los algoritmos de análisis sintáctico para determinar si una cadena puede generarse partiendo de una gramática.

La gramática está comprendida por:  Terminales -> símbolos básicos con que se forman las cadenas. Para un lenguaje de programación, cada palabra clave/reservada es un terminal.  No terminal -> son variables sintácticas que denotan un conjunto de cadenas (identificador o variable). Los no terminales definen conjuntos de cadenas que ayudan el lenguaje generado por la gramática. Imponen una estructura jerárquica sobre el lenguaje que es útil tanto para el análisis sintáctico como para la traducción.  Un símbolo inicial-> en una gramática, es un no terminal que representa un conjunto de cadenas.

Gramática ambigua.

La gramática ambigua es lo que se genera luego de obtener un árbol independiente de cómo se obtenga, donde luego de generarlo se obtiene uno o más árboles iguales. Una de las razones por las cuales se pueden generar la gramática ambigua es el orden de las operaciones según como allá sido la procedencia de signos, en un árbol es decir cómo se puede alterar una operación si primero en el orden del árbol se encuentra un operador de multiplicación (*) o un operador de suma (+), ya que sabemos de ante mano que el operador de multiplicaciones en este caso tiene más procedencia de suma. Siendo más claros la precedencia de operadores especifica cómo se agrupan las expresiones, por ejemplo: 1+5*3, su respuesta es 16 ya que primero de realizar la multiplicación 5*3=15 y luego se realiza la suma obteniendo como resultado 16 no por el contrario primero 1+5 para posteriormente multiplicarlo por 3 obteniendo como resultado 18. Este es uno de los casos más denotados de gramática ambigua en los lenguajes de programación, razón por la cual es importante la sintaxis clara y sencilla utilizada en los analizadores sintácticos, de tal manera que se puedan obtener los arboles correctos según su procedencia de símbolos. Para este problema de ambigüedad se cuenta con dos maneras de reducirlas. 1. Dar mayor prioridad al producto que a la suma. 2. En caso de igualdad en la prioridad obligar al uso de paréntesis. La gramática ambigua puede ser utilizada para la implementación de lenguajes utilizada para el aislamiento de contracciones sintácticas habituales para optimación en casos especiales, pero esta de manera controlada ya que puede llegar a no ser reconocida por el analizador de lenguajes.

1.4 Autómatas finitos y expresiones regulares.

Una expresión regular sirve como un descriptor de un lenguaje, también es una herramienta para describir patrones de texto, por ejemplo:

1. se utiliza una notación similar a una expresión regular para describir patrones de búsqueda. Por ejemplo en el procesamiento de documentos electrónicos, bioinformática, base de datos y en comandos de búsquedas como el GREEP de UNIX.

2. En los generadores de analizadores léxico como lex y el Flex. El análisis léxico es una fase de un compilador que divide el código de entrada en unidad lógica denominados token de uno o más caracteres. Ejemplos de tokens son las palabras reservadas (ejemplo: if), identificadores y signos como +, >. 3. en búsqueda de texto flexible, se utiliza la expresión regular como un patrón de búsqueda, por ejemplo: a??bc[f-p] pueden representar a todas las cadenas (palabras) de texto que inician con la a seguida de cualquier dos caracteres (símbolos), seguida de bc,y, finalmente un carácter que puede ser desde la f hasta la k, es decir, uno del rango de caracteres comprendidos entre la f y k. Una ventaja adicional es que se pueden convertir en una maquina (autómata finito), el cual puede automáticamente decidir si una cadena (palabra) pertenece o no al lenguaje denotado por la expresión regular. Cadena. Una cadena (o algunas veces palabra) es una secuencia finita de símbolos escogidos de un alfabeto. Por ejemplo: abc es una cadena de alfabeto ∑= {a, b}. La cadena vacía. Es la cadena de cero ocurrente de símbolos, es denotado por €.

Longitud de una cadena. Es el número de símbolos (posiciones) de una cadena. Por ejemplo aba tiene longitud 3. La notación para la longitud de una cadena w es |w|. Y |e| = 0 (la única cadena cuya longitud es cero). La estrella de kleene (o la clausura de kleene). De un lenguaje L *. Es la unión infinita ui≥0 L ͥ, donde L°= {€}, L¹=L Y L¹, PARA I > 1 ES LLL…L, la concatenación de i copias de L. Expresión regular. Se puede describir una expresión regular recursivamente como sigue: Las constantes € (cadena vacía) y 0 (conjunto vacío) son expresiones regulares. Si a ϵ ∑, es un símbolo, entonces a es una expresión regular.

1.5 Funcionamiento de un compilador. Un compilador es un traductor de un programa fuente que se encuentra en un lenguaje de alto nivel, para producir un programa objeto en un lenguaje de bajo nivel (ensamblador o código de máquina). Tiene como objetivo obtener un programa ejecutable. Para llevar a cabo esta tarea utiliza otros programas como el preprocesador, el linker, el depurador y el ensamblador. El preprocesador se encarga de incluir ficheros, expandir macros, eliminar comentarios, etc., dependiendo del lenguaje.

El linker construye el fichero ejecutable añadiendo el fichero objeto generado por el compilador, las cabeceras y las funciones de librería necesarias por el programa fuente. El depurador permite seguir paso a paso la ejecución del programa. El ensamblador, convierte un programa de lenguaje ensamblador a ejecutable.

Lenguaje fuente

Traductor

Lenguaje destino

Lenguaje destino

Entre los tipos de compiladores tenemos:  De una sola pasada: genera el programa objeto partiendo de una única lectura del programa fuente.  De varias pasadas: requieren varias lecturas del programa fuente para poder generar el código objeto.  Optimizadores: realizan cambios en el código, manteniendo la funcionalidad original, con el fin de optimizar su ejecución.  Cruzados: genera un código objeto para una máquina diferente de la que se está utilizando para compilarlo.

El proceso de compilación se divide en dos fases: análisis y síntesis. La fase de análisis divide el programa fuente en sus elementos componentes y crea representaciones intermedias del programa fuente que no necesitan ser construidas explícitamente; consta a su vez de tres fases: el análisis léxico, el análisis sintáctico y el análisis semántico. La fase de síntesis construye y optimiza el programa objeto deseado partiendo de la representación intermedia generada en la fase de análisis.

La fase de análisis léxico lee los caracteres del programa fuente, los descompone en cadenas de caracteres llamadas lexemas, y luego los agrupa y asocia en componentes léxicos. El analizador léxico va registrando los identificadores utilizados en el programa fuente y los distintos atributos de cada identificador en una estructura de datos llamada tabla de símbolos.

La fase de análisis sintáctico impone una estructura jerárquica acorde a la gramática del lenguaje fuente a la cadena de componentes léxicos generada en la fase anterior. Genera el árbol sintáctico en el cual cada nodo es un registro con dos o más campos que proporcionan información sobre el componente léxico.

La fase de análisis semántico revisa el tipo de los resultados intermedios, comprobar que los argumentos que tienen los operadores pertenecen al conjunto de operadores posibles, si son compatibles entre sí y verifica la conversión de tipos del programa; analiza el programa fuente para encontrar errores de tipo semántico, manejarlos y reunir información sobre los tipos utilizando el árbol sintáctico de la fase anterior.

Después de estas tres fases inicia la fase de síntesis, con la generación de una representación intermedia explícita del programa fuente, esto es, un programa para una máquina abstracta, de fácil producción y traducción. Finalmente se pasa a la optimización de este código intermedio, de modo que resulte un código de máquina que sea más rápido de ejecutar.

1.6 Fases de un compilador Un compilador está formado por dos procesos análisis y síntesis. 1. 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.  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.

2. Síntesis: Después del proceso de análisis se procede a generar grupos de los componentes que conforman el programa, para generar una salida.  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.

Conclusión.

En esta unidad se comprendió que el lenguaje compilador, así como la diferencia que hay entre intérprete, su gramática y lenguajes, autómatas finitos y expresiones regulares, y su funcionalidad y las fases, sirven que al momento de ejecutar una serie de códigos y encuentre un dato erróneo la compilación se va a parar; así como también los compiladores en lenguaje de alto nivel es un traductor de programa fuente y en lenguaje de bajo nivel para producir un programa es un programa ejecutable.

Bibliografía (s.f.). Obtenido de https://www.google.com.mx/search?q=FASES+DE+UN+COPILADOR&rlz=1C1GNAM_esMX 729MX729&oq=FASES+DE+UN+COPILADOR&aqs=chrome..69i57.16367j0j8&sourceid=chr ome&ie=UTF-8#q=FASES+DE+UN+COMPILADOR. El funcionamiento y comportamiento del compilador | Compiladores. (s.f.). Obtenido de https://loscompiladores.wordpress.com Wikiipedia. (s.f.). Obtenido de http://www.wikipedia.com/

Related Documents