Escolar Documentos
Profissional Documentos
Cultura Documentos
SCD-1015
Lenguajes y Autmatas 1
SCD-1015
transforman y producen otra informacin que se transmite al entorno. Esta teora tiene aplicacin
en campos muy diversos:
1.1 Alfabeto.
El Alfabeto es un conjunto de smbolos empleados en un sistema de comunicacin (RAE, 2001) y
que dan forma al Abecedario o una serie de las letras de un idioma para representar de una
manera escrita los conceptos e ideas que se desean transmitir de entre un emisor y un receptor a
travs de un mensaje.
En el idioma espaol, las letras A, B, C,, X, Y, Z tanto en maysculas como en
minsculas forman parte del alfabeto. Los smbolos como el punto ., la coma ,, el acento ,
los signos de interrogacin ?, los de admiracin ! y dems tambin lo integran.
Prcticamente todos elementos grficos con los cuales contamos para escribir un texto,
cumpliendo ciertas reglas lxicas, sintcticas y semnticas, nos permite dotarle de significado as
como de coherencia para poder comunicarnos con las dems personas a travs del mismo.
La nocin ms primitiva es la de smbolo que es simplemente una representacin distinguible de
cualquier informacin. Un smbolo es una entidad indivisible. El alfabeto es un conjunto no vaco
de smbolos. As, el alfabeto del idioma espaol est conformado entonces por:
a, b, c,..., x, y, z
(Brena, 2003).
Lenguajes y Autmatas 1
SCD-1015
1.3 Lenguajes.
Un lenguaje es simplemente un conjunto de palabras. As, {abracadabra} es un lenguaje de una
sola palabra. {ali, baba, y, sus, cuarenta, ladrones} es otro. Puesto que los lenguajes son conjuntos,
se puede efectuar con ellos todas las operaciones de los conjuntos (Unin, Interseccin,
Diferencia). Se define adems la operacin Concatenacin de Lenguajes, escrita como: L1 L2
como una extensin de la concatenacin de palabras. Se denota como sigue:
L1 L2 { | xy, x L1 , y L2 }
Por ejemplo, dados los lenguajes L1 = {ca, ma} y L2 = {nta, sa} la concatenacin de los dos
lenguajes sera {canta, casa, manta, masa}. Como se aprecia en este ejemplo, para calcular la
concatenacin de dos lenguajes hay que concatenar cada palabra del primero de ellos con cada
una del segundo.
Otra operacin que involucra a los lenguajes es la Estrella de Kleene o Cerradura de Kleene en
honor al matemtico norteamericano Stephen Cole Kleene. Su logro ms importante es la Teora
10
Lenguajes y Autmatas 1
SCD-1015
La palabra vaca, .
El conjunto L.
Todas las palabras formadas por la concatenacin de miembros de L*.
11
Lenguajes y Autmatas 1
SCD-1015
Todas estas clases de lenguajes son representables de manera finita (mediante cadenas de
caracteres que sirven como representacin). Ahora bien, hay ms lenguajes que posibles
representaciones finitas, por lo que se puede intuir que hay lenguajes ms all de los
Recursivamente Enumerables. Sin embargo, desde el punto de vista prctico, los lenguajes ms
tiles son aquellos que tienen una representacin finita, por lo que los dems lenguajes son slo
de inters terico. Cada una de estas clases est asociada a un tipo de Autmata capaz de
procesar estos lenguajes. Esto hace pensar que las categoras de Chomsky tienen una validez y no
son arbitrarias. (Brena, 2003).
12
Lenguajes y Autmatas 1
SCD-1015
13
Lenguajes y Autmatas 1
SCD-1015
Figura 4. Un Compilador.
Figura 6. Un Intrprete.
14
Lenguajes y Autmatas 1
SCD-1015
El programa destino en cdigo mquina que produce un compilador es, por lo general, ms rpido
que un intrprete al momento de asignar las entradas a las salidas. No obstante, por lo regular, el
intrprete puede ofrecer mejores diagnsticos de error que un compilador, ya que ejecuta el
programa fuente instruccin por instruccin.
Adems de un compilador, pueden requerirse otros programas ms para la creacin de un
programa destino ejecutable, como se muestra en la figura 6.
Un programa fuente puede dividirse en mdulos guardados en archivos separados. La tarea de
recolectar el programa de origen se confa algunas veces a un programa separado, llamado
Preprocesador. El preprocesador tambin puede expandir algunos fragmentos de cdigo
abreviados de uso frecuente, llamados macros, en instrucciones del lenguaje fuente.
Despus, el programa fuente ya modificado se alimenta a un compilador. El compilador puede
producir un programa destino escrito en Lenguaje Ensamblador como su salida, ya que es ms fcil
su depuracin. A continuacin, el lenguaje ensamblador se procesa mediante un programa
llamado Ensamblador, el cual produce cdigo mquina relocalizable como su salida.
A menudo, los programas extensos se compilan en partes, por lo que tal vez haya que enlazar
(vincular) el cdigo mquina relocalizable con otros archivos objeto relocalizables y archivos de
biblioteca para producir el cdigo que se ejecute en realidad en la mquina. El Enlazador resuelve
las direcciones de memoria externas, en donde el cdigo de un archivo puede hacer referencia a
una ubicacin en otro archivo. Entonces, el Cargador rene todos los archivos objeto ejecutable en
la memoria para su ejecucin. (Aho, et. al., 2008).
En resumen, el proceso de traduccin consta de cinco componentes bsicos: anlisis lxico,
anlisis sintctico, anlisis semntico, optimizacin y generacin de cdigo como se plantea en la
siguiente seccin y en la figura 8. Los primeros dos componentes dependen en gran medida de la
capacidad para reconocer patrones. Si stos se basan en reglas gramaticales, entonces el proceso
de reconocimiento tambin puede apoyarse en estas reglas. Lo anterior sucede al procesar un
lenguaje formal. Sin embargo, si el lenguaje que se traduce no se adhiere estrictamente a reglas
gramaticales bien definidas, puede ser muy difcil construir un segmento de programa para el
anlisis sintctico del lenguaje. Consulte la siguiente seccin. (Brookshear, 2005).
15
Lenguajes y Autmatas 1
SCD-1015
cuanto a la sintaxis, o que no tiene una semntica consistente, entonces debe proporcionar
mensajes informativos para que el usuario pueda corregirlo. La parte de anlisis tambin recolecta
informacin sobre el programa fuente y la almacena en una estructura de datos llamada Tabla de
Smbolos, la cual pasa junto con la representacin intermedia a la parte de la sntesis.
La parte de la Sntesis construye el programa destino deseado a partir de la representacin
intermedia y de la informacin en la tabla de smbolos. A la parte del anlisis se le llama
comnmente el front-end del compilador; la parte de la sntesis (propiamente la traduccin) es el
back-end.
Si se examina el proceso de compilacin con ms detalle se puede ver que opera como una
secuencia de fases, cada una de las cuales transforma una representacin del programa fuente en
otro. La figura 8 muestra una descomposicin tpica de un compilador en fases. En la prctica
varias fases pueden agruparse, y las representaciones intermedias entre las fases agrupadas no
necesitan construirse de manera explcita.
16
Lenguajes y Autmatas 1
SCD-1015
La tabla de smbolos y el manejador de errores son partes del compilador que son utilizadas
durante todas las fases o componentes ya que almacenan informacin de importancia y muestran
las inconsistencias detectadas.
Algunos compiladores tienen una fase de optimizacin de cdigo independiente de la mquina,
entre el front-end y el back-end. El propsito de esta optimizacin es realizar transformaciones
sobre la representacin intermedia, para que el back-end pueda producir un mejor programa
destino de lo que hubiera producido con una representacin intermedia sin optimizar.
Anlisis de lxico.
A la primera fase de un compilador se le llama anlisis de lxico o escaneo. El analizador de lxico
lee el flujo de caracteres que componen el programa fuente y los agrupa en secuencias
significativas conocidas como lexemas. Para cada lexema, el analizador lxico produce como salida
un token de la forma:
nombre-token, valor-atributo
17
Lenguajes y Autmatas 1
SCD-1015
Tal forma pasa a la siguiente fase, el anlisis de la sintaxis. En el token, el primer componente
nombre-token es un smbolo abstracto que se utiliza durante el anlisis sintctico, y el segundo
componente valor-atributo apunta a una entrada en la tabla de smbolos para este token. La
informacin de la entrada en la tabla de smbolos se necesita para el anlisis semntico y la
generacin de cdigo.
Por ejemplo, suponga que un programa fuente contiene la instruccin de asignacin:
posicin = inicial + velocidad * 60
Los caracteres en esta asignacin podran agruparse en los siguientes lexemas y mapearse a los
siguientes tokens que se pasan al analizador sintctico:
El analizador lxico ignora los espacios en blanco que separan a los lexemas. La figura 8 muestra la
representacin de la instruccin de asignacin despus del anlisis lxico como la secuencia de
tokens: id, 1=id, 2+id, 3*60. En esta representacin, los nombres de los
tokens=, + y * son smbolos abstractos para los operadores de asignacin, suma y multiplicacin.
Anlisis sintctico.
La segunda fase del compilador es el anlisis sintctico o parsing. El parser (analizador sintctico)
utiliza los primeros componentes de los tokens producidos por el analizador lxico para crear una
representacin intermedia en forma de rbol que describa la estructura gramatical del flujo de
tokens. Una representacin tpica es el rbol sintctico, en el cual cada nodo interior representa
18
Lenguajes y Autmatas 1
SCD-1015
una operacin y los hijos del nodo representan los argumentos de la operacin. La figura 8
muestra un rbol sintctico para el flujo de tokens como salida del analizador sintctico.
ste rbol muestra el orden en el deben de llevarse a cabo las operaciones en la siguiente
asignacin: posicin = inicial + velocidad * 60. El rbol tiene un nodo interior
etiquetado como *, con id, 3 como su hijo izquierdo, y el entero 60 como su hijo derecho. El
nodo id, 3 representa al identificador como velocidad. El nodo etiquetado como * hace
explcito que primero se debe multiplicar el valor de velocidad por 60. El nodo etiquetado como
+ indica que debemos sumar el resultado de esta multiplicacin al valor de inicial. La raz del
rbol, que se etiqueta como =, indica que se debe almacenar el resultado de esta suma en la
ubicacin del identificador posicin. Este ordenamiento de operaciones es consistente con las
convenciones usadas de la aritmtica, las cuales nos indican que la multiplicacin tiene mayor
precedencia que la suma y, por ende, debe realizarse antes de que la suma.
Las fases siguientes del compilador utilizan una estructura gramatical para ayudar al programa
fuente y generar el programa fuente y generar el programa destino.
Anlisis semntico.
El analizador semntico utiliza el rbol sintctico y la informacin en la tabla de smbolos para
comprobar la consistencia semntica del programa fuente con la definicin del lenguaje. Tambin
recopila informacin sobre el tipo y la guarda, ya sea en el rbol sintctico o en la tabla de
smbolos, para usarla ms tarde durante la generacin de cdigo intermedio.
Una parte importante del anlisis semntico es la comprobacin (verificacin) de tipos, en donde
el compilador verifica que cada operador tenga operandos que coincidan. Por ejemplo, muchas
definiciones de lenguajes de programacin requieren que el ndice del arreglo sea entero; el
compilador debe marcar un error si se utiliza un nmero de punto flotante para indexar el arreglo.
La especificacin del lenguaje puede permitir ciertas conversiones de tipo conocidas como
coerciones. Por ejemplo, puede aplicarse un operador binario aritmtico a un par de enteros o a
un par de nmeros de punto flotante. Si el operador se aplica a un nmero de punto flotante y a
un entero, el compilador puede convertir u obligar a que se convierta en un nmero de punto
flotante.
Dicha conversin aparece en la figura 8. Suponga que posicin, inicial y velocidad se han
establecido como nmeros de punto flotante, y que el lexema 60 por s solo forma un entero. El
comprobador de tipo en el analizador semntico descubre que se aplica el operador * al nmero
de punto flotante velocidad y al entero 60. En este caso, el entero puede convertirse en un
nmero de punto flotante. Observe la figura 8 que la salida del analizador semntico tiene un
nodo adicional para el operador convertirEnteroReal(), que convierte de manera explcita
su argumento tipo entero en un nmero de punto flotante.
19
Lenguajes y Autmatas 1
SCD-1015
Optimizacin de cdigo.
La fase de optimizacin de cdigo independiente de la mquina trata de mejorar el cdigo
intermedio, de manera que se produzca un mejor cdigo destino. Por lo general, mejor significa
ms rpido, pero pueden lograrse otros objetivos, como un cdigo ms corto, o un cdigo destino
que consuma menos poder. Por ejemplo, un algoritmo directo genera el cdigo intermedio de la
figura 8, usando una instruccin para cada operador en la representacin tipo rbol que produce
el analizador semntico.
20
Lenguajes y Autmatas 1
SCD-1015
= id2 + temp1
Hay una gran variacin en la cantidad de optimizacin de cdigo que realizan los distintos
compiladores. En aquellos que realizan la mayor optimizacin, a los que se denomina como
Compiladores Optimizadores, se invierte mucho tiempo en esta fase. Hay optimizaciones
simples que mejoran en forma considerable el tiempo de ejecucin del programa destino, sin
reducir demasiado la velocidad de la compilacin.
Generacin de cdigo.
El generador de cdigo recibe como entrada una representacin intermedia del programa fuente y
la asigna al lenguaje destino. Si el lenguaje destino es cdigo mquina, se seleccionan registros o
ubicaciones (localidades) de memoria para cada una de las variables que utiliza el programa.
Despus, las instrucciones intermedias se traducen en secuencias de instrucciones de mquina
que realizan la misma tarea. Un aspecto crucial de la generacin de cdigo es la asignacin juiciosa
de los registros para guardar las variables.
Por ejemplo, usando los registros R1 y R2, el cdigo intermedio anterior puede traducirse en el
siguiente cdigo de mquina:
MOV
MUL
MOV
ADD
MOV
R2, id3
#60.0
R1, id2
R1, R2
id1, R1
El primer operando de cada instruccin especfica un destino. Cada instruccin trata con nmeros
de punto flotante. El cdigo carga la direccin de memoria de id3 al registro R2 y despus lo
multiplica con la constante de punto flotante 60.0. El # indica que el nmero 60.0 se va a tratar
como una constante inmediata. La tercera instruccin mueve id2 al registro R1 y la cuarta lo
suma al valor que se haba calculado antes en el registro R2. Por ltimo, el valor en el registro R1
se almacena en la direccin de id1, por lo que el cdigo implementa en forma correcta la
instruccin de asignacin.
21
Lenguajes y Autmatas 1
SCD-1015
Manejador de errores.
Si un compilador tuviera que procesar slo programas correctos, su diseo e implementacin se
simplificara de forma considerable. No obstante, se espera que un compilador ayude al
programador a localizar y rastrear los errores que, de manera inevitable, se infiltran en los
programas, a pesar de los mejores esfuerzos del programador. Aunque parezca increble, son
pocos los lenguajes que se disean teniendo en mente el manejo de errores, an cuando stos son
tan comunes.
La mayora de las especificaciones de los lenguajes de programacin no describen la forma en que
compilador debe responder a los errores; el manejo de los mismos es responsabilidad del
diseador del compilador. La planeacin del manejo de los errores desde el principio puede
simplificar la estructura de un compilador y mejorar su capacidad para manejar los errores.
Los errores de programacin comunes pueden ocurrir en muchos niveles distintos:
Los errores lxicos incluyen la escritura incorrecta de los identificadores, las palabras clave
o los operadores. Se presentan tambin en la omisin de comillas alrededor de un texto
que se debe de interpretar como cadena.
Los errores sintcticos incluyen la colocacin incorrecta de los signos de punto y coma,
adems de llaves adicionales o faltantes; es decir, { } o la aparicin de una instruccin
case sin una instruccin switch que la enciende.
Los errores semnticos incluyen los conflictos de tipos entre los operadores y los
operandos. Un ejemplo es una instruccin return en un mtodo Java, con el tipo de
resultado void.
Los errores lgicos pueden ser cualquier cosa, desde un razonamiento incorrecto del
programador en el uso del operador de asignacin = en lugar del de comparacin == (en
22
Lenguajes y Autmatas 1
SCD-1015
C). El programa que contenga = puede estar bien formado; sin embargo, tal vez no refleje
la intencin del programador.
El manejador de errores en un compilador debe llevar a cabo las siguientes actividades:
23