Você está na página 1de 16

Lenguajes y Autmatas 1

SCD-1015

Unidad 1. Introduccin a los lenguajes formales.


En primer lugar, se debe esclarecer los trminos de Lenguaje Formal y Lenguaje Natural. Es posible
distinguir a ambos por medio de la pregunta qu surgi primero, el lenguaje o sus reglas
gramaticales?. En general, un lenguaje natural es aquel que ha evolucionado con el paso del
tiempo para fines de la comunicacin humana, por ejemplo, el espaol, el ingls o el alemn. Estos
lenguajes continan su evolucin sin tomar en cuenta reglas gramaticales formales; cualquier
regla se desarrolla despus de que sucede el hecho en un intento por explicar, y no determinar, la
estructura de un lenguaje. Como resultado de esto, pocas veces los lenguajes naturales se ajustan
a reglas gramaticales sencillas u obvias.
En contraste con los lenguajes naturales, los formales estn definidos por reglas preestablecidas y,
por lo tanto, se ajustan a todo rigor a ellas. Como ejemplo se tienen a los lenguajes de
programacin de computadoras y los lenguajes matemticos como el lgebra y la lgica de
proposiciones. Gracias a esta adhesin a las reglas, es posible construir traductores
computarizados eficientes para los lenguajes de programacin, a la vez que la falta de observancia
a las reglas establecidas dificulta la construccin de un traductor para un lenguaje natural.
(Brookshear. 2005).
La teora de los lenguajes formales tiene su origen en un campo aparentemente bastante alejado
de la informtica: la Lingstica. El primer trabajo que desarroll teoras formales sobre gramticas
y lenguajes fue obra de Avram Noam Chomsky quin es sin duda la figura ms destacada de la
lingstica moderna, tanto para desarrollar sus fundamentos matemticos, como por sus teoras
sobre el origen y la naturaleza de los lenguajes naturales.
En el campo de la Informtica, poco despus de las primeras publicaciones de Chomsky, el
concepto de gramtica formar adquiri una gran importancia para la especificaciones de lenguajes
de programacin. Concretamente, se defini con sus teoras las sintaxis del lenguaje ALGOL,
usndose una gramtica libre de contexto. Ello condujo rpidamente al diseo riguroso de
algoritmos de traduccin y compilacin.
Finalmente, y enlazando con el campo de la lingstica, la Teora de Lenguajes Formales es de gran
utilidad para el trabajo de otros campos de la informtica por ejemplo: en Informtica Terica,
Inteligencia Artificial, Procesamiento de Lenguajes Naturales y Reconocimiento del habla.
La teora de los Lenguajes y Gramticas Formales tiene una relacin directa con la Teora de
Autmatas, siendo posible establecer entre ambas una correspondencia denominada (en lgebra)
Isomorfismo.
La Teora de los Autmatas proviene del campo de la Ingeniera Elctrica. Claude Elwood Shannon
public varios trabajos, donde mostraba las bases para la aplicacin de la lgica matemtica a los
circuitos combinatorios y secuencias. A lo largo de las dcadas siguientes, las ideas de Shannon se
desarrollaron considerablemente. Los autmatas son sistemas que reciben informacin, la

Mtro. Christian Mirsha Velasco Castilla

Lenguajes y Autmatas 1

SCD-1015

transforman y producen otra informacin que se transmite al entorno. Esta teora tiene aplicacin
en campos muy diversos:

Lgica de los circuitos secuenciales.


Teora de control de sistemas.
Teora de la comunicacin.
Arquitectura de computadoras.
Redes de comunicacin.
Teoras de los sistemas evolutivos.
Reconocimiento de patrones.
Redes neuronales.
Reconocimiento y procesado de lenguajes de programacin.
Traduccin de lenguajes. (Cueva, 2001).

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).

Mtro. Christian Mirsha Velasco Castilla

Lenguajes y Autmatas 1

SCD-1015

1.2 Cadenas de caracteres.


