You are on page 1of 83

Ingeniera en Sistemas

Computacionales












Tamazunchale, S.L.P. 2012


ANTOLOGA


Elaborado por:
ING. MIRIAM EDITH GALICIA MENDIOLA



INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 2




INDICE
UNIDAD 1
Introduccin a la programacin de sistemas

1.1 Qu es y que estudia la programacin de sistemas?.......................................5
1.2 Herramientas desarrolladas con la teora de programacin de sistemas...6
1.3 Lenguajes...8
1.3.1 Lenguajes naturales...8
1.3.2 Lenguajes artificiales..9
1.3.3 Proceso de la comunicacin..9
1.4 Traductor y su estructura.11
1.4.1 Ensambladores.13
1.4.2 Compiladores15
1.4.3 Interpretes.17
1.5 Generadores de cdigo para compiladores (compilador de compilador)..18

UNIDAD 2
Introduccin al diseo de los lenguajes de programacin

2.1 Visin del problema19
2.2 Consideracin preliminares...20
2.3 Objetivos y filosofas del diseo de los lenguajes de programacin..21
2.4 Diseo detallado..23
2.5 Caso de estudio..23

UNIDAD 3
Anlisis Lxico
3.1 Introduccin a los Autmatas finitos y expresiones regulares24
3.2 Analizador lxico.......24
3.3 Manejo de localidades temporales de memoria (buffers)25
3.4 Creacin de tablas de smbolos26
3.5 Manejo de errores lxicos..30
3.6 Generadores de cdigo lxico: Lex y Flex..30



INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 3




UNIDAD 4
Anlisis sintctico
4.1 Introduccin a las Gramticas libres de contexto y rboles de derivacin...37
4.2 Diagramas de sintaxis37
4.3 Precedencia de operadores..38
4.4 Analizador sintctico..39
4.4.1 Analizador descendente (LL).40
4.4.2 Analizador ascendente (LR, LALR)..40
4.5 Administracin de tablas de smbolos.40
4.6 Manejo de errores sintcticos y su recuperacin..40
4.7 Generadores de cdigo para analizadores sintcticos: Yacc, Bison.43

UNIDAD 5
Anlisis semntico
5.1 Analizador semntico.45
5.2 Verificacin de tipos en expresiones...48
5.3 Conversin de tipos51
5.4 Acciones agregadas en un analizador sintctico descendente (top-down).51
5.5 Pila semntica en un analizador sintctico ascendente (bottom-up).52
5.6 Administracin de la tabla de smbolos...52
5.7 Manejo de errores semnticos..52
UNIDAD 6
Generacin de cdigo intermedio

6.1 Lenguajes intermedios...53
6.2 Notaciones53
6.2.1 Infija54
6.2.2 Postfija...54
6.2.3 Prefija.55
6.3 Representacin de cdigo intermedio.55
6.3.1 Notacin Polaca...55
6.3.2 Cdigo P56
6.3.3 Triplos....59
6.3.4 Cudruplos60
6.4 Esquemas de generacin..61
6.4.1 Expresiones......63
6.4.2 Declaracin de variables y constantes.64
6.4.3 Estatuto de asignacin65
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 4


6.4.4 Estatuto condicional.66
6.4.5 Estatuto de ciclos.67
6.4.6 Arreglos.70
6.4.7 Funciones..70


UNIDAD 7
Optimizacin
7.1 Tipos de optimizacin.72
7.1.1 Locales..72
7.1.2 Bucles73
7.1.3 Globales.73
7.1.4 De mirilla73
7.2 Costos...74
7.2.1 Costo de ejecucin..74
7.2.2 Criterios para mejorar el cdigo.75
7.2.3 Herramientas para el anlisis del flujo de datos.75



UNIDAD 8
Generacin de cdigo objeto

8.1 Lenguaje mquina..76
8.1.1 Caractersticas..77
8.1.2 Direccionamiento.77
8.2 Lenguaje ensamblador..77
8.2.1 Caractersticas..78
8.2.2 Almacenamiento..81
8.3 Registros..81
8.3.1 Distribucin83
8.3.2 Asignacin.83
8.4 Administracin de memoria...83






INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 5




UNIDAD 1 INTRODUCCION A LA PROGRAMACION DE SISTEMAS

1.1. QUE ES Y QUE ESTUDIA LA PROGRAMACION DE SISTEMAS?

QUE ES?

Un sistema es un conjunto de componentes que interaccionan entre si para lograr
un objetivo comn. Las personas se comunican con el lenguaje, que es un sistema
muy desarrollado formado por palabras y smbolos que tienen significado que
tienen significado para el que habla y para quienes lo escuchan, lo mismo es para
las computadoras las cuales tienen sistemas y se comunican por medio de
computadoras.

La programacin es el proceso de convertir las especificaciones a grandes rasgos
de los sistemas en instrucciones de maquina que produzcan los resultados
deseados.

QUE ESTUDIA?

El trabajo de un programador de sistemas es seleccionar, modificar y mantener el
complejo software del sistema operativo.
Por lo tanto, los programadores de sistemas desempean una funcin de apoyo al
mantener el ambiente del software del sistema operativo en el que trabajan los
programadores de aplicaciones y los operadores de las computadoras. Tambin
participan en las decisiones relativas a reducciones o ampliaciones de hardware y
software.

PROGRAMACIN DE SISTEMAS CONCEPTOS Y APLICACIONES
Se entiende por programacin de sistemas el conjunto de programas necesario
para que una computadora de una imagen coherente y monoltica ante sus
usuarios. Es un rea especializada dentro de las ciencias de la computacin. As,
mediante la programacin de sistemas, no solo se manejan las computadoras por
medio del lenguaje maquina (0 y 1) sino por otros sistemas operativos, sin lo cual
sera muy difcil la interaccin con la maquina.

INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 6




EL ESTUDIO DE LA PROGRAMACIN DE SISTEMAS
En esta rea se estudia la teora de mquinas y su aplicacin en el diseo de
sistemas digitales y de arquitectura de computadoras. reas especficas: Sistemas
digitales para arquitecturas paralelas y control de procesos y sistemas
reconfigurables.

1.2 HERRAMIENTAS DESARROLLADAS CON TEORA DE LA
PROGRAMACIN DE SISTEMAS
Las herramientas de programacin, son aquellas que permiten realizar aplicativos,
programas, rutinas, utilitarios y sistemas para que la parte fsica del computador u
ordenador, funcione y pueda producir resultados.
Hoy da existen mltiples herramientas de programacin en el mercado, tanto para
analistas expertos como para analistas inexpertos.
Las herramientas de programacin ms comunes del mercado, cuentan hoy da
con programas de depuracin o debugger, que son utilitarios que nos permiten
detectar los posibles errores en tiempo de ejecucin o corrida de rutinas y
programas.
Muchas herramientas de software que manipulan programas fuente realizan
primero algn tipo de anlisis. Algunos ejemplos de tales herramientas son:
1. Editores de estructuras: Un editor de estructuras toma como entrada
una secuencia de rdenes para construir un programa fuente. El editor de
estructuras no slo realiza las funciones de creacin y modificacin de textos de
un editor de textos ordinario, sino que tambin analiza el texto del programa,
imponiendo al programa fuente una estructura jerrquica apropiada. De esa
manera, el editor de estructuras puede realizar tareas adicionales tiles para la
preparacin de programas. Por ejemplo, puede comprobar si la entrada est
formada correctamente, puede proporcionar palabras clave de manera automtica
(por ejemplo, cuando el usuario escribe while, el editor proporciona el
correspondiente do y le recuerda al usuario que entre las dos palabras
Debe ir un condicional) y puede saltar desde un begin o un parntesis izquierdo
hasta su correspondiente end o parntesis derecho. Adems, la salida de tal editor
suele ser similar a la salida de la fase de anlisis de un compilador.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 7




2. Impresoras estticas: Una impresora esttica analiza un programa y lo
imprime de forma que la estructura del programa resulte claramente visible. Por
ejemplo, los comentarios pueden aparecer con un tipo de letra especial, y las
proposiciones pueden aparecer con una identificacin proporcional a la
profundidad de su anidamiento en la organizacin jerrquica de las proposiciones.
3. Verificadores estticos: Un verificador esttico lee un programa, lo
analiza e intenta descubrir errores potenciales sin ejecutar el programa. La parte
de anlisis a menudo es similar a la que se encuentra en los compiladores de
optimizacin. As, un verificador esttico puede detectar si hay partes de un
programa que nunca se podrn ejecutar o si cierta variable se usa antes de ser
definida. Adems, puede detectar errores de lgica, como intentar utilizar una
variable real como apuntador, empleando las tcnicas de verificacin de tipos.
4. Intrpretes: En lugar de producir un programa objeto como resultado de
una traduccin, un intrprete realiza las operaciones que implica el programa
fuente. Para una proposicin de asignacin, por ejemplo, un intrprete podra
construir un rbol como el de la figura 1 y despus efectuar las operaciones de los
nodos conforme recorre el rbol. En la raz descubrira que tiene que realizar una
asignacin, y llamara a una rutina para evaluar la expresin de la derecha y
despus almacenara el valor resultante en la localidad de memoria asociada con
el identificador posicin. En el hijo derecho de la raz, la rutina descubrira que
tiene que calcular la suma de dos expresiones. Se llamara a s misma de manera
recursiva para calcular el valor de la expresin velocidad*60. Despus sumara
ese valor de la variable inicial. Muchas veces los intrpretes se usan para ejecutar
lenguajes de rdenes, pues cada operador que se ejecuta en un lenguaje de
rdenes suele ser una invocacin de una rutina compleja, como un editor o un
compilador. Del mismo modo algunos lenguajes de muy alto nivel, normalmente
son interpretados, porque hay muchas cosas sobre los datos, como el tamao y la
forma de las matrices, que no se pueden deducir en el momento de la
compilacin.
5. Compiladores: Tradicionalmente, se concibe un compilador como un
programa que traduce un programa fuente, como FORTRAN, al lenguaje
ensamblador o de mquina de algn computador. Sin embargo, hay lugares, al
parecer, no relacionados donde la tecnologa de los compiladores se usa con
regularidad. La parte de anlisis de cada uno de los siguientes ejemplos es
parecida a la de un compilador convencional.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 8




1.3 LENGUAJES
Se llama lenguaje a cualquier tipo de cdigo semitico estructurado, para el que
existe un contexto de uso y ciertos principios combinatorios formales. Existen
muchos contextos tanto naturales como artificiales donde aparecen lenguajes.
El lenguaje humano se basa en la capacidad de los seres humanos para
comunicarse mediante de signos. Principalmente lo hacemos utilizando el signo
lingstico. An as, hay diversos tipos de lenguaje. El lenguaje humano puede
estudiarse en cuanto a su desarrollo desde dos puntos de vista complementarios:
la ontogenia, que remite al proceso de adquisicin del lenguaje por el ser humano,
y la filogenia El lenguaje animal se basa en el uso de seales sonoras, visuales y
olfativas a modo de signos para referirse a un referente o un significado diferente
de dichas seales. Dentro del lenguaje animal estn los gritos de alarma, el
lenguaje de las abejas, etc. Los lenguajes formales son construcciones artificiales
humanas, que se usan en matemtica y otras disciplinas formales, incluyendo
lenguajes de programacin. Estas construcciones tienen estructuras internas que
comparten con el lenguaje humano natural, por lo que pueden ser en parte
analizados con los mismos conceptos que ste.
1.3.1 Lenguajes Naturales
Este tipo de lenguaje es el que nos permite el designar las cosas actuales y
razonar a cerca de ellas, fue desarrollado y organizado a partir de la experiencia
humana y puede ser utilizado para analizar situaciones altamente complejas y
razonar muy sutilmente. La riqueza de sus componentes semnticos da a los
lenguajes naturales su gran poder expresivo y su valor como una herramienta para
razonamiento sutil. Por otro lado la sintaxis de un LN puede ser modelada
fcilmente por un lenguaje formal, similar a los utilizados en las matemticas y la
lgica. Otra propiedad de los lenguajes naturales es la polisemantica, es decir la
posibilidad de que una palabra en una oracin tenga diversos significados.

En un primer resumen, los lenguajes naturales se caracterizan por las siguientes
propiedades:

Desarrollados por enriquecimiento progresivo antes de cualquier intento de
formacin de una teora.

La importancia de su carcter expresivo debido grandemente a la riqueza
del componente semntico (polisemantica).

INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 9


Dificultad o imposibilidad de una formalizacin completa.


1.3.2 Lenguajes Artificiales

El lenguaje nos permite hacer la abstraccin y conceptualizacin de ideas y por
medio de este comunicarnos. En las distintas ramas de la ciencia nos
encontramos con lenguajes artificiales o mejor conocidos como lenguajes formales
que limitan su alcance a su materia de estudio.

Concretamente y despus de esta breve introduccin, en la actualidad nos
encontramos con distintos lenguajes para para programar y tambin los campos
de aplicacin son variados y completamente distintos. De acuerdo a la
complejidad del problema a resolver ser necesario hacer una seleccin adecuada
del lenguaje de programacin (incluso se puede generar el lenguaje de
programacin propio) que permita resolver de manera eficiente el problema.

Hasta hace pocos aos, el software de desarrollo se basaba fundamentalmente en
Lenguajes Artificiales (Basic, C, Cobol, Pascal) para explicar a la computadora
las acciones a realizar. Por el contrario, los Orientados a Objetos permiten que el
programador ignore el lenguaje comprensible para la mquina poniendo a su
disposicin una serie de objetos preprogramados. De este modo la tarea se
simplifica enormemente y se reduce a disponer, dentro de la ventana de programa
y en la secuencia adecuada, los programas y funciones de los que nos provee.


1.3.3 Proceso De La Comunicacin

La comunicacin es un fenmeno inherente a la relacin grupal de los seres vivos
por medio del cual stos obtienen informacin acerca de su entorno y de otros
entornos y son capaces de compartirla haciendo partcipes a otros de esa
informacin. La comunicacin es de suma importancia para la supervivencia de
especies gregarias, pues la informacin que sta extrae de su medio ambiente y
su facultad de transmitir mensajes sern claves para sacar ventaja del modo de
vida gregario.

Etimolgicamente, la palabra comunicacin deriva del latn commnicre, que
puede traducirse como poner en comn, compartir algo. Se considera una
categora polismica en tanto su utilizacin no es exclusiva de una ciencia social
en particular, teniendo connotaciones propias de la ciencia social de que se trate.

Proceso de transmisin de informacin de un emisor (A) a un receptor (B) a travs
de un medio . En la transmisin y la recepcin de esa informacin se utiliza un
cdigo especfico que debe ser codificado, por el emisor y decodificado por el
receptor.

INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 10






Elementos del Proceso de la comunicacin

Los elementos de la comunicacin humana son: fuente, emisor o codificador,
cdigo (reglas del signo, smbolo), mensaje primario (bajo un cdigo), receptor o
decodificador, canal, ruido (barreras o interferencias) y la retroalimentacin o
realimentacin (feed-back, mensaje de retorno o mensaje secundario).

Fuente: Es el lugar de donde emana la informacin, los datos, el
contenido que se enviar, en conclusin: de donde nace el mensaje
primario.

Emisor o codificador: Es el punto (persona, organizacin) que elige y
selecciona los signos adecuados para transmitir su mensaje; es decir, los
codifica para poder llevarlo de manera entendible al receptor. En el emisor
se inicia el proceso comunicativo.

Receptor o decodificador: Es el punto (persona, organizacin) al que
se destina el mensaje, realiza un proceso inverso al del emisor ya que en l
est el descifrar e interpretar lo que el emisor quiere dar a conocer. Existen
dos tipos de receptor, el pasivo que es el que slo recibe el mensaje, y el
receptor activo o perceptor ya que es la persona que no slo recibe el
mensaje sino que lo percibe y lo almacena. El mensaje es recibido tal como
el emisor quiso decir, en este tipo de receptor se realiza lo que comnmente
denominamos el feed-back o retroalimentacin.

Cdigo: Es el conjunto de reglas propias de cada sistema de signos y
smbolos que el emisor utilizar para trasmitir su mensaje, para combinarlos
de manera arbitraria porque tiene que estar de una manera adecuada para
que el receptor pueda captarlo. Un ejemplo claro es el cdigo que utilizan
los marinos para poder comunicarse; la gramtica de algn idioma; los
algoritmos en la informtica, todo lo que nos rodea son cdigos.

Mensaje: Es el contenido de la informacin (contenido enviado): el
conjunto de ideas, sentimientos, acontecimientos expresados por el emisor
y que desea trasmitir al receptor para que sean captados de la manera que
desea el emisor. El mensaje es la informacin.

Canal: Es el medio a travs del cual se transmite la informacin-
comunicacin, estableciendo una conexin entre el emisor y el receptor.
Mejor conocido como el soporte material o espacial por el que circula el
mensaje. Ejemplos: el aire, en el caso de la voz; el hilo telefnico, en el
caso de una conversacin telefnica.

INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 11





Referente: Realidad que es percibida gracias al mensaje. Comprende
todo aquello que es descrito por el mensaje.

Situacin: Es el tiempo y el lugar en que se realiza el acto comunicativo.

Interferencia o barrera: Cualquier perturbacin que sufre la seal en el
proceso comunicativo, se puede dar en cualquiera de sus elementos. Son
las distorsiones del sonido en la conversacin, o la distorsin de la imagen
de la televisin, la alteracin de la escritura en un viaje, la afona del
hablante, la sordera del oyente, la ortografa defectuosa, la distraccin del
receptor, el alumno que no atiende aunque est en silencio.

Retroalimentacin o realimentacin (mensaje de retorno): Es la
condicin necesaria para la interactividad del proceso comunicativo,
siempre y cuando se reciba una respuesta (actitud, conducta) sea
deseada o no. Logrando la interaccin entre el emisor y el receptor. Puede
ser positiva (cuando fomenta la comunicacin) o negativa (cuando se busca
cambiar el tema o terminar la comunicacin). Si no hay realimentacin,
entonces solo hay informacin ms no comunicacin.


1.4 TRADUCTOR Y SU ESTRUCTURA

Traductor: En un sentido orientado hacia la computacin, un traductor, de manera
general, es un software que toma como entrada un programa escrito en un cdigo
llamado fuente y genera como salida otro programa en un cdigo llamado objeto.

