miércoles, 13 de mayo de 2009

HERRAMIENTAS PARA LA CONSTRUCCION DE COMPILADORES

Entorno de un compilador:
La estructura del programa fuente se escribe, usando algún programa de edición de texto (por ejemplo vi), y puede incluir texto en lenguaje fuente y algunas órdenes para el preprocesador. Este realizará algunas tareas, como eliminación de comentarios, expansión de macros (#IF . . . ), inclusión de archivos (#include . . . ), sustitución de constantes (#define . . . ), o algunas extensiones del lenguaje fuente.
El compilador traducirá el resultado del preproceso obteniendo un programa equivalente en lenguaje ensamblador, que a su vez será traducido por el ensamblador a código máquina relocalizable, en el cual las direcciones serán relativas a ciertas posiciones de origen, y quizás algunas llamadas a rutinas no estén resueltas.
Utilidades y Generadores de Compiladores
A continuación se muestran algunas de las herramientas disponibles que pueden utilizarse para la realización del Proyecto de Compiladores. Todas estas herramientas funcionan bajo Windows.



Nota: El uso de estas herramientas de compiladores no es en absoluto obligatorio ni se garantiza su correcto funcionamiento.
Ensambladores Simbólicos ENS
Los ensambladores simbólicos ENS permiten ensamblar, ejecutar y depurar el código ensamblador generado por el compilador. Dentro de los ficheros comprimidos que se pueden obtener en la tabla, se encuentra información sobre su uso, su sintaxis y algún ejemplo de funcionamiento.

GENERACION DE CODIGO INTERMEDIO

El analizador sintáctico va generando acciones que valida el analizador semántico y que se convierten en tercetos. Esta conversión en tercetos constituye el generador de código intermedio.
Dado que el lenguaje puede presentar distintas funciones anidadas, los tercetos los generamos por orden del parser y son almacenados en un sitio u otro dependiendo del contexto en que nos encontremos. Es decir, se almacenan en una lista de tercetos dependiente de la Tabla de Símbolos. Hay tantas listas de tercetos como funciones haya en el código fuente más una lista de tercetos asociada a la Tabla de Símbolos Global
No obstante una vez finalizado el análisis, todos estos tercetos repartidos en distintas listas se vuelcan a una sola lista de tercetos global. Esta será la que finalmente se optimice y a partir de la que se generará el programa en ensamblador.
En el modelo de compilación análisis-sintesis, el front-end traduce el programa fuente en una representación de código intermedio, y el back-end traduce esta representación en código final.
1. Permite crear fácilmente un compilador para diferentes maquinas
2. La representación intermedia puede ser optimizada por un optimizador independiente del código final.
3. Lenguajes Intermedios:
4. Arboles de Sintaxis.
5. Código de tres direcciones
El código intermedio es un código abstracto independiente de la máquina para la que se generará el código objeto. El código intermedio ha de cumplir dos requisitos importantes: ser fácil de producir a partir del análisis sintáctico, y ser fácil de traducir al lenguaje objeto. Esta fase puede no existir si se genera directamente código máquina, pero suele ser conveniente emplearla.
Ejemplo: Consideremos un código intermedio de tercetos, llamado así porque en cada una de sus instrucciones aparecen como máximo tres operandos. La sentencia traducida a este código intermedio quedaría2:
temp1 := inttoreal (2)temp2 := id3 * temp1temp3 := id2 + temp2id1 := temp3

GESTION DE MEMORIA EN TIEMPO DE EJECUCION

Disposición de los Programas en Memoria
Sist. Operativo (cargador/loader) suministra espacio sobre el que se ejecutara el programa S.O. + Compilador determinan organización del espacio asignado al programa objeto Compilador debe incorporar código adicional al programa objeto para gestionarlo.
Organización típica
CODIGO
MEMORIA
ESTATICA
PILA

...........................
...........................


MOTICULO
(heap)

CODIGO: Almacena instrucciones en código maquina del programa ejecutable
1. incluye el código de funciones y procedimientos
2. su tamaño puede fijarse en tiempo de compilación
MEM. ESTATICA: Datos (variables) cuyo tamaño se conoce en tiempo de compilación
1. Variables globales + Literales (constantes)(enteros, reales, strings, ...)
2. Variables estáticas (var. locales cuyo valor se mantiene entre llamadas a procedimientos) (static en C)
3. Otros: direcciones reservadas (por el S.O.), código y datos estáticos cargados desde librerías o módulos pre compilados
PILA Zona dinámica.
Mantiene registros de activación de los procedimientos que se han llamado
1. Reg. activación: contienen var. Locales del procedimiento + info. De control adicional
2. Pila crece (en llamadas a procedim.) y decrece (al retornar)
MOTICULO Zona dinámica.
Generalmente: Comienza en la dirección más alta y crece “hacia abajo”.
Guarda datos cuyo tamaño varía en tiempo de ejecución o que no se pueden mantener en mem. Estática ni en pila
Espacio puede ser asignado y desasignado en cualquier momento

viernes, 8 de mayo de 2009

COMPILADORES (Notacion Postfija, infija, )

NOTACION POSTFIJA


Para evaluar una expresión en notación infija en un valor específico para X se deben seguir las reglas matemáticas para la prioridad de las operaciones:

  1. Las potencias tienen prioridad sobre cualquier operación
  2. La multiplicación y la división tienen prioridad sobre la suma y la resta.
  3. Si se presenta un paréntesis, se deben realizar primero las operaciones dentro de éste. Si hay un paréntesis dentro de otro tiene prioridad el paréntesis interno.

Por el contrario, en la notación postfija siempre se trabaja de izquierda a derecha; note además que la notación postfija no tiene paréntesis por la forma lineal en que se lee. Comparemos un ejemplo en donde se evalúa un valor en una expresión utilizando estas dos notaciones.

Ejemplo:









La postfija seria: 5 4 * 2 6 * 7 - -

NOTACION PREFIJA

Los operandos conservan el mismo orden que la notación infija equivalente.

  • No requiere de paréntesis para indicar el orden de precedencia de operadores ya que el es una operación.
  • Se evalúa de izquierda a derecha hasta que encontrémosle primer operador seguido inmediatamente de un par de operandos.
  • Se evalúa la expresión binaria y el resultado se cambia como un nuevo
  • operando.
  • Se repite este hasta que nos quede un solo resultado.

Notación prefija: El orden es operador, primer operando, segundo.

Ejemplo:

+ab

POLACA INVERSA

  • Los cálculos se realizan secuencialmente según se van introduciendo operadores, en vez de tener que esperar a escribir la expresión al completo. Debido a esto, se cometen menos errores al procesar cálculos complejos.
  • El proceso de apilación permite guardar resultados intermedios para un uso posterior. Esta característica permite que las calculadoras RPN computen expresiones de complejidad muy superior a la que alcanzan las calculadoras algebraicas.
  • No requiere paréntesis ni reglas de preferencia, al contrario que la notación algebraica, ya que el proceso de apilamiento permite calcular la expresión por etapas.
  • En las calculadoras RPN, el cálculo se realiza sin tener que apretar la tecla "=" (aunque se requiere pulsar la tecla "Enter" para añadir cifras a la pila).
  • El estado interno de la calculadora siempre consiste en una pila de cifras sobre las que se puede operar. Dado que no se pueden introducir operadores en la pila, la notación polaca inversa es conceptualmente más sencilla y menos dada a errores que otras notaciones.
  • En términos educativos, la notación polaca inversa requiera que el estudiante comprenda la expresión que se está calculando. Copiar una expresión algebraica directamente a una calculadora sin comprender la aritmética dará un resultado erróneo.

Ejemplo:

La expresión algebraica 5+((1+2)*4)-3 se traduce a la notación polaca inversa como 5 1 2 + 4 * + 3 - y se evalúa de izquierda a derecha según se muestra en la siguiente tabla. La "Pila" es la lista de los valores que el algorimo mantiene en su memoria después de realizar la operación dada en la segunda columna.

COLAS DE PRIORIDAD

Una cola de prioridades es una estructura de datos en la que los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen.

OPERACIONES
Las operaciones de las colas de prioridad son las mismas que las de las colas genéricas:Crear: se crea la cola vacía.
Encolar: se añade un elemento a la cola, con su correspondiente prioridad. Desencolar: se elimina el elemento frontal de la cola. Frente: se devuelve el elemento frontal de la cola.
Ejemplos: de la vida diaria serían la sala de urgencias de un hospital, ya que los enfermos se van atendiendo en función de la gravedad de su enfermedad.