Sie sind auf Seite 1von 17

LENGUAJES Y

AUTMATAS I
UNIDAD I

INTRODUCCIN A LA TEORA DE LENGUAJES


FORMALES
INSTITUTO TECNOLGICO DE
TAPACHULA

ING. EN SISTEMAS COMPUTACIONALES


CATEDRTICO

LIC. ANAMIN VILLAREAL WONG <3


INTEGRANTES

Arias Mrida Aldo


Miguel Alejandro Arreola Apan
Lpez Escobedo Cruz Humberto
Arvalo Reyes Adalberto

Tapachula Chiapas a 00 de 00 del 2016

Lenguajes y Autmatas I
ndice
Introduccin........................................................................................................ 3
Definicin de traductor compilador e intrprete.................................................5
Etapas del proceso de compilador usar imgenes..............................................8
Introduccin y definicin de cada una de las etapas..........................................9
Tabla de smbolos.............................................................................................. 13
Bibliografa........................................................................................................ 15

Introduccin.
En el siguiente trabajo se presentara conceptos bsicos a conocer para la
materia de lenguajes y autmatas I, partiendo desde definiciones y breves
explicaciones para as poder dar a conocer mejor cada uno de estos temas, ya
que al ser una materia extensa y un poco compleja es importante, que cada
concepto sea comprendido para as poder continuar, algunas de los temas
presentes en este trabajo son el cdigo fuente, traductores, compiladores,
interpretes, sus ventajas y desventajas, las diferencias que hay entre los
compiladores e intrpretes, tablas de smbolos, entre otros temas que se irn
incorporando al documento

UNIDAD 1.- INTRODUCCIN A LA TEORA


DE LENGUAJES FORMALES

Definicin de traductor compilador e


intrprete
Un traductor es un programa que tiene como entrada un texto escrito en un
lenguaje (lenguaje fuente) y como salida produce un texto escrito en un
lenguaje (lenguaje objeto) que preserva el significado de origen. Ejemplos de
traductores son los ensambladores y los compiladores.
Cdigo Fuente:
Se le da el nombre de cdigo fuente a los programas escritos en un
determinado lenguaje de programacin y que est compuesto por
instrucciones escritas por un programador. El cdigo fuente no constituye
software propiamente dicho pero es una instancia mediante la cual se logra el
software.
Traductores de un Lenguaje de Programacin:
Los traductores son programas que traducen los programas en cdigo fuente,
escritos en lenguajes de alto nivel, a programas escritos en lenguaje mquina.
Los traductores pueden ser de dos tipos: compiladores e intrpretes
Compilador:
Un compilador es un programa que lee el cdigo escrito en un lenguaje
(lenguaje origen), y lo traduce en un programa equivalente escrito en otro
lenguaje (lenguaje objetivo). Como una parte fundamental de este proceso de
traduccin, el compilador le hace notar al usuario la presencia de errores en el
cdigo fuente del programa.
Los lenguajes C y C++ son lenguajes que utiliza un compilador. El trabajo del
compilador y su funcin es llevar el cdigo fuente escrito en C/C++ a un
programa escrito en lenguaje mquina. Entrando en ms detalle, un programa
en cdigo fuente es compilado obteniendo un archivo parcial (un objeto) que
tiene extensin obj. Luego el compilador invoca al linker que convierte al
archivo objeto en un ejecutable con extensin exe; este ltimo archivo es un
archivo en formato binario (ceros y unos) y puede funcionar por s slo.
Adems, el compilador al realizar su tarea realiza tambin una comprobacin
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
sintcticas, etc. Est fuera del alcance del compilador que, por ejemplo, el
algoritmo utilizado en el problema funcione bien.
De esta manera un programador puede disear un programa en un lenguaje
mucho ms cercano a cmo piensa un ser humano, para luego compilarlo a un
programa ms manejable por una computadora.