Algunos ejemplos de traductores son los compiladores (toma como entrada cdigo
en alto nivel y genera como salida cdigo en bajo nivel), los interpretes (toma
como entrada cdigo en alto nivel y genera como salida un cdigo intermedio), los
preprocesadores (toma como entrada cdigo en alto nivel y genera como salida
cdigo en alto nivel) y el ensamblador (toma como entrada cdigo en ensamblador
y genera como salida cdigo en bajo nivel).

Su estructura podra ser expresada de la siguiente manera:

cdigo fuente ->> traductor -> cdigo objeto







INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 12





Intrpretes o Traductores

Definicin. Un intrprete es un programa que ejecuta un programa escrito en un
determinado lenguaje examinando y ejecutando cada sentencia del programa una
a una, por separado y sin realizar un proceso de compilacin previo.

Al contrario de lo que se podra pensar el intrprete NO traduce la sentencia a
cdigo mquina antes de ejecutarla. En su lugar, identifica el tipo de sentencia y la
ejecuta directamente. El cdigo para ejecutar la sentencia est contenido dentro
del intrprete que contendr rutinas para: evaluar una expresin, almacenar
informacin en memoria, recuperar datos de memoria, etc. El intrprete contendr
el nmero de rutinas necesarias para poder ejecutar cualquier sentencia del
lenguaje que est interpretando.

Ejemplo: C:= A + B

1. El intrprete lee la sentencia y determina que es una asignacin.

2. Llamar a una de sus rutinas para evaluar la expresin a la derecha de la
asignacin.

3. Esta rutina toma los smbolos A y B, determina donde estn almacenados,
obtiene sus valores actuales y los suma.

Comparacin entre compiladores e intrpretes

Histricamente, debido a la escasez de memoria de los primeros ordenadores, se
puso de moda el uso de intrpretes frente a los compiladores, pues el programa
fuente sin traducir y el intrprete juntos requeran una cantidad de memoria menor
que la del compilador. Por ello, los primeros ordenadores personales (Spectrum,
Commodore VIC-20, PC XT de IBM, etc.) iban siempre acompaados de un
intrprete de BASIC. La mejor informacin sobre los errores por parte del
compilador as como una mayor velocidad de ejecucin del cdigo resultante hizo
que poco a poco se impusieran los compiladores. Hoy en da, y con el problema
de la memoria prcticamente resuelto, se puede hablar de un gran predominio de
los compiladores frente a los intrpretes, aunque intrpretes como los incluidos en
los navegadores de Internet para Java son la gran excepcin.

Algunas de las ventajas de compilar frente a interpretar son:

Se compila una vez; se ejecuta muchas veces

La ejecucin del programa objeto es mucho ms rpida que si se interpreta
el programa fuente.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 13



El compilador tiene una visin global del programa, por lo que la
informacin de mensajes de error es ms detallada.

Por otro lado, algunas de las ventajas de interpretar frente a compilar son:

Un intrprete necesita menos memoria que un compilador.

Permiten una mayor interactividad con el cdigo en tiempo de desarrollo.

En algunos lenguajes (Smalltalk, Prolog, LISP, Java) est permitido y es
frecuente aadir cdigo segn se ejecuta otro cdigo, y esta caracterstica
solamente es posible implementarla en un intrprete.


1.4.1 Ensambladores
Cuando se empezaron a utilizar smbolos nemotcnicos, se escribieron programas
para traducir automticamente los programas escritos en lenguaje ensamblador a
lenguaje mquina. A estos programas traductores se les llamo ensambladores.
La entrada para un ensamblador es un programa fuente escrito en lenguaje
ensamblador. La salida es un programa objeto, escrito en lenguaje de mquina. El
programa objeto incluye tambin la informacin necesaria para que el cargador
pueda preparar el programa objeto para su ejecucin. Para evitar confusiones, de
aqu en adelante llamaremos lenguaje ensamblador al conjunto de nemotcnicos y
a las reglas para su manejo. Al programa que traduce un programa objeto a partir
de un programa escrito en lenguaje ensamblador lo llamaremos ensamblador.
Motivos para utilizarlo:
Rapidez
Mayor control de la computadora
Independencia del lenguaje
La mayora de las computadoras pueden ensamblarlo
Motivo para no utilizarlo:
Dependencia de hardware
Mayor tiempo de codificacin
Comprensin mas profunda de la computadora
Errores mas frecuentes en el programa
Tipos de Ensambladores
Aunque todos los ensambladores realizan bsicamente las mismas tareas,
podemos clasificarlos de acuerdo a caractersticas.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 14


Ensambladores Cruzados (Cross-Assembler). Se denominan as los
ensambladores que se utilizan en una computadora que posee un
procesador diferente al que tendrn las computadoras donde va a
ejecutarse el programa objeto producido.
El empleo de este tipo de traductores permite aprovechar el soporte de
medios fsicos (discos, impresoras, pantallas, etc.), y de programacin que
ofrecen las mquinas potentes para desarrollar programas que luego los
van a ejecutar sistemas muy especializados en determinados tipos de
tareas.
Ensambladores Residentes. Son aquellos que permanecen en la memoria
principal de la computadora y cargan, para su ejecucin, al programa objeto
producido.
Este tipo de ensamblador tiene la ventaja de que se puede comprobar
inmediatamente el programa sin necesidad de transportarlo de un lugar a
otro, como se haca en cross-assembler, y sin necesidad de programas
simuladores. Sin embargo, puede presentar problemas de espacio de
memoria, ya que el traductor ocupa espacio que no puede ser utilizado por
el programador.
Macroensambladores. Son ensambladores que permiten el uso de
macroinstrucciones (macros). Debido a su potencia, normalmente son
programas robustos que no permanecen en memoria una vez generado el
programa objeto. Puede variar la complejidad de los mismos, dependiendo
de las posibilidades de definicin y manipulacin de las macroinstrucciones,
pero normalmente son programas bastantes complejos, por lo que suelen
ser ensambladores residentes.

Macroensambladores. Generalmente, los procesadores utilizados en las
computadoras tienen un repertorio fijo de instrucciones, es decir, que el
intrprete de las mismas interpretaba de igual forma un determinado cdigo
de operacin. El programa que indica al intrprete de instrucciones de la
UCP cmo debe actuar se denomina microprograma. El programa que
ayuda a realizar este microprograma se llama macroensamblador. Existen
procesadores que permiten la modificacin de sus microprogramas, para lo
cual se utilizan macroensambladores.

Ensambladores de una fase. Estos ensambladores leen una lnea del
programa fuente y la traducen directamente para producir una instruccin
en lenguaje mquina o la ejecuta si se trata de una pseudoinstruccin.
Tambin va construyendo la tabla de smbolos a medida que van
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 15


apareciendo las definiciones de variables, etiquetas, etc. Debido a su forma
de traduccin, estos ensambladores obligan a definir los smbolos antes de
ser empleados para que, cuando aparezca una referencia a un determinado
smbolo en una instruccin, se conozca la direccin de dicho smbolo y se
pueda traducir de forma correcta. Estos ensambladores son sencillos,
baratos y ocupan poco espacio, pero tiene el inconveniente indicado.

Ensambladores de dos fases. Los ensambladores de dos fases se
denominan as debido a que realizan la traduccin en dos etapas. En la
primera fase, leen el programa fuente y construyen una tabla de smbolos;
de esta manera, en la segunda fase, vuelven a leer el programa fuente y
pueden ir traduciendo totalmente, puesto que conocen la totalidad de los
smbolos utilizados y las posiciones que se les ha asignado.


1.4.2 Compiladores

Un compilador acepta programas escritos en un lenguaje de alto nivel y los
traduce a otro lenguaje, generando un programa equivalente independiente, que
puede ejecutarse tantas veces como se quiera. Este proceso de traduccin se
conoce como compilacin.

el de los programas de partida (LA)

el de los programas equivalentes traducidos (LB), normalmente el lenguaje
de mquina

el lenguaje en que est escrito el propio compilador (LC), que puede ser
igual o diferente a LA. Aumenta la portabilidad del compilador si est escrito
en el mismo lenguaje, es decir, se puede compilar a s mismo.

Los programas interpretados suelen ser ms lentos que los compilados, pero los
intrpretes son ms flexibles como entornos de programacin y depuracin.

Comparando su actuacin con la de un ser humano, un compilador equivale a un
traductor profesional que, a partir de un texto, prepara otro independiente
traducido a otra lengua, mientras que un intrprete informtico corresponde al
intrprete humano, que traduce de viva voz las palabras que oye, sin dejar
Partes de un compilador





INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 16






Normalmente los compiladores estn divididos en dos partes:

Front End: es la parte que analiza el cdigo fuente, comprueba su
validez, genera el rbol de derivacin y rellena los valores de la tabla
de smbolos. Esta parte suele ser independiente de la plataforma o
sistema para el cual se vaya a compilar.

Back End: es la parte que genera el cdigo mquina, especfico de
una plataforma, a partir de los resultados de la fase de anlisis,
realizada por el Front End.

Esta divisin permite que el mismo Back End se utilice para generar el cdigo
mquina de varios lenguajes de programacin distintos y que el mismo Front End
que sirve para analizar el cdigo fuente de un lenguaje de programacin concreto
sirva para la generacin de cdigo mquina en varias plataformas distintas.

El cdigo que genera el Back End normalmente no se puede ejecutar
directamente, sino que necesita ser enlazado por un programa enlazador (linker).

Tipos de compiladores

Esta taxonoma de los tipos de compiladores no es excluyente, por lo que puede
haber compiladores que se adscriban a varias categoras:

Compiladores cruzados: generan cdigo para un sistema distinto
del que estn funcionando.

Compiladores optimizadores: realizan cambios en el cdigo para
mejorar su eficiencia, pero manteniendo la funcionalidad del
programa original.

Compiladores de una sola pasada: generan el cdigo mquina a
partir de una nica lectura del cdigo fuente.

Compiladores de varias pasadas: necesitan leer el cdigo fuente
varias veces antes de poder producir el cdigo mquina.

Compiladores JIT (Just In Time): forman parte de un intrprete y
compilan partes del cdigo segn se necesitan.




INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 17





Los primeros compiladores se realizaron programndolos directamente en
lenguaje mquina o en ensamblador. Una vez que se dispone de un compilador,
se pueden escribir nuevas versiones del compilador (u otros compiladores
distintos) en el lenguaje que compila ese compilador.

Actualmente existen herramientas que facilitan la tarea de escribir compiladores
intrpretes informticos. Estas herramientas permiten generar el esqueleto del
analizador sintctico a partir de una definicin formal del lenguaje de partida,
especificada normalmente mediante una gramtica formal y barata, dejando
nicamente al programador del compilador la tarea de programar las acciones
semnticas asociadas.

1.4.3 Interpretes

Un intrprete es un traductor que toma un programa fuente, lo traduce y a
continuacin lo ejecuta. BASIC es un lenguaje interpretado.

Se trata de traductores-ejecutores ya que con cada instruccin realizan un proceso
triple de lectura-traduccin-ejecucin. Son relativamente lentos, pero muy buenos
para la depuracin de programas.

Se puede tambin utilizar una alternativa diferente de los compiladores para
traducir lenguajes de alto nivel. En vez de traducir el programa fuente y grabar en
forma permanente el cdigo objeto que se produce durante la corrida de
compilacin para utilizarlo en una corrida de produccin futura, el programador
slo carga el programa fuente en la computadora junto con los datos que se van a
procesar. A continuacin, un programa intrprete, almacenado en el sistema
operativo del disco, o incluido de manera permanente dentro de la mquina,
convierte cada proposicin del programa fuente en lenguaje de mquina conforme
vaya siendo necesario durante el proceso de los datos. No se graba el cdigo
objeto para utilizarlo posteriormente.

La siguiente vez que se utilice una instruccin, se le debe interpretar otra vez y
traducir a lenguaje mquina. Por ejemplo, durante el procesamiento repetitivo de
los pasos de un ciclo, cada instruccin del ciclo tendr que volver a ser
interpretado cada vez que se ejecute el ciclo, lo cual hace que el programa sea
ms lento en tiempo de ejecucin (porque se va revisando el cdigo en tiempo de
ejecucin) pero ms rpido en tiempo de diseo (porque no se tiene que estar
compilando a cada momento el cdigo completo). El intrprete elimina la
necesidad de realizar una corrida de compilacin despus de cada modificacin
del programa cuando se quiere agregar funciones o corregir errores; pero es obvio
que un programa objeto compilado con antelacin deber ejecutarse con mucha
mayor rapidez que uno que se debe interpretar a cada paso durante una corrida
de produccin.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 18





1.5 GENERADORES DE CDIGO PARA COMPILADORES (COMPILADOR DE
COMPILADOR)


Aqu se hablar de las herramientas generadoras automticas de cdigo para un
compilador. Estas herramientas trabajan basadas en un conjunto de reglas; estas
reglas definen la traduccin de las instrucciones del lenguaje intermedio al
lenguaje de mquina.

Para la generacin de cdigo, se busca en las reglas establecidas la proposicin
que coincida con la entrada actual; la entrada actual proviene de un rbol. Un
ejemplo de esto seria

Entonces el compilador recibe una entrada de caracteres, por lo general escrita
por el programador; el compilador realiza los anlisis: lxico, sintctico y
semntico, para generar seguidamente el cdigo intermedio, el cdigo intermedio
se genera con principios de bsqueda de patrones y aplicacin de reglas.
Despus se hace la optimizacin del cdigo intermedio; seguidamente se realiza
la generacin de cdigo objeto en lenguaje de mquina.

En sntesis para crear un generador de cdigo se deben hacer muchas de las
tareas que realizan los compiladores; algunas de estas tareas son: la bsqueda de
patrones, la escritura de cdigo, el anlisis sintctico, el anlisis lxico y la
optimizacin de cdigo. Estas tareas las realiza el desarrollador una vez para una
arquitectura especfica.

METACOMPILADOR: Es Sinnimo De compilador de compiladores y se refiere a
un programa que recibe como entrada las especificaciones del lenguaje para el
que se desea obtener un compilador y genera como salida el compilador para ese
lenguaje. El desarrollo de los metacompiladores se encuentra con la dificultad de
unir la generacin de cdigo con la parte de anlisis. Lo que s se han desarrollado
son generadores de analizadores lxicos y sintcticos.

Por ejemplo, los conocidos:

Generador de analizadores lxicos LEX.

Generador de YACC: analizadores sintcticos desarrollados para UNIX.

Los inconvenientes que tienen son que los analizadores que generan no son muy
eficientes.


INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 19





UNIDAD 2 INTRODUCCIN AL DISEO DE LOS LENGUAJES DE
PROGRAMACIN

2.1 VISIN DEL PROBLEMA
Un lenguaje es diseado a menudo para su aplicacin en un rea especfica. La
mayor atencin es dada a restringir el rea de la aplicacin del lenguaje, el mejor
lenguaje ser para problemas en esa rea. De hecho no es conveniente el
procurar disear un lenguaje de uso general conveniente para ningn problema.
Todo intento ha sido desilusionando (notablemente PL/YO y ALGOL 68).
Actualmente, toda evidencia indica que nadie sabe cmo hacer un trabajo
apropiado de disear un idioma que ser bueno para todo.
Finalmente, la relacin de un nuevo lenguaje hacia lenguajes existentes se debe
considerar. Weinberg (1971) discute el fenmeno psicolgico de la inhibicin,
que ocurre cuando un viejo lenguaje y un lenguaje nuevo no son semejantes pero
idnticos. El usuario es susceptible a confundirse gravemente con la incertidumbre
acerca de cunto del viejo lenguaje conservara en el nuevo. Por ejemplo. Los
programadores de FORTRAN que aprende que PL/YO formatear E/S tiene gran
problema con E- y formatos DE TIPO F, que no son semejantes pero idntico a la
construccin del FORTRAN. En el resumen es preferible hacer el nuevo lenguaje
claramente diferente que hacerlo semejante a algn lenguaje existente. Si los
nuevos y los viejos lenguajes
Los lenguajes de programacin existentes pueden ser la fuente para mejores
ideas para la programacin de diseadores de lenguaje. Los diseadores deben
ser muy cuidadosos inclusive acerca de ideas tales en su propio producto, sin
embargo, porque los diseadores del pasado han hecho grandes errores en el
pasado.
Algunos principios despreciables se pueden pronunciar para distinguir buenas
ideas dignas de la perpetuacin y de malas ideas dignas slo de la extincin.
Quizs el principal principio deber preguntar por qu se hizo esa manera? Una
vez que usted obtiene una respuesta a esta pregunta, se pregunta Es esa razn
(todava) vlida a menudo la respuesta a esta pregunta ser no. Para el ejemplo
FORTRAN las extraas restricciones en subndices de serie dirigiendo las
caractersticas de su hardware y tuvo miedo que esto no se podra hacer si
ninguna expresin permitindolo como un subndice. Aunque esto se pueda
considerar quizs razonable (u optar menos entendible) en la circunstancia que lo
ciertamente no es hoy defendible, acerca de la reduccin grave en valor prctico
resultante.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 20



