domingo, 30 de mayo de 2010

Compiladores y Funciones Unidad III

1.- ¿Cuales son las funciones de un compilador?

A grandes rasgos un compilador es un programa que lee un programa escrito es un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Como parte importante de este proceso de traducción, el compilador informa a su usuario de la presencia de errores en el programa fuente.
A primera vista, la diversidad de compiladores puede parecer abrumadora. Hay miles de lenguajes fuente, desde los lenguajes de programación tradicionales, como FORTRAN o Pascal, hasta los lenguajes especializados que han surgido virtualmente en todas las áreas de aplicación de la informática.




2.- ¿Cuáles son las fases de un compilador?

Fase de análisis: Análisis léxico, análisis sintáctico y el análisis semántico.
Fase de Síntesis: Generación de optimización de código intermedio y Generación de optimización de código objeto

3.- ¿En que consiste la fase de análisis?

Está fase se relaciona con el lenguaje fuente y consiste en ir leyendo las instrucciones que lo componen e ir almacenando el significado de las mismas. En esta fase se obtiene un código intermedio (información de instrucciones) y una tabla de símbolos (información de datos).
Además de que en esta fase el programa es descompuesto en sus elementos fundamentales. Abarca el análisis léxico, el análisis sintáctico y el análisis semántico.
Esta fase verifica si el programa en lenguaje fuente es correcto, y recoge la información necesaria en la tabla de símbolos para el módulo de síntesis.

4.- ¿Cuál es el análisis léxico grafico?

Es el que se encarga de verificar si todas las cadenas pertenecen o no al lenguaje. Es decir realiza un análisis símbolo por símbolo indicando el token por cada uno de los elementos reconocidos o el error en caso de no reconocer. Este análisis no logra detectar muchos errores por su característica.

5.- ¿Cual es el análisis sintáctico?

Es el que impone una estructura jerárquica a la cadena de componentes léxicos, generada por el analizador léxico, que es representada en forma de un árbol sintáctico.

6.- ¿En que consiste el análisis semántico?

Es posterior al sintáctico y mucho más difícil de formalizar que éste. Se trata de determinar el tipo de los resultados intermedios, comprobar que los argumentos que tiene un operador pertenecen al conjunto de los operadores posibles, y si son compatibles entre sí, etc. En definitiva, comprobará que el significado de lo que se va leyendo es válido.
La salida “teórica” de la fase de análisis semántico sería un árbol semántico. Consiste en un árbol sintáctico en el que cada una de sus ramas ha adquirido el significado que debe tener. En el caso de los operadores polimórficos (un único símbolo con varios significados), el análisis semántico determina cuál es el aplicable.



7.- ¿En que consiste la fase de síntesis?

Etapa de generación de código intermedio, aunque algunos compiladores no la tienen, es bueno saber de su existencia, en esta etapa se lleva el código del programa fuente a un código interno para poder trabajar mas fácilmente sobre él. Esta representación interna debe tener dos propiedades, primero debe ser fácil de representar y segundo debe ser fácil de traducir al código objeto.
En la etapa de optimización de código, se busca obtener el código más corto y rápido posible, utilizando distintos algoritmos de optimización.
Etapa de generación de código, se lleva el código intermedio final a código maquina o código objeto, que por lo general consiste en un código maquina relocalizable o código ensamblador. Se selecciona las posiciones de memoria para los datos (variables) y se traduce cada una de las instrucciones intermedias a una secuencia de instrucciones de maquina puro.




8.- ¿Qué es la Generación de código intermedio?

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, por ejemplo, un código intermedio de tercetos, llamado así porque en cada una de sus instrucciones aparecen como máximo tres operandos.

9.- ¿Que es la Generación y optimización de código objeto?

A partir de los análisis anteriores y de las tablas que estos análisis van creando durante su ejecución produce un código o lenguaje objeto que es directamente ejecutable por la máquina. Es la fase final del compilador. Las instrucciones del código intermedio se traducen una a una en código máquina reubicable.
Cada instrucción de código intermedio puede dar lugar a más de una de código máquina.
Ejemplo: El código anterior traducido a ensamblador DLX quedaría:
LW R1,id3MUL R1,R1,2LW R2,id2ADD R2,R2,R1SW id1,R2 en donde id1, id2 y id3 representan las posiciones de memoria en las que se hallan almacenadas estas variables; R1 y R2 son los registros de la máquina; y las instrucciones LW, SW, MUL y ADD representan las operaciones de colocar un valor de memoria en un registro, colocar un valor de un registro en memoria, multiplicar en punto flotante y sumar, respectivamente2.