Intrprete:
Los intrpretes no producen un lenguaje objetivo como en los compiladores. Un
intrprete lee el cdigo como est escrito e inmediatamente lo convierte en
acciones; es decir, lo ejecuta en ese instante.
Existen lenguajes que utilizan un intrprete (como por ejemplo JAVA) que
traduce en el instante mismo de lectura el cdigo en lenguaje mquina para
que pueda ser ejecutado.
Usando un intrprete, un solo archivo fuente puede producir resultados iguales
incluso en sistemas sumamente diferentes (ej. una PC y una consola de
videojuegos). Usando un compilador, un solo archivo fuente puede producir
resultados iguales solo si es compilado a distintos ejecutables especficos a
cada sistema.
Los programas interpretados suelen ser ms lentos que los compilados debido
a la necesidad de traducir el programa mientras se ejecuta, pero a cambio son
ms flexibles como entornos de programacin y depuracin (lo que se traduce,
por ejemplo, en una mayor facilidad para reemplazar partes enteras del
programa o aadir mdulos completamente nuevos), y permiten ofrecer al
programa interpretado un entorno no dependiente de la mquina donde se
ejecuta el intrprete, sino del propio intrprete (lo que se conoce comnmente
como mquina virtual).
Ventajas de los intrpretes
Flexibilidad: Los lenguajes interpretativos suelen ser ms flexibles y permiten
realizar acciones ms complejas, a menudo imposibles o muy difciles de
procesar para un compilador.
Ejecucin de cadenas de caracteres mediante operadores como Execute,
interpret, evalquote o value. Esto permite escribir programas muy potentes,
capaces de modificarse a s mismos.
Cambiar sobre la marcha el significado de los smbolos, e incluso prescindir por
completo de las declaraciones. Esto reduce la carga de trabajo del
programador, que no tiene que preocuparse de declarar las variables, aunque
tambin puede hacer ms difcil la depuracin de los programas.
Simplificar la gestin dinmica de memoria en los programas fuente,
ponindola por completo bajo el control del intrprete.
Obtener un enlace dinmico completo en los sistemas orientados a objetos. En
los lenguajes de este tipo, los mensajes (equivalentes a las instrucciones en los
lenguajes no orientados a objetos) se dirigen a un objeto determinado para
indicarle que debe ejecutar cierto mtodo (una funcin).
Facilidad de depuracin de programas:
Durante la ejecucin de un programa por un intrprete, dicha ejecucin puede
interrumpirse en cualquier momento, para examinar o modificar los valores de

las variables, realizar saltos en la ejecucin, abandonar la ejecucin de una


subrutina o alterar el entorno. Durante estas acciones, el hecho de que la tabla
de smbolos est disponible facilita mucho la depuracin.
Rapidez en el desarrollo:
Los programadores que utilizan un lenguaje interpretable suelen conseguir
mayor eficiencia de programacin que los que programan en lenguajes
compilables. Por esta razn, a veces se utilizan los primeros durante el
desarrollo inicial de una aplicacin muy grande, y una vez depurada se traduce
a un lenguaje compilable. En principio, la aplicacin no debera contener
muchos errores nuevos, y la mejora de eficiencia de la primera fase suele
compensar ms que de sobra la prdida de eficiencia debida a la traduccin.

Desventajas de los intrpretes


Velocidad de los programas ejecutables: A menudo son un orden de magnitud
ms lentos que programas compilados equivalentes, por lo menos. Esto se
debe a que un compilador realiza los anlisis morfolgico, sintctico y
semntico una sola vez y genera cdigo ejecutable en el lenguaje de la
mquina de una vez para siempre.
Tamao del programa objeto: Se ha visto que lo que normalmente se llama
programa compilado en entornos interpretables, en realidad no es tal, sino que
se construye aadiendo una parte del intrprete al programa fuente (que habr
sido traducido a veces a algn formato intermedio). Esto significa que los
programas ejecutables independientes escritos en lenguajes interpretativos
suelen ser mucho ms grandes que los programas compilados.
Aplicaciones de los intrpretes
Resumiendo las consideraciones anteriores, se puede decir que los intrpretes
se usan principalmente:
Cuando el lenguaje presenta caractersticas que exigen un intrprete (LISP,
APL, REXX, SMALLTALK, PROLOG).
Para el desarrollo de prototipos. Para la enseanza. Durante los aos setenta,
Seymour Pappert dise un lenguaje interpretativo llamado LOGO, que en los
ochenta fue muy bien acogido por los educadores como herramienta apropiada
para ensear los principios de la programacin a los nios pequeos. Una de
sus ideas en este contexto, los grficos tortuga, ha encontrado aplicaciones
inesperadas en otros campos, como la descripcin de curvas fractales.
Cuando el lenguaje dispone de operadores muy potentes. En tal caso, la
prdida de eficiencia debida al anlisis de las instrucciones deja de tener tanta
importancia, pues la mayor parte del tiempo los programas estn ejecutando
cdigo rpido prefabricado, incluido en el intrprete (el cdigo que implementa

dichos operadores potentes), en lugar de analizar los programas fuente del