Aunque vale la pena para recordar el que incluso si el juicio general en un
lenguaje sea (un diseo malo esto no significa que identificacin no oculta las
caractersticas que valen la pena en algn lugar mas profundamente. Por ejemplo,
aunque APL se pueda criticar en muchas veces, bien puede valer la pena el copiar
sus poderosos operadores.
Semejantemente, el hecho que una caractersticas est comnmente disponible
no puede implicar que sistema operativo una idea buena. Muchos idiomas han
seguido ALGOL 60's principal en permitir el tamao de series para ser decidido en
corre tiempo, una caracterstica que introduce los problemas considerables de la
implementacin e interviene con verificar de error de compila-tiempo. Esta
caracterstica puede ser del valor slo limitado en ciertas reas de aplicaciones. El
fenmeno de declaraciones predefinidas, heredado de FORTRAN, es otro ejemplo
de palabrotas disea. Esta caracterstica en el detalle ilustra la grasa que algn
arte actualmente popular de caractersticas de hecho totalmente perjudicial
programar la calidad. Semejantemente, el hecho de que una de las caractersticas
estn comnmente disponibles no se puede implicar que sea una buena idea su
sistema operativo. Muchos lenguajes han seguido ALGOL 60's principalmente el
permitir el tamao de series para ser decididazas con mayor rapidez,
caracterstica que presenta considerablemente la implementacin de problemas e
interfiere con el tiempo de compilacin del cheque de errores. Esta caracterstica
puede ser del valor slo limitado en ciertas reas de aplicacin. El fenmeno de
preferido declaraciones, heredado de FORTRAN, es otro ejemplo de un mal
diseo de programacin. Esta caracterstica en particular clusula; entonces
probablemente sera irrazonable requerir ELSE en todo IF. La nocin
relativamente reciente de experimentacin con cambios de diseo en condiciones
controladas ofrece bsicamente los mismos tipos de conclusiones indudablemente
la investigacin seguir en las reas de medir el empleo de los lenguajes de
programacin y experimentar en el diseo de los lenguaje de programacin.

2.2 CONSIDERACIONES PRELIMINARES

Debemos tomar en cuenta las palabras reservadas del lenguaje, los operadores,
los tipos de datos, el objetivo del lenguaje, si es un lenguaje de enseanza, si es
un lenguaje para profesionales, si el cdigo desarrollado va a ser mejor.

Los factores fundamentales en la calidad del software son: la eficiencia, la
portabilidad, la verificabilidad, la integridad, la facilidad de uso, la exactitud, la
robustez, la extensibilidad, la compatibilidad y la reutilizacin. En trminos
generales, estos factores pueden describirse de la siguiente forma:

La eficiencia: capacidad para el aprovechamiento ptimo de los recursos
que emplea.

INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 21



Los lenguajes OOP arrastraron en un principio la reputacin de ser ineficaces.
Esto se deba en gran medida a que los primeros lenguajes (como Smalltalk) eran
interpretados y no compilados. La existencia de compiladores permite a los
desarrolladores ganar rapidez. Actualmente, usando un buen lenguaje orientado a
objetos como C++, Java, etc. Junto con las libreras apropiadas para la realizacin
de un programa, puede que se ejecute ms rpidamente que el mismo programa
compilado con un lenguaje procedural

La portabilidad: facilidad para ser ejecutados en distintos entornos lgicos o
fsicos.

La verificabilidad: capacidad para soportar procedimientos de pruebas, test
o ensayos.

La integridad: nivel de proteccin frente a procesos que traten de alterarlo.

La facilidad de uso: comodidad y claridad en la interaccin con el usuario.

La exactitud: nivel de precisin que alcanzan los resultados obtenidos.

La robustez: capacidad para funcionar correctamente en situaciones
extremas.

La extensibilidad: capacidad para adaptar su funcionamiento al incremento
en sus objetivos.

La compatibilidad: facilidad de poder ser aplicados en conjuncin con otros
programas.

La reutilizacin: posibilidad de utilizarlos (total o parcialmente) en nuevos
contextos.

2.3 OBJETIVOS Y FILOSOFAS DEL DISEO DE LOS LENGUAJES DE
PROGRAMACIN

El principal objetivo del lenguaje es, por supuesto, servir de apoyo didctico en
una materia de lenguajes de programacin, intrpretes y compiladores. Derivado
de la persecucin de este objetivo surgen varias metas especficas y objetivos
particulares:

La apreciacin del desarrollo e implementacin de un lenguaje de
programacin.

La comprensin del procedimiento seguido en la formacin de un conjunto
de reglas gramaticales que permiten identificar y nombrar sin ambigedad
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 22


acciones y secuencias ordenadas de acciones sobre el contexto especfico
de un problema en particular.

Proporcionar un medio de familiarizacin con la realizacin de operaciones
aritmticas usando una pila y su posterior extensin para la manipulacin
de otros datos.

La clara especificacin y adecuada documentacin del proceso de creacin
o extensin de un lenguaje y sus resultados.

En el diseo de Stop se ha tratado de seguir muchos de los principios usados en
los modernos lenguajes de programacin hasta el punto donde su implementacin
no sea demasiado complicada para el desarrollo de un proyecto semestral.
Principalmente se ha buscado que sea regular, modular y estructurado.

Filosofa de diseo del lenguaje

El lenguaje de programacin esta pensado para la programacin evolutiva. Esta
consiste en un mtodo de programacin basado en un ciclo de prueba y error
donde se refina un programa hasta conseguir que haga lo que queremos. Esta
forma de programar se aplica a problemas donde se desconoce que algoritmo nos
llevar a la solucin. Esta situacin se da en investigacin y en la creacin de
prototipos donde hay que realizar muchas pruebas hasta dar con la solucin ms
apropiada. Para estos casos, es ms apropiado el uso de un interprete que un
compilador, ya que de esta forma se reduce el tiempo invertido en cada prueba.



Para que un lenguaje sea efectivo en programacin evolutiva tiene que facilitar: la
interaccin, la modificacin del programa y aportar instrucciones de alto nivel
cercanas al problema. Estos tres punto se consiguen cuando el lenguaje tiene las
siguientes caractersticas:

Estado de Interaccin. Entre prueba y prueba es interesante guardar el estado de
ejecucin. De esta forma se evita repetir la ejecucin de las instrucciones
necesarias para llegar al estado de ejecucin donde queremos realizar pruebas.
Los programas implementa esta caracterstica mediante un mbito global dinmico
que guarda funciones y variables mientras se utiliza el intrprete.

Sintaxis Cercana al Problema. Es ms efectivo escribir en una notacin cercana al
problema que adaptarse a la sintaxis de un lenguaje de programacin. De esta
forma se evita el paso de traduccin que tiene que realizar el programador antes
de escribir una nueva sentencia del programa.




INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 23




2.4 DISEO DETALLADO

El diseo detallado tiene que ver con la especificacin de detalles algortmicos,
representaciones concretas de datos, interconexiones entre funciones y
estructuras de datos, y empaque del producto de programacin. El diseo
detallado est fuertemente influenciado por el lenguaje de instrumentacin, pero
no es lo mismo que la instrumentacin; el diseo detallado tiene que ver ms con
aspectos semnticos y menos con detalles sintcticos que es la instrumentacin.

El punto de inicio para el diseo detallado es una estructura arquitectnica a la
que se le van a proporcionar los detalles algortmicos y las representaciones
concretas de datos. Mientras que hay una fuerte tentacin para proceder
directamente de la estructura arquitectnica a la instrumentacin, hay varias
ventajas que pueden lograrse en el nivel intermedio de detalle proporcionado por
el diseo detallado.

La instrumentacin comunica los aspectos de la sintaxis del lenguaje de
programacin, el estilo de codificacin la documentacin interna, y la insercin de
pruebas y depuraciones al cdigo. Las dificultades que se encuentran durante la
instrumentacin casi siempre se deben al hecho de que el instrumentador
simultneamente est realizando anlisis, diseo y actividades de codificacin
mientras intenta expresar el resultado final en un lenguaje de instrumentacin. El
diseo detallado permite el diseo de algoritmos y representaciones de datos en
un nivel ms alto de abstraccin y notacin que el que proporciona el lenguaje de
instrumentacin.

El diseo detallado separa la actividad de diseo a bajo nivel de la
instrumentacin, igual que las actividades de anlisis y diseo aslan las
consideraciones de lo que se desea de la estructura que lograr los resultados
deseados. Una especificacin adecuada de diseo detallado minimiza el nmero
de sorpresas durante la instrumentacin del producto.

2.5 CASO DE ESTUDIO

Explicar el lenguaje que se va a desarrollar en el curso:

Por qu se va a desarrollar (problemtica)?

Vocabulario del lenguaje (lxico palabras clases que hacen)

Reglas de estructura (gramtica, sintaxis)

Semntica

Si existe cdigo intermedio
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 24



Si se mejora ese cdigo

El cdigo objeto final


UNIDAD 3 ANLISIS LXICO

3.1 INTRODUCCIN A LOS AUTMATAS FINITOS Y EXPRESIONES
REGULARES

Un autmata finito o mquina de estado finito es un modelo matemtico de un
sistema que recibe una cadena constituida por smbolos de un alfabeto y
determina si esa cadena pertenece al lenguaje que el autmata reconoce.

Definicin formal

Formalmente, un autmata finito (AF) puede ser descrito como una 5-tupla
(S,,T,s,A) donde:

S un conjunto de estados;
es un alfabeto;
T es la funcin de transicin:
s \in S es el estado inicial;
A \subseteq S es un conjunto de estados de aceptacin o finales.

Ejemploo 1
S = {S1, S2},
= {0,1},
T = (S1,0,{S2});(S1,1,{S1});(S2,0,{S1});(S2,1,{S2})
s = S1
A = {S1}

3.2 ANALIZADOR DE LXICO

El analizador lxico es la primera fase de un compilador, lee caracteres de entrada
para formar componentes e identificarlos o clasificarlos y pasar la informacin de
los componentes al analizador sintctico.

Realiza adems funciones como eliminar espacios en blanco, saltos de lnea,
tabuladores, ignorar comentarios, deteccin y recuperacin de errores. Los errores
que un analizador lxico reconoce son smbolos no vlidos o no reconocidos por el
lxico del lenguaje o que no forman parte de ningn componente lxico.

Existen diversos mtodos para construir una analizador lxico, un mtodo es usar
un AFD para describir el patrn de cada componente. Para este mtodo se parte
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 25


de una tabla descriptiva de los componentes lxicos que reconocer el
analizador, en donde se clasifican los diversos tipos de componentes.

Para cada componente se construye un AFD que permita identificar el patrn de
smbolos que deber recibir y donde deber terminar ese patrn que seale que
ah se encontr un componente. Todos los AFDs se integran en un solo
diagrama. Finalmente se determina la matriz de transicin de estados, que no es
ms que transcripcin del AFD integrado, en donde las columnas son los smbolos
que acepta el analizador, incluyendo una columna para \b \t \n y otra columna para
otro que representa a cualquier carcter o smbolo diferente de los sealados por
el analizador. Lo que resta es crear un algoritmo de reconocimiento de cadenas y
aadir mediante una seleccin de casos para tomar la accin correspondiente
segn la cadena encontrada.

3.3 MANEJO DE LOCALIDADES TEMPORALES DE MEMORIA (BUFFERS)

La forma ms fcil de leer un programa es carcter por carcter pero es
ineficiente.

La forma ms eficiente es realizar una copia a la memoria de todo el cdigo
fuente. Pero esto en la gran mayora de las ocasiones es imprctico por las
dimensiones de los programas. Para solucionar este problema se sugiere utilizar
buffers

Manejo de buffers

Existen muchas formas de dividir el trabajo, pero siempre se deber llevar dos
punteros, uno al carcter actual y otro al inicial del lexema.

El manejo de buffers es esencial para realizar el anlisis de grandes programas de
mejor manera

La diferente de velocidad entre los dos tipos de memoria es muy grande, por lo
que resulta interesante definir algn tipo de estrategia que reduzca este
diferencial.

Un buffer se define como un conjunto de bytes que son ledos o escritos
desde un dispositivo de almacenamiento, en la memoria primaria.

Cuando se desea leer una informacin, se lee un bloque de informacin en
el que aparece.

La modificacin de un dato se realiza sobre el buffer, que posteriormente
debe ser enviado al dispositivo de almacenamiento.

La utilizacin de esta tcnica permite reducir el nmero de accesos a
memoria secundaria.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 26





Nmero de Buffers y Velocidad de Acceso

El manejo de buffers por parte del administrador de ficheros permite reducir el
nmero de accesos a memoria secundaria. - Pero una cuestin fundamental es el
nmero de buffers a utilizar. - Si slo se utiliza un buffer, un problema que realice
lecturas y escrituras de modo alterno, debera leer un bloque en cada operacin. -
Esto se resuelve mediante la utilizacin de un buffer para escritura y otro para
lectura. - Pero la lectura, o escritura, alterna sobre varios ficheros puede provocar
el mismo problema. - Otra alternativa es la utilizacin de ambos bloques para
lecturas y escrituras de modo alternado.

La generalizacin de esta idea es el caso real, varios buffers que se
manejan de modo indistinto para lecturas y escrituras.

La gestin de estos buffers es realizada por el administrador de ficheros,
aunque el usuario puede controlar el nmero de buffers.

Si todos los buffers estn ocupados, se debe vaciar uno de ellos para
posibilitar una lectura.

Normalmente se utiliza al algoritmo LRU, es decir, se vaca el buffer menos
recientemente utilizado.

3.4 CREACIN DE TABLAS DE SMBOLOS

Conjunto de pares clave-valor, llamados elementos de la tabla.

La tabla de smbolos es una componente necesaria de un compilador. Al declarar
un identificador (normalmente una sola vez), ste es insertado en la tabla. Cada
vez que se utilice el identificador se realizar una bsqueda en la tabla para
obtener la informacin asociada (el valor).

Problemas asociados:

Bsqueda: dada la clave de un elemento, encontrar su valor. Insercin:
Dado un par clave-valor, aadir un elemento nuevo a la tabla. Cambio de
valor: Buscar el elemento y cambiar su valor. Borrado: Eliminar un elemento
de la tabla. Longitud de bsqueda (o tiempo de acceso):

De una clave: Li = nmero de comparaciones con elementos de la tabla
para encontrar esa clave. Mxima: LM = nmero mximo de comparaciones
para encontrar cualquier clave. Media (esperada): Lm = nmero medio de
comparaciones para encontrar un valor. Si la frecuencia de todas las claves
es la misma:
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 27


Lm = (S Li)/N

Si la frecuencia de todas las claves no es la misma:
Lm = S pi.Li

Grado de ocupacin:
s = n/N

Donde n=nmero de elementos en la tabla y N=capacidad mxima de la tabla.
Funcin de bsqueda: B : KE asocia a cada clave k un elemento B(k).

Valor asociado a una clave k: v(B(k)). Puede ser mltiple, en cuyo caso
normalmente se convierte en un puntero. Si est en la tabla puede almacenarse
consecutivamente o en subtablas paralelas.

Tablas de smbolos (identificadores) La clave es el identificador. El valor est
formado por:

Atributos del identificador. Puntero a la posicin de memoria asignada.
La clave puede sustituirse por un puntero.

Los identificadores pueden estar empaquetados.

La longitud del identificador puede especificarse en la tabla o delante del nombre,
o ser implcita.

Tablas consecutivas: Todos los elementos ocupan posiciones de memoria
adyacentes. Tablas ligadas: cada elemento apunta al siguiente. Tablas
doblemente ligadas: cada elemento apunta al siguiente y al anterior. Tablas
no ordenadas Insercin: en el primer lugar vaco.

Bsqueda: secuencial, elemento a elemento.
Lm = (n+1)/2
LM = N

La bsqueda es muy lenta cuando el nmero de elementos es mayor que 20.

Bsqueda binaria o logartmica.

Algoritmo de bsqueda en el bloque (1,n):

Se mira el elemento (n+1)/2. Si es ese, encontrado. Si es menor, se busca en el
bloque (1,(n-1)/2). Si es mayor, se busca en el bloque ((n+3)/2,n). Longitud de
bsqueda:
Lm = 1+log2 (n)

Mucho mejor que en tablas no ordenadas. Insercin:
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 28



Se usa la bsqueda binaria para encontrar el elemento j tal que
K(E(j))<k<K(E(j+1)) Si la tabla es consecutiva, se corre toda la tabla un lugar
desde E(j+1) hasta E(n) y se introduce el elemento nuevo en E(j+1). Si la tabla es
ligada, se inserta un elemento nuevo entre E(j) y E(j+1). En tablas consecutivas, si
se van a insertar muchos elementos a la vez, podra convenir ordenarlos al final
para evitar tantos traslados.

Tablas en rbol binario Usan rboles binarios. Se compara la clave k con la del
elemento. Si es mayor, se va a la derecha, si es menor a la izquierda. El tiempo de
bsqueda depende del orden de insercin de los elementos y slo es calculable si
el rbol est equilibrado. Si no, se convierte en una lista ordenada, reordenando.
Ej: G D M E A B F H. Secuencias aparentemente aleatorias pueden producir el
mismo resultado.

Implementacin: con dos punteros: izquierda, derecha; o con una tabla secuencial
(2*i+1, 2*i+2).

Ejemplo: identificadores de una sola letra. La tabla tendr 26/52 elementos como
mximo.
I(k) = k-A; // (26 elementos)
I(k) = (k<a) ? k-A : 26+k-a; // (52 elementos)

Bsqueda: dado k, se halla I(k) y se tiene el elemento.
Li = Lm = LM = 1

Problema: si hay muchos identificadores, y no podr ser biyectiva. Llega un
momento en que obtener I(k) lleva ms tiempo que la bsqueda.

Tablas Hash o de entrada calculada Es el mtodo ms usado. Se trata de
trasformar la clave en un ndice de entrada aplicndole una funcin Hash, I(k), que
puede no ser biyectiva.

Es equivalente a una tabla de acceso directo mientras no aparezcan dos claves
tales que I(k1) = I(k2): colisin.

Hay dos mtodos principales para resolver la colisin.

Tablas Hash abiertas (con rehash) Supongamos que los elementos de T son
0,1,,N-1.

Bsqueda de la clave k.

Se calcula h = I(k). Se compara k con T(h). Si es igual, encontrado. Si hay colisin
(k!=T(h)&&T(h)!=NULL) se compara k con T(mod(h+p1,N)). Si hay nueva colisin
se compara k con T(mod(h+p2,N)). Si hay nueva colisin se compara k con
T(mod(h+pi,N)). hasta que se encuentre la clave buscada, un lugar vaco o se
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 29


vuelva a T(h). En el primer caso, se ha encontrado. En el segundo, no est en
la tabla. En el tercero, tampoco est, y la tabla est llena para ese valor de la
funcin Hash. Este almacenamiento se llama espaciado, porque los elementos
ocupados estn esparcidos por la tabla.

Tipos de rehash: lineal, aleatorio, multiplicativo, cuadrtico.

Rehash lineal pi = i

Se comparan elementos sucesivos. Problema: apiamiento de elementos.

La longitud de bsqueda es difcil de calcular (depende del grado de apiamiento,
y ste del orden en que se definen los identificadores).

Peterson realiz simulaciones. Schay y Spruth aplicaron la hiptesis de que en el
apiamiento todos los elementos de la posicin i aparecen antes que los de la
posicin i+1 y obtuvieron la frmula:
Lm = (1-s/2)/(1-s)

Resultados:
s Peterson Schay/Spruth A.C.M.
--- -------- ------------ ------
0.1 1.053 1.056
0.2 1.137 1.125 1.43
0.3 1.230 1.214
0.4 1.366 1.333 2.35
0.5 1.541 1.500
0.6 1.823 1.750 3.24
0.7 2.260 2.167
0.8 3.223 3.000 5.22
0.9 5.526 5.500
1.0 16.914 14.67

Es mucho mejor que la bsqueda binaria. No depende del nmero de elementos,
sino del grado de ocupacin.

Rehash aleatorio pi = pseudoaleatorio.

Se elimina el apiamiento.
Lm = -loge(1-s)/s

Resultados:
s Lm
--- --------
0.1 1.05
0.5 1.39
0.9 2.56
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 30



Rehash multiplicativo pi = ih, donde h es el ndice original.

Se prueban los elementos h, 2h, 3h, (mod N)

Funciona bien si N es primo (cubre toda la tabla).

h nunca puede valer 0. La tabla ir de 1 a N-1.

Rehash cuadrtico pi = a.i*2+b.i+c

Hay que procurar que cubra lo ms posible la tabla.

Si N = 2*p no cubre casi.

Si N es primo, cualquier combinacin de a,b,c cubre media tabla. Es peor que el
aleatorio, pero Lm y el tiempo de clculo de pi son mejores.

Ejemplo: sea c=0, para incluir p0 (h=h+p0 => p0=0 => c=0).
dpi = p(i+1)-p(i) = 2.a.i+a+b

3.5 MANEJO DE ERRORES LXICOS

Consiste en que cuando se detecta una cadena no reconocible, se siguen leyendo
caracteres hasta que se vuelve a detectar un token vlido. Borrar un carcter
extrao. Insertar un carcter que falta (e.g. reemplazar 2C por 2*C). Reemplazar
un carcter incorrecto por otro correcto (e.g. reemplazar INTEJER por INTEGER si
el lugar en donde aparece el primer lexema no es el indicado para un identificador)
Intercambiar dos caracteres, tokens, adyacentes (e.g. I INTEGER por INTEGER
I).

La recuperacin de errores durante el AL puede producir otros en las siguientes
fases. var numero : integer; begin num?ero:=10; end el compilador podra producir
los siguientes mensajes de error: ERROR LXICO: carcter no reconocido (?)
ERROR SEMNTICO: identificador no declarado (num) ERROR SINTCTICO:
falta operador entre identificadores ERROR SEMNTICO: identificador no
declarado (ero)

3.6 GENERADORES DE CDIGO LXICO: LEX Y FLEX

Lex es un lenguaje (y un traductor para las especificaciones escritas en l) que
sirve para asociar acciones a la presencia de palabras (secuencias de caracteres)
ledas de un fichero de tipo texto; las formas de las palabras que se pretende
detectar se especifican en Lex mediante una notacin que es una ampliacin de
las expresiones regulares.


INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 31


Pero antes de esa exposicin, en este captulo se describen las expresiones
regulares Lex con una amplitud suficiente para poder realizar la especificacin de
las caractersticas lexicogrficas ms habituales de los lenguajes de
programacin; no se trata de una descripcin exhaustiva: no se han incluido
algunos aspectos ms difciles y empleados con menor frecuencia.

Aunque el captulo empieza con un recordatorio de la definicin bsica de las
expresiones regulares, para su lectura es preciso tener conocimientos sobre el
papel que tienen las expresiones regulares en la caracterizacin de los lenguajes
regulares.

Ampliacin de las expresiones regulares

Las expresiones regulares (propiamente dichas, en un sentido estricto), tal y como
se estudian en la teora de lenguajes para especificar los lenguajes regulares,
estn constituidas por smbolos de un alfabeto , relacionados mediante los
operadores binarios alternativa ( | ) y concatenacin ( ) y el operador unario
estrella ( * ); en la escritura de una expresin regular tambin se pueden emplear
parntesis para precisar el orden de aplicacin de los operadores. El asterisco de
la operacin estrella suele colocarse como exponente de la parte de la expresin
regular afectada.

La precedencia de los operadores es la definida por la siguiente jerarqua,
relacionada de mayor a menor precedencia:

1 operaciones entre parntesis

2 operadores estrella

3 operadores concatenacin

4 operador alternativa

As, por ejemplo, son expresiones regulares definidas sobre el alfabeto = { a, b }

baa|bb

a*(b|ba)

La primera denota el lenguaje regular formado por dos palabras {baa, bb} y la
segunda denota el lenguaje regular de infinitas palabras {b, ba, ab, aba, aab,


Entre los smbolos que aparecen en una expresin regular cabe distinguir los
caracteres y los meta caracteres; los caracteres son los smbolos que pertenecen
al alfabeto sobre el que est definida la expresin regular; los meta caracteres son
los smbolos que no pertenecen a ese alfabeto: los operadores y los parntesis.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 32



En la escritura de las expresiones regulares el punto representativo de la
concatenacin entre smbolos del alfabeto suele suprimirse; de acuerdo con esta
notacin simplificada, las anteriores expresiones suelen escribirse as:

baa|bb

a*(b|ba) Dado que el espacio en blanco no es un smbolo perteneciente al alfabeto
sobre el que estn definidas las expresiones regulares anteriores, tambin
podran escribirse (sin ocasionar confusin y con la pretensin de favorecer la
legibilidad) de esta manera:

baa | bb

a* ( b | ba )

En una especificacin Lex se incluyen expresiones regulares, pero escritas con
una notacin que es una ampliacin de la notacin empleada en la definicin (en
sentido estricto) anterior. Esta ampliacin tiene como principales objetivos:

Hacer ms cmoda y escueta la escritura de las expresiones regulares,

Distinguir de manera precisa los caracteres del alfabeto y los meta
caracteres empleados en la escritura de las expresiones regulares.

Sea el alfabeto = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, la expresin regular que denota las
palabras de longitud uno es:

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Con la notacin ampliada de las expresiones regulares Lex (empleando unos
nuevos meta caracteres: el guion y los corchetes de abrir y de cerrar), esa misma
expresin puede escribirse as:

[09]

Las expresiones regulares de una especificacin Lex han de procesarse mediante
un programa y, por ello, han de estar grabadas en un fichero de tipo texto. En
estas condiciones no resulta adecuado el convenio segn el cual la operacin
estrella se escribe en forma de exponente; por ejemplo, la expresin regular

ab*

Quedara grabada en el fichero mediante la secuencia de tres caracteres
consecutivos ab*. Si = {+, -, *, /} es el alfabeto sobre el que definen las
expresiones regulares, qu lenguaje denota la expresin regular +* grabada
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 33


como una secuencia de dos caracteres? La respuesta depende de si el
asterisco se considera como carcter del alfabeto o como operador (meta
carcter).

Las expresiones regulares empleadas en las especificaciones Lex no tienen
conceptualmente ninguna diferencia con las expresiones regulares (en sentido
estricto) que definen los lenguajes formales regulares; lo nico que aportan son
modificaciones en la notacin empleada en la escritura de las expresiones en
forma de secuencias de caracteres consecutivos susceptibles de grabarse en un
fichero de tipo texto. Esta notacin ampliada alcanza cierta dificultad por las
siguientes causas:

Para facilitar y acortar la escritura de las expresiones se introducen
bastantes meta caracteres que se intercalan con los caracteres,

Es habitual que cualquier carcter del alfabeto ASCII forme parte del
alfabeto sobre el que se definen las expresiones regulares y que, por lo
tanto, pueda aparecer en ellas (incluso el espacio en blanco, el tabulador o
el fin de lnea),

Se precisa la definicin de convenios para distinguir entre los caracteres y
los meta caracteres.

En lo que sigue se emplea la notacin
continuacin de esos smbolos es la descripcin del conjunto de palabras
denotadas por la expresin regular que les precede. Nuevos operadores de las
expresiones regulares Lex

Adems de las operaciones empleadas en las expresiones regulares en sentido
estricto (alternativa, concatenacin y estrella, con la jerarqua entre ellas que antes
se ha citado), en las expresiones regulares Lex se incorporan las operaciones
unarias que se describen a continuacin. Los ejemplos que acompaan a las
descripciones se refieren al alfabeto = {x, y, z}.

Operacin opcionalidad ?

Representa la presencia una nica vez o la ausencia de las palabras denotadas
por la expresin regular afectada; tiene la misma prioridad que la operacin
estrella. En general, si es una expresin regular, se verifica la equivalencia entre
? y |. Por ejemplo,







INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 34




Operacin repeticin una o ms veces +

Representa la presencia una o ms veces consecutivas de las palabras denotadas
por la expresin regular afectada; tiene la misma prioridad que la operacin
estrella. En general, si es una expresin regular, se verifica la equivalencia entre
+ y *. Por ejemplo,





Operacin repeticin limitada { }

Representa la presencia un nmero dado y limitado de veces consecutivas de las
palabras denotadas por la expresin regular afectada; tiene ms prioridad que la
alternativa pero menos que la concatenacin.

La cantidad de presencias se indica mediante los nmeros puestos entre las
llaves; hay tres maneras de hacerlo:

{n} presencia de n veces

m





En general, si es una expresin regular, se verifica la equivalencia (considerada
para el valor particular 4) entre {4} y . Por ejemplo,

xy2}











En la expresin (xy){2,3} los parntesis son superfluos, mejoran la legibilidad de la
expresin; la expresin x{1,} denota el mismo conjunto que la expresin x+; la
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 35


expresin xy{1,} no denota el mismo conjunto que la expresin xy+, sino el
mismo que (xy)+.

Se observa que en los ejemplos anteriores nunca se ha utilizado el espacio en
blanco como separador para una pretendida mejora en el entendimiento de lo
denotado por la expresin regular; con ello se quiere insistir en que las
expresiones regulares Lex estn formadas por una secuencia de caracteres y
meta caracteres colocados consecutivamente (el espacio en blanco no pertenece
al alfabeto de las expresiones de los ejemplos anteriores). Una vez descritos los
nuevos operadores aadidos a las expresiones regulares Lex, se hace ahora una
recapitulacin de los operadores disponibles y de la jerarqua de su aplicacin;
relacionada de mayor a menor, es como sigue:
1 operaciones entre parntesis
2 operadores +, * y ?
3 operaciones de concatenacin (ausencia de operador)
4 operacin de repeticin limitada { }
5 operador |

Los operadores que tienen la misma prioridad se aplican de izquierda a derecha,
segn se encuentran en la expresin regular; los operadores unarios (*, +, ?, {}) se
aplican a la parte de la expresin regular que est situada a su izquierda (para
determinar la parte afectada por el operador unario, se tiene en cuenta la jerarqua
de las operaciones). As pues los meta caractreres hasta ahora considerados son
( ) * + ? { } |

(En las expresiones regulares Lex nunca se pone el punto representativo de la
operacin concatenacin). Los smbolos que aparecen entre las llaves del
operador de repeticin limitada forman parte del propio operador (hacen la funcin
de meta caracteres). Una vez vistos los anteriores ejemplos iniciales de
expresiones regulares sobre el alfabeto = {x, y, z}, los ejemplos que se ponen en
el resto de este captulo son de expresiones regulares sobre el alfabeto formado
por todos los caracteres ASCII que se pueden imprimir. Carcter seleccionado
entre los caracteres de un conjunto Para indicar, dentro de una expresin regular
Lex, la presencia de un carcter del alfabeto elegido entre un conjunto de
caracteres, se introduce una notacin ms cmoda que emplea los corchetes
como meta caracteres; en el sitio de la expresin regular donde deba estar el
carcter se pone entre corchetes el conjunto de los caracteres posibles; todos los
caracteres del conjunto se ponen consecutivos, sin separacin alguna entre ellos.
Por ejemplo, la expresin regular:
x(0|1|2|3|4|5|6|7|8|9)y

Representa las palabras formadas por la letra x, seguida de una cifra decimal,
seguida de la letra y; con la notacin de los corchetes se puede escribir as:
x[0123456789]y

Aunque se ponen todas las cifras decimales en el conjunto, la expresin regular
define la presencia de nicamente una de ellas en cada palabra denotada. La
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 36


descripcin dentro de los corchetes de los caracteres que pertenecen al
conjunto puede hacerse varias maneras; son las siguientes:

a) Descripcin por enumeracin. Dentro de los corchetes se ponen
consecutivamente, sin separacin alguna entre ellos, todos los caracteres del
alfabeto que constituyen el conjunto. Por ejemplo, el siguiente conjunto representa
una de las vocales minsculas:
[aeiou]