10.- ¿Cuáles son las diferencias entre un intérprete y un compilador?

Interprete: Es un programa que lee línea a línea un programa escrito en un lenguaje; en lenguaje fuente y lo va traduciendo a un código intermedio, para ejecutarlo.
Compilador: Es un programa que lee totalmente un programa escrito en un lenguaje; el lenguaje fuente, y lo traduce a un programa equivalente a otro lenguaje, lenguaje objeto.
A grandes rasgos un compilador es un programa que lee un programa escrito es un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Como parte importante de este proceso de traducción, el compilador informa a su usuario de la presencia de errores en el programa fuente.
La principal ventaja del proceso de compilación frente al de interpretación es que los programas se ejecutan mucho más rápidamente una vez compilados; por el contrario, es más cómodo desarrollar un programa mediante un intérprete que mediante un compilador puesto que en el intérprete las fases de edición y ejecución están más integradas. La depuración de los programas suele ser más fácil en los intérpretes que en los compiladores puesto que el código fuente está presente durante la ejecución. Estas ventajas pueden incorporarse al compilador mediante la utilización de entornos de desarrollo y depuradores simbólicos en tiempo de ejecución.

martes, 18 de mayo de 2010

Unidad IV Ligadores

1.- ¿Que son los ligadores?

Es un programa que enlaza todos los programas o módulos obteniendo lo que denominamos programa ejecutable ala ves enlaza distintos módulos o programas que poseen subprogramas. Además de incorporar las denominadas rutinas de librerías en caso de solicitarlas el propio programa.

2.- ¿Cuales son las principales funciones de un ligador?

Enlazar código intermedio compilado independientemente en un solo módulo de carga resolviendo las diferencias entre Tokens.
Incorpora las denominadas rutinas de librerías en caso de solicitarlas el propio programa.

Su función es reducir procedimientos traducidos por separado y enlazarlos para que se ejecuten como una unidad llamada programa binario ejecutable.

3.- ¿Cuales son los tipos de ligadores?

Editores de ligado.- La diferencia fundamental entre un editor de ligado y un cargador ligador es: Primero se ensambla o compila el programa fuente, produciendo un programa objeto (que puede contener varias secciones de control diferentes).
Ligador dinámico.- El ligador dinámico ofrece algunas ventajas sobre los otros tipos de ligado. Proporciona la posibilidad de cargar las rutinas sólo cuando y si se necesitan. Si las subrutinas son grandes o tienen muchas referencias externas, se pueden conseguir ahorros considerables de tiempo y espacio de memoria.

4.- ¿Cuales son los ligadores estáticos?

Cuando se utilizan subrutinas en un programa, el código ejecutable de cada una de ellas debe encontrarse en memoria al tiempo de ejecución. Para esto, antes de cargar un programa, debe ligarse su código objeto con los códigos objeto (guardados en uno o más archivos) de cada una de las subrutinas invocadas por él, obteniendo así un programa ejecutable que contiene tanto el código del módulo invocador como el código de los módulos invocados.

5.- ¿Cuales son los ligadores dinámicos?

Ofrece ventajas que el estático no. Proporciona la posibilidad de cargar las rutinas sólo cuando y si se necesitan. SI las subrutinas son grandes o tienen muchas referencias externas, se pueden conseguir ahorros considerables de tiempo y espacio de memoria.
Supongamos que en cualquier ejecución un programa usa sólo pocas de una gran cantidad de subrutinas posibles, pero el número exacto de rutinas necesarias no puede predecirse hasta que el programa examina su entrada.

6.- ¿Que son los Ligadores de bibliotecas de códigos de objetos?

Se le denomina estático ya que se realiza antes de ejecutar el programa

Estático: Cuando se utilizan subrutinas en un programa, el código ejecutable de cada una de ellas debe encontrarse en memoria al tiempo de ejecución. Para esto, antes de cargar un programa, debe ligarse su código objeto con los códigos objeto (guardados en uno o más archivos) de cada una de las subrutinas invocadas por él, obteniendo así un programa ejecutable que contiene tanto el código del módulo invocador como el código de los módulos invocados.

Dinámico: Ofrece ventajas que el estático no. Proporciona la posibilidad de cargar las rutinas sólo cuando y si se necesitan. SI las subrutinas son grandes o tienen muchas referencias externas, se pueden conseguir ahorros considerables de tiempo y espacio de memoria.