programador. En APL, por ejemplo, existen funciones primitivas capaces de
invertir o manipular matrices completas sin tener que escribir bucle alguno.
SNOBOL es otro lenguaje de este tipo.
Diferencia entre compilador e intrprete:
Los compiladores difieren de los intrpretes en varios aspectos: Un programa
que ha sido compilado puede correr por s slo, pues en el proceso de
compilacin se lo transformo en otro lenguaje (lenguaje mquina). Un
intrprete traduce el programa cuando lo lee, convirtiendo el cdigo del
programa directamente en acciones. La ventaja del intrprete 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 en donde se le ha creado. Sin embargo, hablando de la velocidad
de ejecucin, un archivo compilado es de 10 a 20 veces ms rpido que un
archivo interpretado.

Etapas del proceso de compilador usar


imgenes

Introduccin y definicin de cada una


de las etapas
Anlisis Lxico.
En esta fase se lee los caracteres del programa fuente y se agrupan en
cadenas que representan los componentes lxicos. A la secuencia de
caracteres que representa un componente lxico se le llama lexema (o con su
nombre en ingls token).
Cada uno de estos componentes se clasifica en una categora y puede recibir
uno o ms atributos con informacin relevante para otras fases (por ejemplo un
entero tendra una etiqueta indicando su valor). El criterio que se emplea para
clasificar cada componente es su pertenencia o no a un lenguaje
(generalmente regular). Esta fase adems se encarga de filtrar elementos tales
como los blancos y los comentarios.
En este ejemplo, tendramos como categoras los identificadores, la suma, la
asignacin y el punto y coma. Podemos suponer que los identificadores son
secuencias de letras y dgitos que comienzan por una letra. Adems, hay otros
componentes que se filtran o, ms formalmente, son omitidos: los blancos y
los comentarios.

Donde hemos asumido que id es el componente lxico que representa los


identificadores; asig, representa la asignacin; suma, las sumas y pyc, el punto
y coma. Como se puede ver, han desaparecido tanto los blancos como los
comentarios.
Anlisis Sintctico.
Los componentes lxicos se agrupan en frases gramaticales que el compilador
utiliza para sintetizar la salida.
La tarea del analizador sintctico consiste en ir descubriendo las estructuras
presentes en el cdigo de acuerdo con una gramtica incontextual. A partir de
las estructuras que ha encontrado, el analizador sintctico construye un rbol
sintctico (que no hay que confundir con el rbol de sintaxis abstracta).

Usando el ejemplo anterior podemos pensar que las reglas que se siguen son
que una asignacin se compone de un identificador, seguido de un smbolo de
asignacin, seguido de una expresin y de un punto y coma. Esto se escribe en
la gramtica en forma de regla:
(Asig) id asig (Expri) pyc. Anlogamente, podemos decir que una expresin
es bien un identificador, bien la suma de dos expresiones. En reglas:

El rbol sintctico nos permite expresar cmo se puede fabricar


(formalmente, derivar) la entrada a partir de las reglas. En nuestro caso, el
rbol tiene un aspecto similar a:

Es interesante darse
cuenta de que, tanto
en las reglas como en la construccin del rbol, se hace caso omiso de los
posibles atributos de los componentes lxicos; nicamente se tiene en cuenta
su categora.
Anlisis Semntico.
La ltima fase del anlisis, el anlisis semntico, toma como entrada el rbol
sintctico y comprueba si, adems de las restricciones sintcticas, se cumplen
otras restricciones impuestas por el lenguaje y que no pueden ser
comprobadas mediante una gramtica incontextual.
En otras palabras Intenta detectar instrucciones que tengan la estructura
sintctica correcta, pero que no tengan significado para la operacin implicada.
Algunos ejemplos de estas restricciones son la necesidad de declarar las
variables antes de usarlas, las reglas de tipos o la coincidencia entre los
parmetros de las funciones en las definiciones y las llamadas. Como salida de
esta fase, se obtiene una representacin semntica, por ejemplo el rbol de
sintaxis abstracta comentado antes.
Generacin de cdigo Intermedio.
En esta etapa se traduce la entrada a una representacin independiente de la
mquina pero fcilmente traducible a lenguaje ensamblador. Esta
representacin puede tomar diversas formas que pueden entenderse como