b) Descripcin por enumeracin complementaria. Dentro de los corchetes
se ponen consecutivamente, sin separacin alguna entre ellos, todos los
caracteres del alfabeto que no pertenecen al conjunto que se define; para indicar
esa exclusin se coloca el carcter ^ de inmediato a continuacin del corchete de
abrir. Por ejemplo, el siguiente conjunto representa uno cualquiera de los
caracteres del alfabeto sobre el que estn definidas las expresiones regulares,
excepto las vocales maysculas
[^UOIEA]

c) Descripcin por rango. Cuando todos los caracteres que constituyen el
conjunto tienen valores ordinales consecutivos (estn seguidos en la ordenacin
de caracteres del alfabeto ASCII), en el conjunto se puede poner slo el primero y
el ltimo separados por un guion; entre el guion y los dos caracteres extremos no
hay separacin alguna. Por ejemplo, el siguiente conjunto representa una de las
cifras decimales:
[09]

d) Descripcin combinada. Tambin pueden combinarse dentro de un
mismo conjunto las tres maneras precedentes; ha de tenerse en cuenta que el
carcter indicativo de enumeracin complementaria slo puede aparecer una vez
detrs del corchete de abrir. Por ejemplo, [135A-
maysculas o una de las cifras impares [a-zA-
minscula o mayscula [^97531a-
letra minscula o cifra impar En todas las maneras de descripcin es indiferente el
orden de colocacin de los caracteres y tambin puede haber repeticiones (que
resultan intiles). Por ejemplo, el conjunto formado por los signos de puntuacin
coma, punto y coma, punto y dos puntos puede representarse as:
[,;.:] [:;,.] [..,;::.]

Y el conjunto cuyos caracteres son las cifras y las letras (minsculas y
maysculas), as:
[09a-zA-Z] [a-z09A-Z] [0090a-z0A-Z0]





INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 37


UNIDAD 4 ANLISIS SINTCTICO

4.1 Introduccin a las Gramticas libres de contexto y rboles de derivacin


La flexibilidad proporcionada por las gramticas de contexto libre es tal que es la
ms usada para definir la sintaxis de los lenguajes de programacin.

Una definicin formal de una gramtica de contexto sensitivo es la siguiente:

Es un cudruplo G= (V, S , P, S) donde V es un conjunto finito de variables, S es
un conjunto finito de smbolos terminales, P es un conjunto finito de reglas y S es
el smbolo inicial.

Cada produccin tiene la forma uv, donde u es una variable del conjunto V, y v es
un miembro de (V S)*. Esto quiere decir En la parte izquierda dela produccin
viene siempre una variable (smbolo no terminal) y en la parte derecha pueden
venir cualquier nmero de smbolos terminales y no terminales incluyendo la
cadena nula.

Una gramtica de contexto libre produce un lenguaje tambin de contexto libre: G
L (G).


4.2 Diagramas de sintaxis

Un segundo mtodo alternativo para desplegar las producciones de ciertas
gramticas de tipo 2 es el diagrama de sintaxis. sta es una imagen de la
produccin que permite al usuario ver las sustituciones en forma dinmica, es
decir, verlas como un movimiento a travs del diagrama. En la figura 10.5 se
ilustrar los diagramas que resultan de la traduccin de conjuntos de producciones
tpicos, que son, por lo general, todas las producciones que aparecen en el lado
derecho de algn enunciado BNF.

a) <w> ::= <w1> <w2> <w3>

b) w> ::= <w1><w2> | w1a | bc<w2

c) <w> ::= ab<w>.

d) w> ::= ab | ab<w.





INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 38


4.3 PRECEDENCIA DE OPERADORES

a expresin est compuesta por operadores, variables y constantes. Para
simplificar, podemos pensar que la forma en la que C evala esta expresin es
dividiendo el todo en sobrexpresiones. Las reglas que definen que sobrexpresin
evaluar primero, se denominan reglas de precedencia. Aunque siempre podemos
alterar dichas reglas mediante la utilizacin de parntesis. En la siguiente tabla
detallamos la precedencia entre los operadores de C.

Precedencia de operadores Mayor precedencia
( ) [ ] - .

! ++ * & sizeof (operadores unarios)

/ %

+ -

== !=

&

&&

?:

= += -= *= /= %=
Menor precedencia

Precedencia de operadores

La interpretacin de cualquier expresin en C++ est determinada por la
precedencia y asociatividad de los operadores en dicha expresin. Cada operador
tiene una precedencia, y los operadores en una expresin se evalan en orden de
mayor a menor precedencia. La evaluacin de operadores con la misma
precedencia viene determinada por su asociatividad. Y, al igual que en
matemticas, los parntesis anulan las reglas de precedencia.

En la siguiente tabla se listan los operadores en C++, su precedencia y su
asociatividad. Los operadores se listan en orden de prioridad decreciente (los
situados ms arriba tienen mayor prioridad). Los operadores en la misma lnea
horizontal tienen la misma precedencia.

Operador Propsito Asociatividad
Scope (unario) De derecha a izquierda
Scope (binario) De izquierda a derecha
Seleccin de miembros De izquierda a derecha
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 39


[] ndices De izquierda a derecha
() Llamada a funcin De izquierda a derecha
++ Pos incremento De izquierda a derecha
-Pos decremento De izquierda a derecha
sizeof Tamao de un objeto De derecha a izquierda
++ Pre incremento De derecha a izquierda
--Pre decremento De derecha a izquierda
& + - ! ~ Operadores unarios De derecha a izquierda
new Crea un objeto De derecha a izquierda
delete Borra un objeto De derecha a izquierda
() Conversin de tipo (type cast) De derecha a izquierda
.* Puntero a un miembro De izquierda a derecha
/ % Operadores multiplicativos De izquierda a derecha
+ - Operadores aditivos De izquierda a derecha
Operadores bitwise De izquierda a derecha
< > <= >= Operadores de relacin De izquierda a derecha
== != Operadores de igualdad De izquierda a derecha
& Y bitwise De izquierda a derecha
^ bitwise O exclusivo De izquierda a derecha
| bitwise O inclusivo De izquierda a derecha
&& Y lgico De izquierda a derecha
?: Operador condicional De derecha a izquierda
= *= /= += -= >*gt;=
&= ^= |= %= <<= Operadores de asignacin De derecha a izquierda