Con los smbolos de un alfabeto es posible formar secuencias o cadenas de caracteres, tales como
mxzjptlk, balks, r, etctera. Las cadenas de caracteres son llamadas tambin Palabras. Un
caso particular de una cadena de texto es la palabra vaca, , la cual no tiene ninguna letra.
La longitud de una palabra es la cantidad de letras que contiene, contando las repeticiones. Se
denota por || para una palabra . Por ejemplo, |perro| tiene una longitud 5.
Cuando se escriben varias palabras o caracteres uno a continuacin de otro, se supone que
forman una sola palabra (se concatenan). La notacin usada para denotar la concatenacin de dos
cadenas y es . Por ejemplo, si = abra y = cada, la concatenacin de tales cadenas de
caracteres junto con la cadena de texto bra da como resultado una nueva cadena de texto
abracadabra con una longitud de 11 smbolos o caracteres.
La concatenacin de palabras es asociativa, esto es, () es igual a (), pero no conmutativa. La
longitud de una concatenacin cumple la propiedad ||=||+||.
Una palabra es una subcadena de otra cuando existen cadenas , posiblemente vacas
tales que sea igual a . Por ejemplo, bora es subcadena de vbora y es subcadena de
toda palabra.
El conjunto de todas las palabras que se pueden formar con un alfabeto es denotado
convencionalmente por *. Por ejemplo, si = {a, b} entonces * = {, a, aa, aaa,, b, bb, bbb,,
ab, ba, abba, baab,}. Normalmente el conjunto * es infinito, pero enumerable. (Brena, 2003).

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

Mtro. Christian Mirsha Velasco Castilla

10

Lenguajes y Autmatas 1

SCD-1015

de la Recursividad con la cual ayudo a fortalecer y formalizar las ciencias computacionales.


Adems fue inventor de varios conceptos matemticos como la Jerarqua de Kleene, el lgebra de
Kleene y el Teorema del Punto Fijo de Kleene. Tambin estableci el trmino Expresiones
Regulares. Vea la figura 1.

Figura 1. Stephen Cole Kleene.

Tal contribucin indica que si L es un lenguaje, L*, llamado Cerradura de Kleene de L, es el ms


pequeo conjunto que contiene:

La palabra vaca, .
El conjunto L.
Todas las palabras formadas por la concatenacin de miembros de L*.

Por ejemplo, si L = {abra, cadabra}, L* = {, abra, abraabra, abracadabra, cadabraabra,}.


Obsrvese que la definicin de la Cerradura de Kleene es recursiva, pues en la tercera regla se
supone que ya hay palabras en L*, las cuales pueden concatenarse para producir una nueva
palabra.
Esta definicin es congruente con la notacin * que se utiliz para definir el conjunto de todas las
palabras sobre un alfabeto, pues de hecho * es la Cerradura de Kleene del alfabeto, tomando los
smbolos de ste como palabras de una letra. (Brena, 2003).

1.4 Tipos de lenguajes.


Se le llama Clase de Lenguajes a conjuntos de lenguajes que comparten una cierta propiedad
dada. Esta nocin es muy abstracta, pues ya los lenguajes son en s mismos conjuntos de
secuencias de smbolos, y las clases de lenguajes son entonces conjuntos de conjuntos de
secuencias de smbolos.

Mtro. Christian Mirsha Velasco Castilla

11

Lenguajes y Autmatas 1

SCD-1015

La clasificacin de lenguajes en Clases de Lenguajes es debida a Avram Noam Chomsky (figura,


profesor emrito de lingstica del Instituto Tecnolgico de Massachusetts (MIT), y es muy
importante para la Teora de la Computacin. En ella, se establecen que las clases ms complejas
incluyen a las ms simples. Vea la figura 2.

Los Lenguajes Regulares, es la clase ms pequea e incluye a los lenguajes ms simples.


Un ejemplo de lenguaje regular es el conjunto de todos los nmeros binarios.
Los Lenguajes Libres de Contexto, que incluyen a los Lenguajes Regulares. Por ejemplo,
la mayora de los lenguajes de programacin son Lenguajes Libres de Contexto.
Los Lenguajes Recursivamente Enumerables, que incluyen a los Lenguajes Libres de
Contexto y por lo tanto a los Lenguajes Regulares.

Figura 2. Avram Noam Chomsky.

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).

Mtro. Christian Mirsha Velasco Castilla

12

Lenguajes y Autmatas 1