visiones idealizadas del lenguaje ensamblador de una mquina virtual. Algunas


de las representaciones ms comunes son:
Arboles de representacin intermedia (distintos de los rboles de sintaxis
abstracta)
Cdigo de tres direcciones, cdigo de dos direcciones, cdigo de pila,
representaciones en forma de grafo, mixtas, etc.
Se puede considerar esta operacin intermedia como un subprograma para
una mquina abstracta, a esta representacin debe tener dos propiedades
importantes: debe ser fcil de producir y fcil de traducir al programa objeto.
Optimizacin de Cdigo.
Se trata de mejorar el cdigo intermedio, de modo que resulte un cdigo de
mquina ms rpido de ejecutar ya que. Tanto a la hora de generar cdigo
intermedio como cdigo objeto es habitual encontrarse con que el resultado de
la traduccin es muy ineficiente. Esto es debido a que la traduccin se realiza
de manera local, lo cual provoca la aparicin de cdigo redundante.
Por ejemplo, la sentencia a[i]=a[i]+1 genera el siguiente cdigo intermedio:

Sin embargo, es fcil darse cuenta de que no hace falta calcular dos veces la
direccin de a[i], con lo que se pueden ahorrar, al menos, tres instrucciones.
En otras ocasiones, es posible utilizar instrucciones especializadas para
mejorar la velocidad. Por ejemplo, si la instruccin anterior a valor= valor +
inc; es inc = 1; gcc - O genera: incl % ebx
Por esto, es habitual incluir mdulos encargados tanto de la optimizacin del
cdigo intermedio como del cdigo objeto.
Generacin de Cdigo.
Esta constituye la fase final de un compilador. Una vez obtenido el cdigo
intermedio, es necesario generar el cdigo objeto. Lo habitual es que no se
genere el cdigo objeto directamente sino que se genere cdigo en
ensamblador y despus se utilice un ensamblador. De cualquier forma, esta
fase es totalmente dependiente de la arquitectura concreta para la que se est
desarrollando el compilador. En particular, hay que enfrentarse a problemas
como:

Seleccin de instrucciones teniendo en cuenta su eficiencia.


Eleccin de los modos de direccionamiento adecuados.
Utilizacin eficiente de los registros.
Empleo eficiente de la cach.
Otros. . .

Administrador de la tabla de smbolos.


A lo largo del proceso de anlisis se va generando gran cantidad de
informacin que se puede considerar ligada a los objetos que se van
descubriendo en el programa: variables, constantes, funciones, etc. El acceso a
esta informacin se realiza mediante los nombres de estos objetos. Esto hace
necesario tener alguna manera de, a partir de un identificador, encontrar sus
propiedades. La estructura de datos que guarda esta informacin se denomina
tabla de smbolos y puede interactuar con prcticamente todas las fases de la
compilacin.
Algunos ejemplos de la informacin guardada son:
Constantes: tipo, valor.
Variables: tipo, direccin en memoria, tamao.
Funciones: nmero y tipo de los argumentos, tipo devuelto, direccin.
En resumen se encarga de manejar los accesos a la tabla de smbolos, en cada
una de las etapas de compilacin de un programa.
Manejador de errores.
Es un hecho que al programar se cometen errores. Es ms, se puede decir casi
con total seguridad que un compilador encuentra ms programas errneos que
correctos. As pues, es importante que el compilador ayude en la deteccin y
correccin de errores. De esta forma podrn controlarse ms eficientemente
los errores encontrados en cada una de las fases de la compilacin de un
programa, para ello, el compilador debe hacer lo siguiente ante un error:
Diagnosticarlo de la manera ms clara posible.
Detener la generacin de cdigo.
Intentar recuperarse para poder continuar el anlisis.
Veremos que, en general, no es posible detectar los errores, slo sus sntomas.
Por ejemplo, ante la entrada a:= b 1; no es posible saber si falta un + entre la
b y el 1 o si sobra un espacio o si sobra el uno. . . Sin embargo, ser posible
asegurar que la presencia de un error ha sido detectada lo antes posible; en
este ejemplo, detectaremos el error al ver el 1.