4.4 ANALIZADOR SINTCTICO

Un analizador sintctico (Parser ) es un programa que reconoce si una o varias
cadenas de caracteres forman parte de un determinado lenguaje. Los lenguajes
habitualmente reconocidos por los analizadores sintcticos son los lenguajes libres
de contexto. Cabe notar que existe una justificacin formal que establece que los
lenguajes libres de contexto son aquellos reconocibles por un autmata de pila, de
modo que todo analizador sintctico que reconozca un lenguaje libre de contexto
es equivalente en capacidad computacional a un autmata de pila. Los
analizadores sintcticos fueron extensivamente estudiados durante los aos 70 del
siglo XX, detectndose numerosos patrones de funcionamiento en ellos, cosa que
permiti la creacin de programas generadores de analizadores sintticos a partir
de una especificacin de la sintaxis del lenguaje, tales y como yacc, GNU bison y
javacc.






INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 40


4.4.1 Analizador descendente (LL)

La siguiente fase en la construccin del analizador es la fase de anlisis sintctico.
Esta toma como entrada el flujo de terminales y construye como salida el rbol de
anlisis sintctico abstracto.

El rbol de anlisis sintctico abstracto es una representacin compactada del
rbol de anlisis sintctico concreto que contiene la misma informacin que ste.

Existen diferentes mtodos de anlisis sintctico. La mayora caen en una de dos
categoras: ascendentes y descendentes. Los ascendentes construyen el rbol
desde las hojas hacia la raz. Los descendentes lo hacen en modo inverso. El que
usaremos aqu es uno de los ms sencillos: se denomina mtodo de anlisis
predictivo descendente recursivo.

4.4.2 Analizador ascendente(LR, LALR)

Intenta construir un rbol de anlisis sintctico, empezando desde la raz y
descendiendo hacia las hojas. Lo que es lo mismo que intentar obtener una
derivacin por la izquierda para una cadena de entrada, comenzando desde la raz
y creando los nodos del rbol en orden previo.

4.5 ADMINISTRACIN DE TABLAS DE SMBOLOS

La tabla de smbolos registra informacin acerca de cada nombre de smbolo en
un programa. Histricamente, los nombres se llamaron smbolos, ms que de una
tabla de nombres. En este captulo, la palabra smbolo significa nombre. La fase
de anlisis semntico crea la tabla de smbolos, puesto que no es sino hasta este
anlisis que se tiene la suficiente informacin sobre un nombre para describirlo. La
generacin de cdigo usa la tabla de smbolos para extraer las directivas del
ensamblador, para el tipo y para el tamao apropiados.

Una tabla de smbolos es una estructura de datos que contiene un registro por
cada identificador. El registro incluye los campos para los atributos del
identificador.

El administrador de la tabla de smbolos se encarga de manejar los accesos a la
tabla de smbolos, en cada una de las etapas de compilacin de un programa.

4.6 MANEJO DE ERRORES SINTCTICOS Y SU RECUPERACIN

Correccin de errores: exige que el programa pueda ejecutarse. Suele utilizarse
en sistemas que generan .EXE directamente, pues ahorra tiempo (permite
encontrar errores de ejecucin a la vez que los de compilacin).

INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 41


Recuperacin de errores: slo trata de evitar que el nmero de mensajes de
error sea demasiado grande y que el compilador/intrprete pueda seguir
ejecutndose correctamente en instrucciones sucesivas.

Correccin ortogrfica

Errores ortogrficos tpicos:

Un carcter por otro.

Un carcter perdido.

Un carcter aadido.

Dos caracteres intercambiados.

Pueden comprobarse slo los errores anteriores, lo que acelera el proceso.

Correcciones posibles:

Anlisis sintctico

Si se espera una palabra reservada y aparece un identificador, buscar la palabra
reservada ms parecida al identificador.

Deshacer errores de concatenacin. Por ejemplo, convertir begina en begin a.

Anlisis semntico

Si un identificador se utiliza en un contexto incompatible con su tipo, tratar de
sustituirlo por otro de nombre parecido y tipo compatible con el contexto.

Si un identificador no ha sido referenciado o asignado, es candidato para
correccin ortogrfica. Slo en compiladores de dos pasos. En la tabla de
smbolos se puede aadir como valor un par de contadores de uso y asignacin.

Todas las correcciones efectuadas deben ser cuidadosamente documentadas,
para evitar que el programador se pierda al probar el programa. Correccin de
errores sintcticos

Si se detecta al analizar la cadena
xUy

donde x,y en A* y U en A es el prximo smbolo a analizar, podemos intentar lo
siguiente:

Borrar U e intentarlo de nuevo.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 42



Insertar una cadena de terminales z entre x, U y empezar a analizar a partir de z.
Insertar una cadena de terminales z entre x, U y empezar a analizar a partir de U,
poniendo z en la pila (si es anlisis bottom-up).

Borrar smbolos del final de x e intentar de nuevo.

No hacer nunca los dos ltimos. Deshace la informacin semntica asociada.

Ejemplo: tenemos

if () { x=0; else

El error se detecta en else. Solucin posible: aadir } delante de else,
analizando

if () { x=0; } else

Recuperacin de errores de compilacin

Conviene tener una sola rutina de recuperacin de errores separada del resto del
compilador.

Evitar que un solo error produzca varios mensajes.

Ejemplo: A[i1,i2,,i3], donde A no es un array. Al abrir el corchete nos dar un
error: A no es un array. Al cerrar el corchete podra dar otro: El nmero de
ndices no coincide con el rango de A. Si se ha dado el primero, el segundo es
innecesario. Una solucin: detectado el primer error, se sustituye la referencia a A
por una referencia a un identificador fantasma. La rutina de recuperacin de
errores podra ignorar los mensajes que se refieren al identificador fantasma.

Evitar que un error idntico repetido produzca varios mensajes. Ejemplo:

{
{ int i;



/* { */
}

for (i=0; i<j; i++) { a=j-i+1; b=2*a+i; }

}

}
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 43



Se nos olvida poner la tercera llave. La llave siguiente cierra el segundo bloque. i
est indefinida en el primer bloque. El bucle for nos dara cinco veces el mensaje
variable i indefinida.

Solucin: crear un identificador llamado i en la tabla de smbolos con los atributos
correctos. Esto elimina los mensajes subsiguientes. Atencin: esto podra hacer
que no se detecte un error real que nos interesara atrapar. Otra alternativa sera
imprimir un solo mensaje diciendo que el identificador i ha sido utilizado sin
declaracin previa en las lneas nmero a,b,c

Recuperacin de errores en un intrprete

Hay que sealar el error y detener la ejecucin, permitiendo al programador

revisar las variables

revisar el cdigo

modificar el cdigo

reanudar la ejecucin

saltarse lneas

abandonar la ejecucin del ltimo programa

abandonar totalmente la ejecucin

y asegurarse de que todo sigue correctamente. En lenguaje simblico se puede
manipular la pila de ejecucin, salir automticamente de rutinas pendientes, sin
continuar la ejecucin, etc

4.7 GENERADORES DE CDIGO PARA ANALIZADORES SINTCTICOS:
YACC, BISON

ABSTRACT

La entrada a programas de computacin generalmente tiene una estructura
determinada; de hecho, cada programa de computacin que recibe una entrada
puede ser visto como definidor de un lenguaje de entrada que acepta. Un
lenguaje de entrada puede ser tan complejo como un lenguaje de programacin, o
tan simple como una secuencia de nmeros. Desafortunadamente, las facilidades
usuales para la entrada son limitadas, difciles de usar y generalmente negligentes
en cuanto al chequeo y validacin de la entrada.


INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 44


YACC provee una herramienta general para describir la entrada de un
programa de computacin. El usuario de YACC especifica las estructuras de su
entrada, junto con el cdigo que ser invocado en la medida en que cada una de
esas estructuras es reconocida. YACC convierte esa especificacin en una
subrutina que maneja el proceso de entrada, frecuentemente es conveniente y
apropiado tener el mayor control en la aplicacin del usuario manejada por esta
subrutina.

La subrutina de entrada producida por YACC llama a la rutina provista por el
usuario para devolver el prximo tem bsico de la entrada. As, el usuario puede
especificar su entrada en trminos de caracteres individuales de entrada, o en
trminos de constructor de mayor nivel, tales como nombres y nmeros. La rutina
provista por el usuario podra tambin manipular rasgos idiomticos tales como
comentarios y convenciones de continuacin, que comnmente desafan las
especificaciones gramaticales sencillas.

GNU Bison es un generador de parser de propsito general que convierte una
descripcin gramatical desde una gramtica libre de contexto LALR en un
programa en C para hacer el parse. Es utilizado para crear parsers para muchos
lenguajes, desde simples calculadoras hasta lenguajes complejos.

GNU Bison tiene compatibilidad con Yacc: todas las gramticas bien escritas para
Yacc, funcionan en Bison sin necesidad de ser modificadas. Cualquier persona
que est familiarizada con Yacc podra utilizar Bison sin problemas. Es necesaria
experiencia con C para utilizar Bison.





















INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 45



UNIDAD 5 Anlisis semntico

5.1 ANALIZADOR SEMNTICO

Se compone de un conjunto de rutinas independientes, llamadas por los
analizadores morfolgico y sintctico.

El anlisis semntico utiliza como entrada el rbol sintctico detectado por el
anlisis sintctico para comprobar restricciones de tipo y otras limitaciones
semnticas y preparar la generacin de cdigo.

En compiladores de un solo paso, las llamadas a las rutinas semnticas se
realizan directamente desde el analizador sintctico y son dichas rutinas las que
llaman al generador de cdigo. El instrumento ms utilizado para conseguirlo es la
gramtica de atributos.

En compiladores de dos o ms pasos, el anlisis semntico se realiza
independientemente de la generacin de cdigo, pasndose informacin a travs
de un archivo intermedio, que normalmente contiene informacin sobre el rbol
sintctico en forma linealizada (para facilitar su manejo y hacer posible su
almacenamiento en memoria auxiliar).

En cualquier caso, las rutinas semnticas suelen hacer uso de una pila (la pila
semntica) que contiene la informacin semntica asociada a los operandos (y a
veces a los operadores) en forma de registros semnticos.

Propagacin de atributos Sea la expresin
int a,b,c;
a/(b+c^2)

El rbol sintctico es:
/
---------
| |
a +
---------
| |
b ^
---------
| |
c 2




INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 46


De la instruccin declarativa, la tabla de smbolos y el analizador morfolgico
obtenemos los atributos de los operandos:
/
---------
| |
a +
int ---------
| |
b ^
int ---------
| |
c 2
int int

Propagando los atributos obtenemos:
/ int
---------
| |
a + int
int ---------
| |
b ^ int
int ---------
| |
c 2
int int

Si la expresin hubiera sido
a/(b+c^2)

El rbol sintctico sera el mismo, sustituyendo 2 por 2. Sin embargo, la
propagacin de atributos sera diferente:
/ real
---------
| |
a + real
int ---------
| |
b ^ real
int ---------
| |
c 2
int int



INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 47


En algn caso podra llegar a producirse error (p.e. si / representara slo la
divisin entera).

Si la expresin hubiera sido
int a,b,c,d;
a/(b+c^d)

El rbol sintctico sera el mismo, sustituyendo 2 por d. Sin embargo, la
propagacin de atributos sera incompleta:
/ {int,real}
---------
| |
a + {int,real}
int ---------
| |
b ^ {int,real}
int ---------
| |
c d
int int

El analizador semntico podra reducir los tipos inseguros al tipo mximo (real) o
utilizar un tipo interno nuevo (ej. arit={int,real}, una unin).

Lo anterior es un ejemplo de propagacin bottom-up. La propagacin top-down
tambin es posible: lo que se transmite son las restricciones y los tipos de las
hojas sirven de comprobacin. Por ejemplo, si la divisin slo puede ser entera,
transmitimos hacia abajo la restriccin de que sus operandos slo pueden ser
enteros. Al llegar a d, esa restriccin se convierte en que d debe ser positiva. Si no
lo es, error.

La implantacin de todos los casos posibles de operacin con tipos mixtos podra
ser excesivamente cara. En su lugar, se parte de operaciones relativamente
simples (ej. int+int, real+real) y no se implementan las restantes (ej. int+real,
real+int), aadiendo en su lugar operaciones mondicas de cambio de tipo (ej.
intreal).

Esta decisin puede introducir ambigedades. Por ejemplo, sea el programa
real a;
int b,c;
a:=b+c






INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 48


El rbol sintctico es:
:=
---------
| |
a +
real ---------
| |
b c
int int

Existen dos conversiones posibles:
:= real := real
--------- ---------
| | | |
a + real a + int
real --------- real ---------
| | | |
b c b c
int int int int

El problema es que no tenemos garanta de que los dos procedimientos sean
equivalentes. El segundo puede dar overflow, el primero prdida de precisin. La
definicin del lenguaje debe especificar estos casos.

Las transformaciones posibles se pueden representar mediante un grafo cuyos
nodos son los tipos de datos y cada arco indica una transformacin. Dado un
operando de tipo A que se desea convertir al tipo B, se trata de encontrar una
cadena de arcos que pase de A a B en el grafo anterior. Podra haber varios
grafos, cada uno de los cuales se aplicar en diferentes condiciones, por ejemplo,
uno para las asignaciones, otro para las expresiones, etc.

5.2 VERIFICACIN DE TIPOS EN EXPRESIONES
Sistema de Tipos
Reglas de un lenguaje que permiten asignar tipos a las distintas partes de un
programa y verificar su correccin.
Formado por las definiciones y reglas que permiten comprobar el
dominio de un identificador, y en qu contextos puede ser usado.
Cada lenguaje tiene un sistema de tipos propio, aunque puede variar de
una a otra implementacin.
La comprobacin de tipos es parte del anlisis semntico.


INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 49


Funciones Principales:
Reglas de un lenguaje que permiten asignar tipos a las distintas partes
de un programa y verificar su correccin.
Inferencia de tipos: calcular y mantener la informacin sobre los tipos de
datos.
Verificacin de tipo: asegurar que las partes de un programa tienen
sentido segn las reglas de tipo del lenguaje.
La informacin de tipos puede ser esttica o dinmica:
LISP, CAML o Smalltalk utilizan informacin de tipos dinmica.
En ADA, Pascal o C la informacin de tipos es esttica.
Tambin puede ser una combinacin de ambas formas.
Cuantas ms comprobaciones puedan realizarse en la fase de compilacin,
menos tendrn que realizarse durante la ejecucin.
Mayor eficiencia del programa objeto.
Es parte de la comprobacin de tipos:
Conversin de tipos explcita: transformacin del tipo de una expresin
con un propsito determinado.
Coercin: conversin de tipos que realiza de forma implcita el
compilador.
Conversin de tipos explcita: el programador indica el tipo destino:
Funciona como una llamada a funcin: recibe un tipo y devuelve otro.
Conversin de tipos implcita: el compilador convierte automticamente elementos
de un tipo en elementos de otro:
La conversin se lleva a cabo en la accin semntica de la regla donde
se realiza.
Comprobador de tipos seguro: Durante la compilacin (comprobacin esttica)
detecta todos los posibles errores de tipo.
Lenguaje fuertemente tipado: Si un fragmento de cdigo compila es que
no se van a producir errores de tipo.
En la prctica, ningn lenguaje es tan fuertemente tipado que permita una
completa comprobacin esttica.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 50


Informacin de tipos dinmica: El compilador debe generar cdigo que realice
la inferencia y verificacin de tipos durante la ejecucin del programa que se est
compilando.

Informacin de tipos esttica:
Se utiliza para verificar la exactitud del programa antes de la ejecucin.
Permite determinar la asignacin de memoria necesaria para cada variable.
Tipo de datos = conjunto de valores + operaciones aplicables
En el mbito de los compiladores, un tipo se define mediante una expresin de
tipo (informacin de tipos explcita):
Nombre de tipo: float.
Expresin estructurada explcita: set of integer.
Estas expresiones se utilizan en la construccin de otros tipos o para
declarar variables.
La informacin de tipos, implcita o explcita, se mantiene en la tabla de smbolos:
Esta informacin se recupera de la tabla de smbolos mediante el
verificador de tipo cuando se hace referencia al nombre asociado.
Un lenguaje de programacin contiene un conjunto de tipos predefinido
denominados tipos simples:
Algunos lenguajes permiten definir nuevos tipos simples: enumerado,
subrango.
Todos los lenguajes permiten crear nuevos tipos complejos a partir de otros ms
simples mediante constructores de tipos:
Matrices, productos, registros, punteros, funciones,
En Pascal: array, set, record...
En C++: struct, class, union ...
Para analizar los diferentes tipos que intervienen dentro de un programa, el
compilador debe contar con una estructura interna que le permita manejar
cmodamente las expresiones de tipos.

INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 51


Esta estructura interna:
Debe ser fcilmente manipulable, pues su creacin se realizar conforme
se hace la lectura del programa fuente.
Debe permitir comparar fcilmente las expresiones asignadas a distintos
trozos de cdigo, especialmente a los identificadores de variables...
La forma ms habitual de representacin son los grafos a cclicos dirigidos
(GADs).
La ventaja de estas representaciones es que ocupan poca memoria y por
tanto la comprobacin de equivalencia se efecta con rapidez.
5.3 CONVERSIN DE TIPOS

Java si el compilador reconoce que la variable destino tiene la suficiente precisin
para contener el valor origen, como almacenar un valor byte en una variable int. A
esto se le llama ensanchamiento o promocin, dado que el tipo ms pequeo se
ensancha o promociona al tipo compatible ms grande. Si por el contrario, se
desea asignar un valor de variable int a una variable byte se necesita realizar una
conversin de tipos explcita. A esto se le llama estrechamiento, dado que se
estrecha explcitamente el valor para que quepa en el destino. La conversin de
un tipo se realiza poniendo delante un nombre de tipo entre parntesis, por
ejemplo, (tipo) valor. El cdigo siguiente demuestra la conversin de tipos de int a
byte. Si el valor del entero fuese mayor que el rango de un byte, se reducira al
mdulo (resto de la divisin) del rango de byte.

int a = 100;

byte b = (byte) a;

5.4 ACCIONES AGREGADAS EN UN ANALIZADOR SINTCTICO
DESCENDENTE (TOP-DOWN)