SCD-1015

Figura 3. Los lenguajes regulares en la jerarqua de Chomsky.

1.5 Herramientas computacionales ligadas con lenguajes.


Los lenguajes de programacin son notaciones que describen los clculos a las personas y las
mquinas. Nuestra percepcin del mundo en que vivimos depende de los lenguajes de
programacin, ya que todo el software que se ejecuta en todas las computadoras se escribi en
algn lenguaje de programacin. Pero antes de poder ejecutar un programa, primero debe
traducirse a un formato en el que una computadora pueda ejecutarlo. Los sistemas de software
que se encargan de esta conversin se llaman Traductores. (Aho, et. al. 2008). Ellos, normalmente
son las herramientas computacionales ligadas con lenguajes, sin embargo no son las nicas.

1.6 Estructura de un traductor.


Dicho en forma simple, un Traductor es un programa que puede leer un programa en un lenguaje
(el lenguaje fuente) y convertirlo en un programa equivalente en otro lenguaje (el lenguaje
destino). Una funcin importante del traductor es reportar cualquier error en el programa fuente
que detecte durante el proceso. Existen dos tipos de traductores: el Compilador y el Intrprete.
Vea la figura 4.

Mtro. Christian Mirsha Velasco Castilla

13

Lenguajes y Autmatas 1

SCD-1015

Figura 4. Un Compilador.

Si el programa objeto es un programa ejecutable en cdigo mquina, entonces el usuario puede


ejecutarlo para procesar las entradas y producir salidas (resultados). Vea la figura 5.

Figura 5. Ejecucin del programa de Destino.

Un Intrprete es otro tipo comn de procesador de lenguaje. En vez de producir un programa


destino como en una compilacin, el intrprete nos da la apariencia de ejecutar directamente las
operaciones especificadas en el programa de origen (fuente) con las entradas proporcionadas por
el usuario. Vea la figura 6.

Figura 6. Un Intrprete.

Mtro. Christian Mirsha Velasco Castilla

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).

1.7 Fases de un compilador.


Hasta este punto se ha tratado al compilador como una caja simple que mapea un programa
fuente a un programa destino con equivalencia semntica. Si se abre esta caja un poco, se puede
observar que hay dos procesos en esta asignacin: anlisis y sntesis.
La parte de Anlisis divide el programa fuente en componentes e impone una estructura
gramatical sobre ellas. Despus utiliza esta estructura para crear una Representacin Intermedia
del programa fuente. Si la parte de anlisis detecta que el programa fuente est mal formado en

Mtro. Christian Mirsha Velasco Castilla

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.

Figura 7. Un sistema de procesamiento de lenguajes.

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.

Mtro. Christian Mirsha Velasco Castilla

16

Lenguajes y Autmatas 1

SCD-1015

Figura 8. Fases de un Compilador.

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

Mtro. Christian Mirsha Velasco Castilla

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:

posicin es un lexema que se asigna a un tokenid, 1, en donde id es un smbolo


abstracto que representa la palabra identificador y 1 apunta a la entrada en la tabla de
smbolos para posicin. La entrada en la tabla de smbolos para un identificador
contiene informacin acerca de ste, como su nombre y tipo.
El smbolo de asignacin = es un lexema que se asigna al token=. Como este token no
necesita un valor-atributo, se omite el segundo componente. Se podra haber
utilizado cualquier smbolo abstracto como asignar para el nombre-token, pero por
conveniencia de notacin se opta por usar el mismo lexema como el nombre del smbolo
abstracto.
inicial es un lexema que se asigna al tokenid, 2, en donde 2 apunta a la entrada en
la tabla de smbolos para inicial.
+ es un lexema que se asigna al token+.
velocidad es un lexema que se asigna al tokenid, 3, en donde 3 apunta a la entrada
en la tabla de smbolos para velocidad.
*es un lexema que se asigna al token*.
60 es un lexema que se asigna al token60.

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

Mtro. Christian Mirsha Velasco Castilla

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.

Mtro. Christian Mirsha Velasco Castilla

19

Lenguajes y Autmatas 1

SCD-1015

Generacin de cdigo intermedio.