7.- ¿Que es un cargador?

Programa que coloca en la memoria para su ejecución, el programa guardado en algún dispositivo de almacenamiento secundario, consiste en un juego de instrucciones que permiten al dispositivo de entrada (teclado ó unidad de cinta) asignar la dirección de inicio de la memoria y asegurar que el computador leerá el programa y lo cargara byte a byte.

Programa del sistema que realiza la función de carga pero muchos cargadores también incluyen relocalización y ligado. Algunos sistemas tienen un ligador (ó editor de ligado) para realizar las operaciones de enlace.

8.- ¿Cuales son las funciones de un cargador?


Coloca un programa objeto en la memoria e iniciar su ejecución.
Lleva la carga al programa objeto a la memoria para su ejecución.
Modifica el programa objeto de forma que puede cargarse en una dirección diferente de la localidad especificada originalmente.
Combina dos o mas programas objeto independientes y proporciona la información necesaria para realizar diferencias entre ellos.

9.- ¿Tipos de cargadores?

Cargadores Bootstrap: situado en la memoria del computador, cargará el programa de aplicación y los datos. Pero, previamente, se ha debido cargar el cargador en la memoria.
Cargadores iniciales: indican a la computadora la forma de poner, dentro de la memoria principal unos datos que están guardados en un periférico de memoria externa (cinta, disco, etc.). Sirven para cargar en la memoria pequeños programas que inician el funcionamiento de una computadora.
Cargadores absolutos: el programa cargador pone en memoria las instrucciones guardadas en sistemas externos. Independientemente de que sea un cargador inicial, o no sin dichas instrucciones se almacenan siempre en el mismo espacio de memoria (cada vez que se ejecuta el programa cargador) se dice que es un cargador absoluto.
Cargadores con reubicación: en ocasiones un mismo programa necesita ejecutarse en diferentes posiciones de memoria. Para esto la traducción debe estar realizada en forma adecuada, es decir no utilizando referencias absolutas a direcciones en memoria, sino referencias a una dirección especial llamada de reubicación.
Cargadores ligadores: conocidos también como linker. Un linker se un término en inglés que significa montar.
Montar un programa consiste en añadir al programa objeto obtenido a la traducción las rutinas externas a las que hace referencia dicho programa.

10.- ¿Cuales son los cargadores de carga absoluta y relocalizable?

Carga absoluta: consiste en que con la máquina vacía ó inactiva no hay necesidad de hacer relocalización de programas tan solo se puede especificar la dirección absoluta del programa que se cargue en primer lugar.
En la mayoría de los casos este programa es el sistema operativo que ocupa un lugar predefinido en la memoria. Dicho de otra manera es que se necesitan algunos medios para realizar las funciones del cargador absoluto. Una opción es que el operador introduzca en la memoria el código objeto de un cargador absoluto, utilizando los interruptores en la consola del computador.

Nota: Algunos computadores requerían que el operador hiciera exactamente eso. Sin embargo este proceso es demasiado incomodo y propenso a errores para ser una buena solución del problema.
Relocalizable: Los cargadores que permiten la relocalización de programas se denominan cargadores relocalizadores o relativos.
Nota: Algunos computadores proporcionan una posibilidad de relocalización por hardware que elimina en parte la necesidad de que el cargador efectúe la relocalización de programas.

11.- ¿Cuales son los cargadores estáticos y dinámicos?

Estáticos: estos son utilizados para cargar de manera estática o sin tener algún movimiento cuando se realiza el proceso de la información del ejecutable.
La estructura se coloca estática en memoria. Solo que aquí no se puede intercambiar cada unos de los módulos en memoria conforme se requieran
Dinámicos: El cargador dinámico se utiliza para cargar dinámicamente bibliotecas compartidas durante el inicio ejecutable.
Es útil cuando no es posible asignar en memoria un programa completo, dicho cargador se basa en el binder para operar de esta forma.
La estructura se coloca dinámicamente en memoria. De esta forma cada módulo se va intercalando en memoria conforme se requiere.


12.- ¿Que entiendes por paso de control al sistema operativo?

Es como un proceso el cual genera de manera estable todo el funcionamiento del sistema operativo en la computadora para que con este el trabajo que realice el usuario sea más rápido y el cual puede cargar y ejecutar los programas que requiera de acuerdo a sus necesidades.