Muchas de las actividades que realiza un analizador semntico no son estndares,
dependern del objetivo del lenguaje de programacin; por ejemplo, en algunas
aplicaciones es interesante conocer que los datos estn en algn rango vlido o
que ciertos valores se utilicen para uso reservado

Acciones agregadas a un analizador semntico

En algunas ocasiones nos interesa conocer el significado de las palabras de algn
lenguaje dependiendo del contexto (gramticas de tipo 1) para diferenciar palabras
poli semnticas.


INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 52


5.5 PILA SEMNTICA EN UN ANALIZADOR SINTCTICO ASCENDENTE
(BOTTOM-UP)

El diseo ascendente se refiere a la identificacin de aquellos procesos que
necesitan computarizarse con forme vayan apareciendo, su anlisis como sistema
y su codificacin, o bien, la adquisicin de paquetes de software para satisfacer el
problema inmediato.

Pila semntica

Los problemas de integracin entre los subsistemas son sumamente costosos y
muchos de ellos no se solucionan hasta que la programacin alcanza la fecha
limite para la integracin total del sistema.

Se necesita una memoria auxiliar que nos permita guardar los datos intermedios
para poder hacer la comparacin.

5.6 ADMINISTRACIN DE LA TABLA DE SMBOLOS

La tabla de smbolos registra informacin acerca de cada nombre de smbolo en
un programa. Histricamente, los nombres se llamaron smbolos, ms que de una
tabla de nombres. En este captulo, la palabra smbolo significa nombre. La fase
de anlisis semntico crea la tabla de smbolos, puesto que no es sino hasta este
anlisis que se tiene la suficiente informacin sobre un nombre para describirlo. La
generacin de cdigo usa la tabla de smbolos para extraer las directivas del
ensamblador, para el tipo y para el tamao apropiados.

Una tabla de smbolos es una estructura de datos que contiene un registro por
cada identificador. El registro incluye los campos para los atributos del
identificador.

El administrador de la tabla de smbolos se encarga de manejar los accesos a la
tabla de smbolos, en cada una de las etapas de compilacin de un programa.

5.7 Manejo de errores semnticos

Si la validacin del rbol sintctico descrita en el prrafo anterior no fuese
satisfactoria, es decir, existiese un error semntico, la fase de anlisis semntico
debera notificar dicho error al manejador de errores para que ste se encargase
de su gestin. El proceso de anlisis podra seguir ejecutndose o no, en funcin
de si el procesador de lenguaje implementa algn mecanismo de recuperacin de
errores.


INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 53


UNIDAD 6 GENERACIN DE CDIGO INTERMEDIO

6.1 LENGUAJES INTERMEDIOS
Una estructura de datos que representa el programa fuente durante la traduccin
se denomina REPRESENTACION INTERMEDIA o IR.
Aunque un rbol sintctico abstracto es una representacin adecuada del cdigo
del cdigo fuente, incluso para la generacin de cdigo, no se parece ni
remotamente al cdigo objeto. Una representacin intermedia de esta naturaleza
que se parece al cdigo objeto se denomina CODIGO INTERMEDIO.
El cdigo intermedio puede tomar muchas formas: existen casi tantos estilos de
cdigo intermedio como compiladores. Sin embargo, todos representa alguna
forma de LINEALIZACION del rbol sintctico, es decir, una representacin del
rbol sintctico en forma secuencial. El cdigo intermedio puede ser de muy alto
nivel, representar todas las operaciones de manera casi tan abstracta como un
rbol sintctico, o parecerse mucho al cdigo objeto.
El cdigo intermedio es particularmente til cuando el objetivo del compilador es
producir cdigo muy eficiente, ya que para hacerlo as se requiere una cantidad
importante del anlisis de las propiedades del cdigo objeto, y esto e facilita
mediante le uso del cdigo intermedio El cdigo intermedio tambin puede ser til
al hacer que un compilador sea mas fcilmente redirigidle: si el cdigo intermedio
es hasta cierto punto independiente de la maquina objeto, entonces generar
cdigo para una maquina objetivo diferente solo requiere volver a escribir el
traductor de cdigo intermedio a cdigo objeto y por lo regular esto es mas fcil
que volver a escribir todo un generador de cdigo.
6.2 NOTACIONES
Las notaciones son una forma especial en la que se pueden expresar una
expresin matemtica y puedan ser de 3 formas: infija, prefija y postfija. Los
prefijos, Pre - Pos - In se refieren a la posicin relativa del operador con respecto a
los dos operandos.
Existen varias notaciones para representar expresiones matemticas, que se
diferencian en el orden en que se escriben los argumentos (operandos) de los
operadores. Las ms relevantes son:
Notacin infija : La notacin habitual. El orden es primer operando,
operador, segundo operando.
Notacin prefija : El orden es operador, primer operando, segundo
operando.
Notacin postfija : El orden es primer operando, segundo operando,
operador.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 54



6.2.1 Infija
Es la que se utiliza en la mayora de los casos.
Ejemplo:
Ir con la mas familiar de todas las notaciones, la infija si yo deseo sumar 5 mas 4;
en notacin infija quedara:
5+4
En notacin prefija quedara:
+ 5 4
En notacin postfija:
5 4 +
Pero ahora veamos una expresin infija mas complicada como la siguiente:
5+2*(7+8)-(15-2/(20+(5/8)))
Ahora escribamos esto en forma prefija:
(+ 5 (- (* 2(+ 7 8)) (- 15 (/ 2 (+ 20 (/ 5 8))))))
La formula se ve complicada y surge la natural pregunta: Qu ventaja tiene esto?
La principal ventaja es que podemos no hacer uso de las reglas de precedencia.

6.2.2 Postfija
La notacin postfija es una notacin muy simple en la cual se coloca un operador
en el extremo derecho de una expresin, es decir, despus de los operadores, en
vez de estar entre ellos. Por ejemplo:
x + y x* y
en notacin postfija es
x y + x y* -
ya que x y + representa la expresin infija x + y y xy* representa x * y, etc.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 55


Por lo regular, la notacin postfija se emplea en maquinas de pilas, ya que
puede manejarse con gran facilidad usando una pila. Al analizar una notacin
postfija de izq., a der., cada vez que se detecta un operador se mete en la pila. La
ocurrencia de un operador con n operadores significa que el n esimo operando
estar en la cima de la pila. Despus se sacan los operandos de la pila y se mete
el resultado de la operacin.
6.2.3 Prefija
En este tipo de notacin el operador binario aparece justo antes de sus dos
operandos: +AB
Una gramtica que define una notacin prefija puede ser:
<expr_pref> := <letra> |
<operador><expr_pref><expr_pref>
<letra> := A | B | C | ... | Z
<operador> := + | - | * | /
Ejemplos en infija y su correspondiente prefija:
A+(B*C) +A*BC
(A+B)*C *+ABC
6.3 REPRESENTACIN DE CDIGO INTERMEDIO

Existen maneras formales para representar Cdigo intermedio.

Estas notaciones simplifican la traduccin de nuestro cdigo fuente a
nuestro cdigo objeto ya que ahorran y acotan smbolos de la tabla de
smbolos

6.3.1 Notacin Polaca

La notacin polaca es la originada por un Autmata con pila, en la que los
operadores siempre preceden a los operandos sobre los que actan, y que tiene la
ventaja de no necesitar parntesis:

Estndar
Ejemplo 1: 2 * ( 3 + 5 )
Ejemplo 2: 2 * 3 + 5

Polaca
Ejemplo 1: * 2 + 3 5
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 56


Ejemplo 2: + * 2 3 5


6.3.2 Cdigo P

Prolog, proveniente del francs Programation et Logique, es un lenguaje de
programacin lgico e interpretado, bastante popular en el medio de investigacin
en Inteligencia Artificial.

Se trata de un lenguaje de programacin ideado a principios de los aos 70 en la
universidad de Aix-Marseille por los profesores Alain Colmerauer y Phillipe
Roussel. Inicialmente se trataba de un lenguaje totalmente interpretado hasta que,
a mediados de los 70, David H.D. Warren desarroll un compilador capaz de
traducir Prolog en un conjunto de instrucciones de una mquina abstracta
denominada Warren Abstract Machine, o abreviadamente, WAM. Desde entonces
Prolog es un lenguaje semi-interpretado.

Prolog se enmarca en el paradigma de los lenguajes lgicos, lo que lo diferencia
enormemente de otros lenguajes ms populares tales como Fortran, Pascal, C,
etc.

En todos los mencionados, las instrucciones se ejecutan normalmente en orden
secuencial, es decir, una a continuacin de otra, en el mismo orden en que estn
escritas, que slo vara cuando se alcanza una instruccin de control (un bucle,
una instruccin condicional o una transferencia).

Los programas en Prolog se componen de clusulas de Horn que constituyen
reglas del tipo modus ponendo ponens, es decir, Si es verdad el antecendente,
entonces es verdad el consecuente. No obstante, la forma de escribir las
clusulas de Horn es al contrario de lo habitual. Primero se escribe el consecuente
y luego el antecedente. El antecedente puede ser una conjuncin de condiciones
que se denomina secuencia de objetivos. Cada objetivo se separa con una coma y
puede considerarse similar a una instruccin o llamada a procedimiento de los
lenguajes imperativos. En Prolog no existen instrucciones de control. Su ejecucin
se basa en dos conceptos: la unificacin y el backtracking. Gracias a la
unificacin, cada objetivo determina un subconjunto de clusulas susceptibles de
ser ejecutadas. Cada una de ellas se denomina punto de eleccin. Prolog
selecciona el primer punto de eleccin y sigue ejecutando el programa hasta
determinar si el objetivo es verdadero o falso. En caso de ser falso entra en juego
el backtracking, que consiste en deshacer todo lo ejecutado situando el programa
en el mismo estado en el que estaba justo antes de llegar al punto de eleccin.
Entonces se toma el siguiente punto de eleccin que estaba pendiente y se repite
de nuevo el proceso. Todos los objetivos terminan su ejecucin bien en
verdadero, bien en falso.

Las listas son colecciones de elementos en Prolog. Una lista se divide en dos
partes: Cabeza. Es el primer elemento de la lista. Cola. Es una lista con el resto de
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 57


los elementos de la lista. La cabeza y la cola de una lista se separan con el
smbolo |.


Ejemplo de Cdigo Prolog


declaraciones
padrede(juan, maria). % juan es padre de maria
padrede(pablo, juan). % pablo es padre de juan
padrede(pablo, marcela).
padrede(carlos, debora).
% A es hijo de B si B es padre de A
hijode(A,B) :- padrede(B,A).
% A es abuelo de B si A es padre de C y C es padre B
abuelode(A,B) :-
padrede(A,C),
padrede(C,B).

% A y B son hermanos si el padre de A es tambin el padre de B y si A y B no son
lo mismo

hermanode(A,B) :-
padrede(C,A) ,
padrede(C,B),
A \== B.

% A y B son familiares si A es padre de B o A es hijo de B o A es hermano de B

familiarde(A,B) :-
padrede(A,B).
familiarde(A,B) :-
hijode(A,B).
familiarde(A,B) :-
hermanode(A,B).

consultas


% juan es hermano de marcela?
?- hermanode(juan, marcela).
yes
% carlos es hermano de juan?
?- hermanode(carlos, juan).
no
% pablo es abuelo de maria?
?- abuelode(pablo, maria).
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 58


yes
% maria es abuelo de pablo?

?- abuelode(maria, pablo).
no
Ejemplo sobre Listas Prolog
% Si queremos hallar la longitud de una lista.
% La longitud de una lista vacia es 0.
% La longitud de cualquier lista es la longitud de la cola + 1.
longitud([],0).
longitud([H|T],N):-longitud(T,N0), N is N0 + 1.
?- longitud([a,b,c],L).
3
?- longitud([a,b,c],4).
No
% Si queremos determinar si un elemento es pertenece a una lista.
% El elemento pertenece a la lista si coincide con la cabeza de la lista.
% El elemento pertenece a la lista si es se encuentra en la cola de la lista.
pertenece(X,[X|_]).
pertenece(X,[_|R]):- pertenece(X,R).
?- pertenece(b,[a,b,c]).
Yes
?- pertenece(b,[a,[b,c]]).
No
?- pertenece([b,c],[a,[b,c]]).
Yes
% Si queremos eliminar un elemento de la lista.
% Si X es la cabeza de la lista, la cola T es la lista sin X
% Si X no es la cabeza de la lista, conservamos la cabeza de la lista
% como parte de la respuesta y continuamos eliminando X de la cola T.
elimina (X,[X|T],T).
elimina (X,[H|T],[H|T1]):- elimina (X,T,T1).
?- elimina(1,[1,2,3,4],R).
R = [2,3,4]
?- elimina(1,R,[2,3]).
R = [1, 2, 3]
R = [2, 1, 3]
R = [2, 3, 1]
% Si queremos calcular la inversa de una lista.
% La inversa de una lista vacia es una lista vacia.
% La inversa de H|T es la inversa de T concatenada con H.
inversa([],[]).
inversa([H|T],L):- inversa(T,R), concatenar(R,[H],L).
?- inversa([a,b,c,d],[d,c,b,a]).
Yes


INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 59


6.3.3 Triplos
La instruccin bsica del cdigo de tres direcciones esta diseada para
representar la evaluacin de expresiones aritmticas y tiene la siguiente forma
general:
X = Y op Z
Esta instruccin expresa la aplicacin del operador op a los valores de Y y Z , y la
asignacin de esta valor para que sea el nuevo valor X. aqu op puede ser un
operador aritmtico como + o o algn otro operador que pueda actuar sobre los
valores de X y Y.
El nombre cdigo en tres direcciones viene de esta forma de instruccin, ya que
por lo general cada uno de los nombres X, Y y Z representan una direccin de
memoria. Sin embargo, observen que el uso de la direccin de X difiere del uso de
las direcciones de Y y Z, y que por tanto Y como Z pueden representar constante
o valores de literales sin direccin de ejecucin. Para ver como las secuencias de
cdigo de tres direcciones de esta forma pueden representar el calculo de una
expresin, considere la expresin aritmtica. 2*a+(b-3).
Con rbol sintctico:


Sin embargo, la forma del cdigo de tres direcciones no basta para representar
todas las caractersticas. Por ejemplo, los operadores unitarios, como la negacin
requieren de una variacin del cdigo de tres direcciones que contenga solo dos
direcciones, tal como:
t2 = - t1
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 60


Si se desea tener capacidad para todas las construcciones de un lenguaje de
programacin estndar, ser necesario variar la forma del cdigo de tres
direcciones en cada construccin. Si un lenguaje contiene caractersticas poco
habituales, puede ser necesario incluso inventar nuevas formas del cdigo de tres
direcciones para expresarlas. Estas son unas de las razones por las que no existe
una forma estndar para el cdigo de tres direcciones.
6.3.4 Cudruplos

Un cudruplo es una estructura tipo registro con cuatro campos. Por ejemplo

Por ejemplo la expresin a*b+c*d, para transformarlas a su equivalente en
cudruplos, podemos separar en unidades ms pequeas a la expresin. Primero:
a*b Segundo: c*d Tercero: Hacer la suma de ambas Ahora pasemos a hacer los
cudruplos correspondientes:

Como podemos darnos cuenta, a diferencia de los tripletes, los cudruplos hacen
uso de una variable temporal para realizar las expresiones. Los tripletes tienen la
ventaja obvia de ser ms consistente, pero ellos dependen de su posicin y hace
que la optimizacin presente cambios o eliminacin de cdigo mucho ms
complejo.

INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 61


6.4 ESQUEMAS DE GENERACIN
Cuando una empresa desarrolla un compilador para un lenguaje fuente y un
lenguaje objeto determinados, normalmente no es el nico compilador que la
empresa piensa desarrollar; es ms muchos fabricantes de microprocesadores
tienen una divisin de dedicada a desarrollar compiladores para los nuevos chips
que construya.
Cuando el nmero de lenguaje fuente crece hasta un nmero grande M, y/o
cuando el nmero de lenguajes objeto tambin crece hasta un nmero grande N,
es necesario encontrar una tcnica para evitar tener que disear M x N
compiladores. La solucin consiste en utilizar un lenguaje intermedio o una
representacin intermedia; de esta forma slo hay que construir M programas que
traduzcan de cada lenguaje fuente al lenguaje intermedio (los front ende), y N
programas que traduzcan del lenguaje intermedio a cada lenguaje objeto (los back
end).
La matemtica (del lat. mathematca, y este del gr. , derivado de
, conocimiento) es una ciencia formal que estudia las propiedades y las
relaciones que se pueden establecer entre los entes abstractos, como los
smbolos, los nmeros y las figuras geomtricas. [1]
Aunque la matemtica sea la supuesta Reina de las Ciencias, algunos
matemticos no la consideran una ciencia natural. Principalmente, los
matemticos definen e investigan estructuras y conceptos abstractos por razones
puramente internas a la matemtica, debido a que tales estructuras pueden
proveer, por ejemplo, una generalizacin elegante, o una herramienta til para
clculos frecuentes. Adems, muchos matemticos consideran la matemtica
como una forma de arte en vez de una ciencia prctica o aplicada. Sin embargo,
las estructuras que los matemticos investigan frecuentemente s tienen su origen
en las ciencias naturales, y muchas veces encuentran sus aplicaciones en ellas,
particularmente en la fsica.
No existe un nico lenguaje intermedio en todos los compiladores, sino que cada
empresa que disea compiladores suele tener su propio lenguaje intermedio. La
utilizacin de un lenguaje intermedio permite construir en, mucho menos tiempo un
compilador para otra mquina y tambin permite construir compiladores para otros
lenguajes fuente generando cdigos para la misma mquina. La matemtica es un
arte, pero tambin una ciencia de estudio. Informalmente, se puede decir que es el
estudio de los nmeros y smbolos. Es decir, es la investigacin de estructuras
abstractas definidas a partir de axiomas, utilizando la lgica y la notacin
matemtica. Es tambin la ciencia de las relaciones espaciales y cuantitativas. Se
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 62