En el proceso de traducir un programa fuente a cdigo destino, un compilador puede construir
una o ms representaciones intermedias, las cuales pueden tener una variedad de formas. Los
rboles sintcticos son una forma de representacin intermedia; por lo general, se utilizan durante
el anlisis sintctico y semntico.
Despus del anlisis sintctico y semntico del programa fuente, muchos compiladores generan
un nivel bajo explcito, o una representacin intermedia similar al cdigo mquina, que se puede
considerar como un programa para una mquina abstracta. Esta representacin intermedia debe
tener dos propiedades importantes: debe ser fcil de producir y fcil de traducir en la mquina
destino.
El cdigo de tres direcciones es una secuencia de instrucciones similares al lenguaje ensamblador,
con tres operandos por instruccin. Cada operando puede actuar como un registro. La salida del
generador de cdigo intermedio de la figura 8 consiste en una secuencia de este tipo de cdigo.
temp1 = convertirEnteroReal(60)
temp2 = id3 * temp1
temp3 = id2 + temp2
id1 = temp3
Hay varios puntos que vale la pena mencionar sobre las instrucciones de tres direcciones. En
primer lugar, cada instruccin de asignacin de tres direcciones tiene, por lo menos, un operador
del lado derecho. Por ende, estas instrucciones corrigen el orden en el que se van a realizar las
operaciones; la multiplicacin va antes que la suma en el programa fuente. En segundo lugar, el
compilador debe generar un nombre temporal para guardar el valor calculado por una instruccin
de tres direcciones. En tercer lugar, algunas instrucciones de tres direcciones como la primera y
la ltima en la secuencia anterior, tienen menos de tres operandos.

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.

Mtro. Christian Mirsha Velasco Castilla

20

Lenguajes y Autmatas 1

SCD-1015

Un algoritmo simple de generacin de cdigo intermedio, seguido de la optimizacin de cdigo es


una manera razonable de obtener un buen cdigo de destino. El optimizador puede deducir que la
conversin del 60, de entero a punto flotante, puede realizarse de una vez por todas en tiempo de
compilacin, por lo que se puede eliminar la operacin convertirEnteroReal() sustituyendo
el entero 60 por el nmero de punto flotante 60.0. Adems, t3 se utiliza slo una vez para
transmitir su valor a id1, para que el optimizador pueda transformar la conversin en la siguiente
secuencia ms corta:
temp1 = id3 * 60.0
id1

= 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.

Mtro. Christian Mirsha Velasco Castilla

21

Lenguajes y Autmatas 1

SCD-1015

Administracin de la tabla de smbolos.


Una funcin especial de un compilador es registrar los nombres de las variables que se utilizan en
el programa fuente, y recolectar informacin sobre varios atributos de cada nombre. Estos
atributos pueden proporcionar informacin acerca del espacio de almacenamiento que se asigna
para un nombre, su tipo, su alcance (en qu parte del programa puede usarse su valor), y en el
caso de los nombres de procedimientos, cosas como el nmero y los tipos de sus argumentos, el
mtodo para pasar cada argumento (por ejemplo, por valor o por referencia) y el tipo devuelto.
La tabla de smbolos es una estructura de datos que contiene un registro para cada nombre de
variable, con campos para los atributos del nombre. La estructura de datos debe disearse de tal
forma que permita al compilador buscar el registro para cada nombre, y almacenar y obtener
datos de ese registro con rapidez.

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

Mtro. Christian Mirsha Velasco Castilla

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:

Reportar la presencia de errores con claridad y precisin.


Recuperarse de cada error lo bastante rpido como para poder detectar los errores
siguientes.
Agregar una sobrecarga mnima al procesamiento de los programas correctos.

El manejador de errores debe reportar el lugar en el programa fuente en donde se detect un


error, ya que hay una buena probabilidad de que ste en s haya ocurrido en uno de los pocos
tokens anteriores. Una estrategia comn es imprimir la lnea del problema como un apuntador a la
posicin en la que se detect el error. Vea la figura 9. (Aho, et. al., 2008).

Figura 9. Fases de un Compilador, Administrador de Smbolos y Manejador de Errores.

Mtro. Christian Mirsha Velasco Castilla

23

Você também pode gostar