Tabla de smbolos.
Tambin se la llama tabla de nombres o tabla de identificadores y tiene dos
funciones principales:
Efectuar chequeos semnticos.
Generacin de cdigo.
Permanece slo en tiempo de compilacin, no de ejecucin, excepto en
aquellos casos en que se compila con opciones de depuracin.
La tabla almacena la informacin que en cada momento se necesita sobre las
variables del programa, informacin tal como: nombre, tipo, direccin de
localizacin, tamao, etc. La gestin de la tabla de smbolos es muy
importante, ya que consume gran parte del tiempo de compilacin. De ah que
su eficiencia sea crtica. Aunque tambin sirve para guardar informacin
referente a los tipos creados por el usuario, tipos enumerados y, en general, a
cualquier identificador creado por el usuario, nos vamos a centrar
principalmente en las variables de usuario. Respecto a cada una de ellas
podemos guardar:
Almacenamiento del nombre.
Se puede hacer con o sin lmite. Si lo hacemos con lmite, emplearemos una
longitud fija para cada variable, lo cual aumenta la velocidad de creacin, pero
limita la longitud en unos casos, y desperdicia espacio en la mayora. Otro
mtodo es habilitar la memoria que necesitemos en cada caso para guardar el
nombre. En C esto es fcil con los char *. Si hacemos el compilador en
MODULA-2, por ejemplo, habra que usar el tipo ADDRESS.
El tipo tambin se almacena en la tabla, como veremos en un apartado
dedicado a ello.
Direccin de memoria en que se guardar.
Esta direccin es necesaria, porque las instrucciones que referencian a una
variable deben saber dnde encontrar el valor de esa variable en tiempo de
ejecucin, tambin cuando se trata de variables globales. En lenguajes que no
permiten recursividad, las direcciones se van asignando secuencialmente a
medida que se hacen las declaraciones. En lenguajes con estructuras de
bloques, la direccin se da con respecto al comienzo del bloque de datos de
ese bloque, (funcin o procedimiento) en concreto.
El nmero de dimensiones de una variable array, o el de parmetros de una
funcin o procedimiento junto con el tipo de cada uno de ellos es til para el
chequeo semntico. Aunque esta informacin puede extraerse de la estructura
de tipos, para un control ms eficiente, se puede indicar explcitamente.
Tambin podemos guardar informacin de los nmeros de lnea en los que se
ha usado un identificador, y de la lnea en que se declar.

Consideraciones sobre la Tabla de Smbolos.


La tabla de smbolos puede iniciarse con cierta informacin til, tal como:
Constantes: PI, E, etc.
Funciones de librera: EXP, LOG, etc.
Palabras reservadas. Esto facilita el trabajo al lexicogrfico, que tras reconocer
un identificador lo busca en la tabla de smbolos, y si es palabra reservada
devuelve un token asociado. Bien estructurado puede ser una alternativa ms
eficiente al lxico tal y como lo hemos visto (hash perfecto).
Conforme van apareciendo nuevas declaraciones de identificadores, el
analizador lxico, o el analizador sintctico segn la estrategia que sigamos,
insertar nuevas entradas en la tabla de smbolos, evitando siempre la
existencia de entradas repetidas.
El analizador semntico efecta las comprobaciones sensibles al contexto
gracias a la tabla de smbolos, y el generador de cdigo intermedio usa las
direcciones de memoria asociadas a cada identificador en la tabla de smbolos,

al igual que el generador de cdigo.

El optimizador de cdigo no necesita hacer uso de ella


La tabla de smbolos contiene informacin til para poder compilar, por tanto
existe en tiempo de compilacin, y no de ejecucin.
Sin embargo, en un intrprete, dado que la compilacin y ejecucin se
producen a la vez, la tabla de smbolos permanece todo el tiempo.

Bibliografa
http://josesanchezsantos.blogspot.mx/2012/05/compilador-e-interprete.html
http://www.iqcelaya.itc.mx/~vicente/Programacion/TradComp.pdf
http://es.slideshare.net/Francko22/compilador-e-interpretador
http://ing-radjchv-pmz-estl.blogspot.mx/2009/09/14-traductor-y-suestructura.html
https://loscompiladores.wordpress.com/category/procesos-postcompilacion/

Das könnte Ihnen auch gefallen