trata de relaciones exactas que existen entre cantidades y magnitudes, y de
los mtodos por los cuales, de acuerdo con estas relaciones, las cantidades
buscadas son deducibles a partir de otras cantidades conocidas o presupuestas.
Vase tambin: Filosofa de la matemtica No es infrecuente encontrar a quien
describe la matemtica como una simple extensin de los lenguajes naturales
humanos, que utiliza una gramtica y un vocabulario definidos con extrema
precisin, cuyo propsito es la descripcin y exploracin de relaciones
conceptuales y fsicas. Recientemente, sin embargo, los avances en el estudio del
lenguaje humano apuntan en una direccin diferente: los lenguajes naturales
(como el espaol y el francs) y los lenguajes formales (como la matemtica y los
lenguajes de programacin) son estructuras de naturaleza bsicamente diferente.
Por ejemplo, el compilador de C de GNU que se distribuye con Linux es una
versin de una familia de compiladores de C para diferentes mquinas o sistemas
operativos: Alpha, AIX, Sun, HP, MS-DOS, etc.. Adems, GNU ha desarrollado un
compilador de FORTRAN y otro de Pascal que, al utilizar el mismo lenguaje
intermedio, pueden ser portados a todos los sistemas y mquinas en las que y a
existe un compilador de C de GNU con relativamente poco esfuerzo.
La generacin de cdigo intermedio transforma un rbol de anlisis sintctico
(semntico) en una representacin en un lenguaje intermedio, que suele ser
cdigo suficientemente sencillo para poder luego generar cdigo mquina.
Una forma de hacer esto es mediante el llamado cdigo de tres direcciones. Una
sentencia en cdigo de tres direcciones es: A := B op C, donde A, B y C son
operandos y op es un operador binario. Tambin permite condiciones simples y
saltos. Por ejemplo, para la siguiente sentencia:
WHILE (A > B) AND (A < = 2 * B 5) DO A : = A + B
el cdigo intermedio generado ( cdigo en tres direcciones) ser:
L1 : IF A > B GOTO L2
GOTO L3
L2 : T1 : = 2 * B (*nivel ms alto que ensamblador*)
T2 : = T1 5 (*pero ms sencillo que Pascal*)
IF A < T2 GOTO L4
GOTO L3
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 63


L4 : A : = A + B
GOTO L1
L3 : . . . . . . .
6.4.1 Expresiones
Toda expresin es una sentencia.
El operador de asignacin forma parte de una expresin. Deber
comprobarse la validez semntica de la parte izquierda de una asignacin.
Asignaciones de expresiones con tipos construidos por el usuario (registros
y arrays).
Conversiones de Expresiones.
Se realizarn implcitamente las conversiones de char a entero y real y
las de entero a real.
S Conversiones explcitas entre tipos simples, realizadas por el
programador mediante un ahormado (cast).
Conversiones explcitas de expresiones a tipos definidos por el usuario
typedef).
Operadores Mnimos
Los operadores obligatorios que deber incluir el lenguaje son:
Aritmticos: +, -, *, /, resto y menos unario.
Comparacin: mayor, mayor o igual, menor, menor o igual, igual y
distinto.
Lgicos: And, Or y Not.
Sentencias de control de flujo.
Sentencia condicional IF ELSE.
Sentencias iterativas WHILE
Sentencia iterativa FOR
Sentencias condicional mltiple CASE.
Entrada y Salida.
Sentencias de lectura y escritura mltiple por la entrada y salida
estndar para todos los tipos primitivos con las instrucciones read y
write. Debern permitirse la entrada y salida de mltiples valores
(separndolos mediante comas).
Escritura de cadenas de caracteres para no tener que estar escribiendo
carcter a carcter. Ejemplo: write Escriba un nmero;
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 64


Tratamiento de archivos binarios que permita:
Abrir un archivo para lectura y para escritura.
Leer bytes de un archivo.
Escribir bytes en un archivo.
Cerrar el archivo.
Su tratamiento binario implica que la lectura y escritura de valores se
realizar a travs de direcciones de memoria (punteros o arrays),
indicando en nmero de bytes a leer o escribir (ver las funciones read
y write del C)

6.4.2 Declaracin de variables, constantes
Las constantes de tipos:
Constantes de tipo entero.
Constantes de tipo carcter.
Constantes de tipo real.
Constantes de tipo cadena de caracteres.
Declaracin de variables.:
Declaracin mltiple de variables, separadas por comas.
Declaracin de variables globales simples (carcter, entero y real) y
construidas por el usuario (arrays y registros).
Declaracin de variables locales simples y construidas por el usuario.
Declaracin de variables locales en cualquier parte del cuerpo de la funcin
(no necesariamente al principio de ste).
Definicin de tipos construidos por el usuario (type o typedef). La definicin
de estos tipos se realizar siempre con mbito global. Su uso (declaracin
de variables) permitir declarar tanto variables locales como globales, de
los tipos definidos.
F Bloques y declaracin de variables locales a bloques.
Ejemplos:
...
int i;
i=3;
{
int i; // OK
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 65


i=4;
...
}
// i==3
Inicializacin de variables en su definicin.
int i=3;
float r=12E-3;
Declaracin de variables locales a sentencias de control.

6.4.3 Estatuto de asignacin

Las expresiones booleanas se utilizan principalmente como parte de las
proposiciones condicionales que alteran el flujo de control del programa, if-then, if-
then-else, while-do. Las expresiones booleanas se componen de los operadores
booleanos and, or, not aplicados a variables booleanas o expresiones
relacionales.
A su vez, las expresiones relacionales son de la forma E 1 oprel E 2 , donde E 1 y
E 2 son expresiones aritmticas y oprel es cualquier operador relacional <, >, <=,
>=,....
Uno de los mtodos para traducir expresiones booleanas a cdigo de 3-
direcciones consiste en codificar numricamente los valores true y false y evaluar
una expresin booleana como una expresin aritmtica, siguiendo unas
prioridades. A menudo se utiliza 1 para indicar true y 0 para indicar false.
Las expresiones booleanas se evalan de manera similar a una expresin
aritmtica de izquierda a derecha. Supongamos el ejemplo: a or b and not c. La
secuencia de cdigo de 3-direcciones correspondiente es:
t 1 = a or b
t 2 = not c
t 3 = t 1 and t 2

INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 66


6.4.4 Estatuto condicional
Proposicin if-then
Supongamos una sentencia if-then de la forma S ? if E then S 1 _ , ver
diagrama de flujo de la figura de abajo. Para generar el cdigo correspondiente
a esta proposicin habra que aadir a la funcin genera cdigo () un nuevo
caso para la sentencia switch que contemple este tipo de nodo en el rbol
sintctico, nodo n_if-then.
TAC datos;
TAC aux1, aux2;
lista_codigo *cod;
datos.cod=NULL;
direcciones dir; // usamos direccin al salto, en vez de etiquetas
case n_if-then: // childs [0]=E, childs[1]=S 1
aux1=genera_codigo (childs [0]);
cod=gen cuad(if_false,--, aux1.lugar, dir?);
// an no se sabe la direc. de salto
aux2=genera_codigo (childs[1]);
dir=sgtedirlibre (); // relleno de retroceso
rellena (cod,arg3,dir)
datos.cod=concatena_codigo(aux1.cod,cod,aux2.cod);
break ;
Supondremos que tenemos una funcin, sigtedirlibre (), que guarda el ndice
de la siguiente instruccin libre (la funcin gen cuad() incrementa ese
contador). En la implantacin se ha optado por utilizar direcciones directamente
a las instrucciones en vez de usar etiquetas.


INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 67


Proposicin if-then-else
Supongamos una sentencia if-then-else de la forma S ? if E then S1 else S2,
cuyo diagrama de flujo tiene la forma representada en la figura de abajo. Para
generar el cdigo correspondiente a esta proposicin habra que aadir a la
funcin genera_cdigo () un nuevo caso para la sentencia switch que
contemple este tipo de nodo en el rbol sintctico, nodo n_ifthenelse. Este
fragmento de cdigo se podra implantar de forma similar a como hemos hecho
en la seccin anterior.
6.4.5 Estatuto de ciclos
Ciclo For
Qu decir del for. Es la sentencia ms complicada puesto que hay que ejecutar
cada cosa en su debido tiempo y las acciones de la gramtica no se disparan
en el orden que nos gustara. Hemos usado una vez ms la pila y cinco
etiquetas diferentes a las que vamos saltando y colando tercetos
oportunamente.
Primeramente hay que ejecutar la inicializacin, generar apilar y emitir una
etiqueta que ser a la que se salte en la parte de abajo del for una vez se haya
terminado de ejecutar el bloque. Tambin hay que destacar que la
actualizacin del for se tiene que producir despus de ejecutar el cuerpo
puesto que en l se puede alterar el valor de las variables de control.
Como funcionalidad extra, mencionar que permitimos tener mltiples
inicializaciones y mltiples actualizaciones al estilo de lo que se puede hacer
en C: for(a=0, b=0 ;a<5, b<3; a++, b+=1){}
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 68



Este Cdigo:
for(x=1;true;x++)
{
x=1;
break;
}
[...]
generar:
0000.- 0000.- * <ASIGN , entero: 1 -> simbolo: x> /* inicializacion */
0001.- 0001.- <ETIQUETA, e_0000>
0002.- 0002.- <BRANCH , entero: 1 -> e_0001> /* condicion */
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 69


0003.- 0004.- <GOTO , e_0003> /* salto al cuerpo */
0004.- 0003.- <ETIQUETA, e_0002>
0005.- 0022.- <PUSHN , 2> /* actualizacion */
0006.- 0007.- <OP , SUM , simbolo: x, entero: 1 -> temporal: 0>
0007.- 0008.- <ASIGN , temporal: 0 -> simbolo: x>
0008.- 0023.- <POPN , 2>
0009.- 0012.- * <GOTO , e_0000> /* salto a condicion */
0010.- 0011.- <ETIQUETA, e_0003>
0011.- 0013.- <ETIQUETA, e_0006>
0012.- 0000.- * <ASIGN , entero: 1 -> simbolo: x> /* cuerpo del for */
0013.- 0015.- <GOTO , e_0004> /* break */
0014.- 0016.- <ETIQUETA, e_0005>
0015.- 0019.- <GOTO , e_0002> /* salto a actualizacion */
0016.- 0012.- * <GOTO , e_0000>
0017.- 0017.- <ETIQUETA, e_0007>
0018.- 0018.- <ETIQUETA, e_0004>
0019.- 0020.- <ETIQUETA, e_0001>











INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 70


6.4.6 Arreglos
En computacin, un lenguaje intermedio es el lenguaje de una mquina abstracta
diseada para ayudar en el anlisis de los programas de computadora. El trmino
viene de su uso en los compiladores, donde un compilador primero traduce el
cdigo fuente de un programa, en una forma ms apropiada para las
transformaciones de mejora del cdigo (forma usualmente llamada bytecode),
como un paso intermedio antes de generar el archivo objeto o el cdigo mquina
para una mquina especfica.
Una variante del significado de lenguaje intermedio se da en esos lenguajes de
alto nivel que no soportan o no generan un archivo objeto o cdigo mquina, pero
s generan un lenguaje intermedio. Luego ese lenguaje intermedio se transfiere a
un compilador que termina de realizar el archivo objeto o el cdigo mquina. Esto
se emplea generalmente por cuestiones de optimizacin y portabilidad.

6.4.7 Funciones
Funcin del Lenguaje, entendemos que es el uso de la lengua que hace un
hablante. En simples palabras, las funciones del lenguaje son los diferentes
objetivos, propsitos y servicio que se le da al lenguaje al comunicarse, dndose
una funcin del lenguaje por cada factor que tiene ste, en donde la funcin que
prevalece es el factor en donde ms se pone nfasis al comunicarse. Diversos
lingistas (Karl Bhler, Roman Jakobson, Michael Halliday) han propuesto
distintas clasificaciones de las funciones del lenguaje: Bhler propuso que existan
nicamente tres funciones: La Representativa (por la cual se trasmiten
informaciones objetivamente) La Expresiva o emotiva (que expresa sentimientos
del emisor) La Conativa, mediante la que se influye en el receptor del mensaje a
travs de rdenes, mandatos o sugerencias Este modelo pareca muy
incompleto a Jakobson, quien caracteriz mejor las funciones de Bhler y aadi
otras tres sobre los ejes de los factores de la comunicacin :
Funcin Apelativa o Conativa Se centra en el receptor. Es la funcin de mandato y
pregunta. Sus recursos lingsticos son los vocativos, oraciones interrogativas,
utilizacin deliberada de elementos afectivos, adjetivos valorativos, trminos
connotativos y toda la serie de recursos retricos. Se da en lenguaje coloquial, es
dominante en la publicidad y propaganda poltica e ideolgica en general.
Mediante el uso de esta funcin se pretende causar una reaccin en el receptor.
Es decir con esta funcin se pretende que haga algo o que deje de hacer. Por
ejemplo cuando decimos cllate o abre la puerta por favor, etc. El mensaje
solicita la atencin del destinatario, es decir apela a l, implicita o explicitamente.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 71


Tambin se le conoce como funcin apelativa. Funcion Referencial Es la
funcin del lenguaje en donde se pone nfasis al factor de contexto. Al ser el
contexto todo lo extra comunicativo, la funcin referencial trata solamente sucesos
reales y comprobables, ya que no son opiniones ni cosas subjetivas, lo que son es
una serie de elementos verificables entre otros Est presente en todos los actos
comunicativos. Se da cuando el mensaje que se transmite puede ser verificable,
porque reconocemos la relacin que se establece entre el mensaje y el objeto
(referente) Es aquella que utiliza el lenguaje denotativo (el significado primario de
las palabras). Prevalecen los sustantivos y verbos; los textos informativos,
cientficos y periodsticos. Hay 7 funciones: Expresiva o emotiva, apelativa o
conativa, referencial o representativa, situacional, Esta funcin se centra en el
contexto e identifica la relacion entre el mensaje y el objeto del que se habla; es
decir, se centra en la tercera persona, la lengua se usa para hablar de algo o
alguien, que no somos ni t ni yo. As, la funcin referencial se hace presente en
casi todos los mensajes y sirve para evaluar si stos son objetivos o no.















INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 72


UNIDAD 7 OPTIMIZACIN
7.1 TIPOS DE OPTIMIZACIN
La optimizacin va a depender del lenguaje de programacin y es directamente
proporcional al tiempo de compilacin; es decir, entre ms optimizacin mayor
tiempo de compilacin.
Las optimizaciones pueden realizarse de diferentes formas. Las optimizaciones se
realizan en base al alcance ofrecido por el compilador de programacin y es
directamente proporcional al tiempo de compilacin; es decir, entre ms
optimizacin mayor tiempo de compilacin.
Como el tiempo de optimizacin es gran consumidor de tiempo (dado que tiene
que recorrer todo el rbol de posibles soluciones para el proceso de optimizacin)
la optimizacin se deja hasta la fase de prueba final.
Algunos editores ofrecen una versin de depuracin y otra de entrega o final.
La optimizacin es un proceso que tiene a minimizar o maximizar alguna variable
de rendimiento, generalmente tiempo, espacio, procesador, etc.
Desafortunadamente no existen optimizador que hagan un programa ms rpido y
que ocupe menor espacio.
La optimizacin se realiza reestructurando el cdigo de tal forma que el nuevo
cdigo generado tenga mayores beneficios. La mayora de los compiladores
tienen una optimizacin baja, se necesita de compiladores especiales para
realmente optimizar el cdigo.
7.1.1 Locales
La optimizacin local se realiza sobre mdulos del programa. En la mayora de las
ocasiones a travs de funciones, mtodos, procedimientos, clases, etc.

La caracterstica de las optimizaciones locales es que slo se ven reflejados en
dichas secciones.



Optimizacin Local

La optimizacin local sirve cuando un bloque de programa o seccin es crtico por
ejemplo: la E/S, la concurrencia, la rapidez y confiabilidad de un conjunto de
instrucciones.

INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 73


Como el espacio de soluciones es ms pequeo la optimizacin local es ms
rpida.

7.1.2 Bucles

Los ciclos son una de las partes ms esenciales en el rendimiento de un programa
dado que realizan acciones repetitivas, y si dichas acciones estn mal realizadas,
el problema se hace N veces ms grandes.

La mayora de las optimizaciones sobre ciclos tratan de encontrar elementos que
no deben repetirse en un ciclo.

Ciclos
while(a == b)

{ int c = a; c = 5; ; }

En este caso es mejor pasar el int c =a; fuera del ciclo de ser posible.

Ciclos

El problema de la optimizacin en ciclos y en general radica es que muy difcil
saber el uso exacto de algunas instrucciones. Asique no todo cdigo de proceso
puede ser optimizado. Otros uso de la optimizacin pueden ser el mejoramiento
de consultas en SQL o en aplicaciones remotas (sockets, E/S, etc.)

7.1.3 Globales

En algunos casos es mejor mantener variables globales paraagilizar los procesos
(el proceso de declarar variables y eliminarlas toma su tiempo) pero consume ms
memoria.

Algunas optimizaciones incluyen utilizar como variables registros del CPU, utilizar
instrucciones en ensamblador.

7.1.4 De mirilla

Aplicable en cdigo intermedio o cdigo objeto.
Constituye una nueva fase aislada.
Idea Bsica:
Se recorre el cdigo buscando combinaciones de instrucciones que puedan
ser reemplazadas por otras equivalentes mas eficientes.
Se utiliza una ventana de n instrucciones y un conjunto de patrones de
transformacin ( patrn, secuencias reemplazan ).
Si las instrucciones de la ventana encajan con algn patrn se reemplazan
por la secuencia de emplazamiento asociada.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 74


Las nuevas instrucciones son reconsideradas para las futuras
optimizaciones

Ejemplos:
Eliminacin de cargas innecesarias
Reduccin de potencia
Eliminacin de cadenas de saltos

7.2 Costos

Los costos son el factor ms importante a tomar en cuentaa la hora de optimizar
ya que en ocasiones la mejora obtenida puede verse no reflejada en el programa
final pero si ser perjudicial para el equipo de desarrollo.

La optimizacin de una pequea mejora tal vez tenga una pequea ganancia en
tiempo o en espacio pero sale muy costosa en tiempo en generarla.

Pero en cambio si esa optimizacin se hace por ejemplo en un ciclo, la mejora
obtenida puede ser N veces mayor por lo cual el costo se minimiza y es benfico
la mejora.

Por ejemplo: for(int i=0; i< 10000; i++); si la ganancia es de 30 ms 300s.


7.2.1 Costo de ejecucin

Los costos de ejecucin son aquellos que vienen implcitos al ejecutar el
programa.

En algunos programas se tiene un mnimo para ejecutar el programa, por lo que el
espacio y la velocidad del microprocesadores son elementos que se deben
optimizar para tener un mercado potencial ms amplio.

Las aplicaciones multimedia como los videojuegos tienen un costo de ejecucin
alto por lo cual la optimizacin de su desempeo es crtico, la gran mayora de las
veces requieren de procesadores rpidos (e.g. tarjetas de video) o de mucha
memoria.

Otro tipo de aplicaciones que deben optimizarse son las aplicaciones para
dispositivos mviles.

Los dispositivos mviles tiene recursos ms limitados que un dispositivo de
cmputo convencional razn por la cual, el mejor uso de memoria y otros recursos
de hardware tiene mayor rendimiento.

INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 75


En algunos casos es preferible tener la lgica del negocio ms fuerte en otros
dispositivos y hacer uso de arquitecturas descentralizadas como cliente/servidor o
P2P.

7.2.2 Criterios para mejorar el cdigo

La mejor manera de optimizar el cdigo es hacer ver a los programadores que
optimicen su cdigo desde el inicio, el problema radica en que el costo podra ser
muy grande ya que tendra que codificar ms y/o hacer su cdigo ms legible.


Los criterios de optimizacin siempre estn definidos por el compilador.

Muchos de estos criterios pueden modificarse con directivas del compilador desde
el cdigo o de manera externa.

Este proceso lo realizan algunas herramientas del sistema como los ofuscadores
para cdigo mvil y cdigo para dispositivos mviles.

7.2.3 Herramientas para el anlisis del flujo de datos

Existen algunas herramientas que permiten el anlisis de los flujos de datos, entre
ellas tenemos los depuradores y de sambladores.

La optimizacin al igual que la programacin es un arte y no se ha podido
sistematizar del todo.
















INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 76


UNIDAD 8 GENERACIN DE CDIGO OBJETO

8.1 Lenguaje mquina

Un lenguaje de programacin de bajo nivel es el que proporciona poca o ninguna
abstraccin del microprocesador de un ordenador. Consecuentemente es
fcilmente trasladado a lenguaje de mquina.

La palabra bajo no implica que el lenguaje sea inferior a un lenguaje de alto nivel;
se refiere a la reducida abstraccin entre el lenguaje y el hardware.

Uso: ventajas e inconvenientes. [editar]En general se utiliza este tipo de lenguaje
para programar controladores (drivers).

La programacin en un lenguaje de bajo nivel como el lenguaje de la mquina o el
lenguaje simblico tiene ciertas ventajas:

Mayor adaptacin al equipo. Posibilidad de obtener la mxima velocidad con
mnimo uso de memoria. Pero tambin tiene importantes inconvenientes:
Imposibilidad de escribir cdigo independiente de la mquina. Mayor dificultad en
la programacin y en la comprensin de los programas. El programador debe
conocer ms de un centenar de instrucciones. Es necesario conocer en detalle la
arquitectura de la mquina.

Caractersticas

Se trabaja a nivel de instrucciones, es decir, su programacin es al ms fino
detalle. Est orientado a la mquina.

Primera generacin

El lenguaje de programacin de primera generacin (por sus siglas en ingls,
1GL), es el lenguaje de cdigo mquina. Es el nico lenguaje que un
microprocesador entiende de forma nativa. El lenguaje mquina no puede ser
escrito o ledo usando un editor de texto, y por lo tanto es raro que una persona lo
use directamente.

Segunda generacin

El lenguaje de programacin de segunda generacin (por sus siglas en ingls,
2GL), es el lenguaje ensamblador. Se considera de segunda generacin porque,
aunque no es lenguaje nativo del microprocesador, un programador de lenguaje
ensamblador debe conocer la arquitectura del microprocesador (como por ejemplo
las particularidades de sus registros o su conjunto de instrucciones).


INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 77


8.1.1 Caractersticas

El lenguaje mquina realiza un conjunto de operaciones predeterminadas
llamadas micro operaciones.

Las micro operaciones slo realizan operaciones del tipo aritmtica (+,-,*, /),
lgicas (AND, OR, NOT) y de control (secuencial, decisin, repetitiva)

El lenguaje mquina es dependiente del tipo de arquitectura. As un programa
mquina para una arquitectura intel x86 no se ejecutar en una arquitectura Power
PC de IBM (al menos de manera nativa).

Algunos microprocesadores implementan ms funcionalidades llamado CISC, pero
son ms lentos que los RISC ya que estos tienen registros ms grandes.

8.1.2 Direccionamiento

Es la forma en como se accede a la memoria. Recordar que un programa no
puede ejecutarse sino se encuentra en memoria principal. La forma de acceder a
la memoria depende del microprocesador, pero en general existen dos tipos de
direccionamiento: directo e indirecto.

El direccionamiento directo tambin recibe el nombre de direccionamiento
absoluto y el acceso a las direcciones se hace de manera directa. El
direccionamiento indirecto tambin recibe el nombre de direccionamiento relativo y
se basa a partir de una direccin genrica, generalmente el inicio del programa.

Para acceder a una direccin relativa se suma a la direccin base el nmero de
espacios de memorias necesarias. El direccionamiento relativo hace a los
programas relocalizadles e independientes. Si la direccin base es el inicio de la
memoria fija el direccionamiento pasa a ser un variante de direccionamiento
absoluto.

8.2 Lenguaje ensamblador
La comunicacin en lenguaje de mquina es particular de cada procesador que se
usa, y programar en este lenguaje es muy difcil y tedioso, por lo que se empez a
buscar mejores medios de comunicacin con sta.
A principios de la dcada de 1950, y con el fin de facilitar la labor de los
programadores, se desarrollaron cdigos mnemotcnicos para las operaciones y
direcciones simblicas. Uno de los primeros pasos para mejorar el proceso de
preparacin de programas fue sustituir los cdigos de operacin numricos del
lenguaje de mquina por smbolos alfabticos, que conforman un Lenguaje
Mnemotcnico. Todas las computadoras actuales tienen cdigos mnemotcnicos
aunque, naturalmente, los smbolos que se usan varan en las diferentes marcas y
modelos. La computadora sigue utilizando el lenguaje de mquina para procesar
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 78


los datos, pero los programas ensambladores traducen antes los smbolos de
cdigo de operacin especificados a sus equivalentes en lenguaje de mquina.
Los lenguajes ensambladores tienen ventajas sobre los lenguajes de mquina.
Ahorran tiempo y requieren menos atencin a detalles . Se incurren en menos
errores y los que se cometen son ms fciles de localizar. Adems, los programas
en lenguaje ensamblador son ms fciles de modificar que los programas en
lenguaje de mquina. Pero existen limitaciones. La codificacin
en lenguaje ensamblador es todava un proceso lento. Adems, una desventaja
importante de estos lenguajes es que tienen una orientacin a la mquina. Es
decir, estn diseados para la marca y modelo especfico de procesador que se
utiliza.
En el principio de la computacin este era el lenguaje que tena que "hablar" el ser
humano con la computadora y consista en insertar en un tablero miles de
conexiones y alambres y encender y apagar interruptores.
Aunque en la actualidad ya no se emplea, es importante reconocer que ya no es
necesario que nos comuniquemos en este lenguaje de "unos" y "ceros", pero es el
que internamente una computadora reconoce o "habla".

8.2.1 Caractersticas

Dentro de las caractersticas ms primordiales que encontramos en el Lenguaje
Ensamblador tenemos las siguientes las cuales se pueden tomar como ventajas
respecto a los lenguajes de alto nivel:
Velocidad
Eficiencia de tamao
Flexibilidad
Velocidad:
El proceso de traduccin que realizan los intrpretes, implica un proceso de
cmputo adicional al que el programador quiere realizar. Por ello, nos
encontraremos con que un intrprete es siempre ms lento que realizar la misma
accin en Lenguaje Ensamblador, simplemente porque tiene el costo adicional de
estar traduciendo el programa, cada vez que lo ejecutamos.
De ah nacieron los compiladores, que son mucho ms rpidos que los intrpretes,
pues hacen la traduccin una vez y dejan el cdigo objeto, que ya es Lenguaje de
Mquina, y se puede ejecutar muy rpidamente. Aunque el proceso de traduccin
es ms complejo y costoso que el de ensamblar un programa, normalmente
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 79


podemos despreciarlo, contra las ventajas de codificar el programa ms
rpidamente.
Sin embargo, la mayor parte de las veces, el cdigo generado por un compilador
es menos eficiente que el cdigo equivalente que un programador escribira. La
razn es que el compilador no tiene tanta inteligencia, y requiere ser capaz de
crear cdigo genrico, que sirva tanto para un programa como para otro; en
cambio, un programador humano puede aprovechar las caractersticas especficas
del problema, reduciendo la generalidad pero al mismo tiempo, no desperdicia
ninguna instruccin, no hace ningn proceso que no sea necesario.
Para darnos una idea, en una PC, y suponiendo que todos son buenos
programadores, un programa para ordenar una lista tardar cerca de 20 veces
ms en Visual Basic (un intrprete), y 2 veces ms en C (un compilador), que el
equivalente en Ensamblador.
Por ello, cuando es crtica la velocidad del programa, Ensamblador se vuelve un
candidato lgico como lenguaje.
Ahora bien, esto no es un absoluto; un programa bien hecho en C puede ser
muchas veces ms rpido que un programa mal hecho en Ensamblador; sigue
siendo sumamente importante la eleccin apropiada de algoritmos y estructuras
de datos. Por ello, se recomienda buscar optimizar primero estos aspectos, en el
lenguaje que se desee, y solamente usar Ensamblador cuando se requiere ms
optimizacin y no se puede lograr por estos medios.
Eficiencia de Tamao:
Por las mismas razones que vimos en el aspecto de velocidad, los compiladores e
intrpretes generan ms cdigo mquina del necesario; por ello, el programa
ejecutable crece. As, cuando es importante reducir el tamao del ejecutable,
mejorando el uso de la memoria y teniendo tambin beneficios en velocidad,
puede convenir usar el lenguaje Ensamblador. Entre los programas que es crtico
el uso mnimo de memoria, tenemos a los virus y manejadores de dispositivos
(drivers). Muchos de ellos, por supuesto, estn escritos en lenguaje Ensamblador.
Flexibilidad:
Las razones anteriores son cuestin de grado: podemos hacer las cosas en otro
lenguaje, pero queremos hacerlas ms eficientemente. Pero todos los lenguajes
de alto nivel tienen limitantes en el control; al hacer abstracciones, limitan su
propia capacidad. Es decir, existen tareas que la mquina puede hacer, pero que
un lenguaje de alto nivel no permite. Por ejemplo, en Visual Basic no es posible
cambiar la resolucin del monitor a medio programa; es una limitante, impuesta
por la abstraccin del GUI Windows. En cambio, en ensamblador es sumamente
sencillo, pues tenemos el acceso directo al hardware del monitor.
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 80


Resumiendo, la flexibilidad consiste en reconocer el hecho de que
Todo lo que puede hacerse con una mquina, puede hacerse en el lenguaje
ensamblador de esta mquina; los lenguajes de alto nivel tienen en una u otra
forma limitante para explotar al mximo los recursos de la mquina.
Por otro lado, al ser un lenguaje ms primitivo, el Ensamblador tiene ciertas
desventajas respecto a los lenguajes de alto nivel:

Tiempo de programacin
Programas fuente grandes
Peligro de afectar recursos inesperadamente
Falta de Portabilidad
Tiempo de Programacin:
Al ser de bajo nivel, el Lenguaje Ensamblador requiere ms instrucciones para
realizar el mismo proceso, en comparacin con un lenguaje de alto nivel. Por otro
lado, requiere de ms cuidado por parte del programador, pues es propenso a que
los errores de lgica se reflejen ms fuertemente en la ejecucin.
Por todo esto, es ms lento el desarrollo de programas comparables en Lenguaje
Ensamblador que en un lenguaje de alto nivel, pues el programador goza de una
menor abstraccin.
Programas Fuentes Grandes:
Por las mismas razones que aumenta el tiempo, crecen los programas fuentes;
simplemente, requerimos ms instrucciones primitivas para describir procesos
equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los
programas, y nuevamente reduce la productividad de los programadores.
Peligro de afectar recursos Inesperadamente:
Tenemos la ventaja de que todo lo que se puede hacer en la mquina, se puede
hacer con el Lenguaje Ensamblador (flexibilidad). El problema es que todo error
que podamos cometer, o todo riesgo que podamos tener, podemos tenerlo
tambin en este Lenguaje. Dicho de otra forma, tener mucho poder es til pero
tambin es peligroso.
En la vida prctica, afortunadamente no ocurre mucho; sin embargo, al programar
en este lenguaje vern que es mucho ms comn que la mquina se "cuelgue",
"bloquee" o "se le vaya el avin"; y que se reinicialize. Por qu?, porque con este
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 81


lenguaje es perfectamente posible (y sencillo) realizar secuencias de
instrucciones invlidas, que normalmente no aparecen al usar un lenguaje de alto
nivel.
En ciertos casos extremos, puede llegarse a sobrescribir informacin del CMOS
de la mquina (no he visto efectos ms riesgosos); pero, si no la conservamos,
esto puede causar que dejemos de "ver" el disco duro, junto con toda su
informacin.
Falta de Portabilidad:
Como ya se mencion, existe un lenguaje ensamblador para cada mquina; por
ello, evidentemente no es una seleccin apropiada de lenguaje cuando deseamos
codificar en una mquina y luego llevar los programas a otros sistemas operativos
o modelos de computadoras. Si bien esto es un problema general a todos los
lenguajes, es mucho ms notorio en ensamblador: yo puedo reutilizar un 90% o
ms del cdigo que desarrollo en "C", en una PC, al llevarlo a una RS/6000 con
UNIX, y lo mismo si despus lo llevo a una Macintosh, siempre y cuando est bien
hecho y siga los estndares de "C", y los principios de la programacin
estructurada. En cambio, si escribimos el programa en Ensamblador de la PC , por
bien que lo desarrollemos y muchos estndares que sigamos, tendremos
prcticamente que reescribir el 100 % del cdigo al llevarlo a UNIX, y otra vez lo
mismo al llevarlo a Mac.

8.2.2 Almacenamiento

Una de las principales ventajas del uso del ensamblador, es que se encarga de
administrar de manera transparente para el usuario la creacin de memoria, las
bifurcaciones y el paso de parmetros.

Adems nos permite acceder directamente a los recursos de la mquina para un
mejor desempeo.

8.3 Registros

Los registros del procesador se emplean para controlar instrucciones en ejecucin,
manejar direccionamiento de memoria y proporcionar capacidad aritmtica. Los
registros son espacios fsicos dentro del microprocesador con capacidad de 4 bits
hasta 64 bits dependiendo del microprocesador que se emplee. Los registros son
direccionales por medio de una vieta, que es una direccin de memoria. Los bits,
por conveniencia, se numeran de derecha a izquierda (15, 14, 13. 3, 2, 1, 0), los
registros estn divididos en seis grupos los cuales tienen un fin especfico. Los
registros se dividen en:

Registros de segmento
Registros de apuntadores de instrucciones
INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 82


Registros apuntadores
Registros de propsitos generales
Registro ndice
Registro de bandera.
Registros de uso general

AX = Registro acumulador, dividido en AH y AL (8 bits cada uno).- Interviene en
las operaciones aritmticas y lgicas, despus de la operacin arroja un resultado.

BX = Registro base, dividido en BH y BL.- Se utiliza en transferencias de datos
entre la memoria y el procesador.

CX = Registro contador, dividido en CH y CL.- Se utiliza como contador en
bucles(LOOP), en operaciones con cadenas(REP), y en desplazamientos(CL).

DX = Registro de datos, dividido en DH y DL.- Se utiliza en operaciones de
multiplicacin y divisin junto con Ax y en operaciones de entrada y salida de
puertos, su mitad inferior DL contiene el nmero de puertos.



Un registro de segmento se utiliza para alinear en un limite de prrafo o dicho de
otra forma codifica la direccin de inicio de cada segmento y su direccin en un
registro de segmento supone cuatro bits 0 a su derecha.

Un registro de segmento tiene 16 bits de longitud y facilita un rea de memoria
para direccionamientos conocidos como el segmento actual. Los registros de
segmento son: CS (cdigo), DS (datos), SS (pila), ES , FS y GS.

Registro Apuntador de instrucciones.(IP)

El registro apuntador de instrucciones (IP) de 16 bits contiene el desplazamiento
de direccin de la siguiente instruccin que se ejecuta.

Registro ndice.

Los registros SI y DI estn disponibles para direccionamientos indexados y para
sumas y restas. Que son las operaciones de punta.

Registro de bandera.

Los registros de banderas sirven parar indicar el estado actual de la maquina y el
resultado del procesamiento, Cuando algunas instrucciones piden comparaciones
o clculos aritmticos cambian el estado de las banderas.



INSTITUTO TECNOLOGICO SUPERIOR DE TAMAZUNCHALE

Programacin de Sistemas Pg. 83



8.3.1 Distribucin

La distribucin es el proceso en el que el programa generado puede ejecutarse en
otras mquinas. Con respecto al ensamblador, la mayora del direccionamiento se
hace relativo para que el programa sea relocalizable por un programa llamado
cargador. En el caso de programas compiladores se necesitan de las libreras, si
son estticos se incluyen en el ejecutable por lo que el programa se hace grfico,
si son dinmicas no pero el programa es ms pequeo. Debido a la complejidad
del software actual se necesitan de asistentes para poder instalar y ejecutar un
programa.

8.3.2 Asignacin

La asignacin de valores a variables se hace a travs de un proceso de mover el
contenido de memoria a registro, o de registro a memoria, pero nunca de memoria
a memoria.
Cuando se trata de memoria dinmica se debe seguir el rastro de los datos

8.4 ADMINISTRACIN DE MEMORIA

La administracin de la memoria es un proceso hoy en da muy importante, de tal
Modo que su mal o buen uso tiene una accin directa sobre el desempeo de
memoria.

En general un ensamblador tiene un administrador de memoria ms limitado que
un compilador.

En la mayora de los lenguajes de programacin el uso de punteros no estaba
vigilado por lo que se tienen muchos problemas con el uso de memoria.

Los lenguajes ms recientes controlan el uso de punteros y tienen un programa
denominado recolector de basura que se encarga de limpiar la memoria no
utilizada mejorando el desempeo.

You might also like