jueves, 27 de mayo de 2010

Interpretes y Compiladores

1¿Cuáles 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.


2.- ¿Cuáles son las fases de los compiladores?

Fase de análisis

Análisis léxico

Artículo principal: Analizador léxico

El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa en componentes léxicos (tokens), que son secuencias de caracteres que tienen un significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y demás información innecesaria se elimina del programa fuente. También se comprueba que los símbolos del lenguaje (palabras clave, operadores,...) se han escrito correctamente.

Como la tarea que realiza el analizador léxico es un caso especial de coincidencia de patrones, se necesitan los métodos de especificación y reconocimiento de patrones, y éstos métodos son principalmente las expresiones regulares y los autómatas finitos. Sin embargo, un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera tan eficiente como sea posible.

Análisis sintáctico

Artículo principal: Analizador sintáctico

En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente en frases gramaticales que el compilador utiliza para sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintácticamente correcto (obedece a la gramática del lenguaje). Por lo general, las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico.

La estructura jerárquica de un programa normalmente se expresa utilizando reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la definición de expresiones:

  1. Cualquier identificador es una expresión.
  2. Cualquier número es una expresión.
  3. Si expresión1 y expresión2 son expresiones, entonces también lo son:
    • expresión1 + expresión2
    • expresión1 * expresión2
    • ( expresión1 )

Las reglas 1 y 2 son reglas básicas (no recursivas), en tanto que la regla 3 define expresiones en función de operadores aplicados a otras expresiones.

La división entre análisis léxico y análisis sintáctico es algo arbitraria. Un factor para determinar la división es si una construcción del lenguaje fuente es inherentemente recursiva o no. Las construcciones léxicas no requieren recursión, mientras que las construcciones sintácticas suelen requerirla. No se requiere recursión para reconocer los identificadores, que suelen ser cadenas de letras y dígitos que comienzan con una letra. Normalmente, se reconocen los identificadores por el simple examen del flujo de entrada, esperando hasta encontrar un carácter que no sea ni letra ni dígito, y agrupando después todas las letras y dígitos encontrados hasta ese punto en un componente léxico llamado identificador. Por otra parte, esta clase de análisis no es suficientemente poderoso para analizar expresiones o proposiciones. Por ejemplo, no podemos emparejar de manera apropiada los paréntesis de las expresiones, o las palabras begin y end en proposiciones sin imponer alguna clase de estructura jerárquica o de anidamiento a la entrada.

Análisis semántico

La fase de análisis semántico revisa el programa fuente para tratar de encontrar errores semánticos y reúne la información sobre los tipos para la fase posterior de generación de código. En ella se utiliza la estructura jerárquica determinada por la fase de análisis sintáctico para identificar los operadores y operandos de expresiones y proposiciones.

Un componente importante del análisis semántico es la verificación de tipos. Aquí, el compilador verifica si cada operador tiene operandos permitidos por la especificación del lenguaje fuente. Por ejemplo, las definiciones de muchos lenguajes de programación requieren que el compilador indique un error cada vez que se use un número real como índice de una matriz. Sin embargo, la especificación del lenguaje puede imponer restricciones a los operandos, por ejemplo, cuando un operador aritmético binario se aplica a un número entero y a un número real. Revisa que los arreglos tengan definido el tamaño correcto.

Fase de síntesis

Consiste en generar el código objeto equivalente al programa fuente. Sólo se genera código objeto cuando el programa fuente está libre de errores de análisis, lo cual no quiere decir que el programa se ejecute correctamente, ya que un programa puede tener errores de concepto o expresiones mal calculadas. Por lo general el código objeto es código de máquina relocalizable o código ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa. Después, cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de máquina que ejecuta la misma tarea. Un aspecto decisivo es la asignación de variables a registros.

Generación de código intermedio

Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explícita del programa fuente. Se puede considerar esta representación intermedia como un programa para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto.

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

El análisis está relacionado 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)

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.

Si detecta la existencia de errores, se notifican por medio del gestor de errores.

4.- ¿Cuál es el análisis lexicográfico ?

Artículo principal: Analizador léxico

El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa en componentes léxicos (tokens), que son secuencias de caracteres que tienen un significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y demás información innecesaria se elimina del programa fuente. También se comprueba que los símbolos del lenguaje (palabras clave, operadores,...) se han escrito correctamente.

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

Artículo principal: Analizador sintáctico

En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente en frases gramaticales que el compilador utiliza para sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintácticamente correcto (obedece a la gramática del lenguaje). Por lo general, las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico.

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

Artículo principal: Analizador sintáctico

En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente en frases gramaticales que el compilador utiliza para sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintácticamente correcto (obedece a la gramática del lenguaje). Por lo general, las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico.

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

Consiste en generar el código objeto equivalente al programa fuente. Sólo se genera código objeto cuando el programa fuente está libre de errores de análisis, lo cual no quiere decir que el programa se ejecute correctamente, ya que un programa puede tener errores de concepto o expresiones mal calculadas. Por lo general el código objeto es código de máquina relocalizable o código ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa. Después, cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de máquina que ejecuta la misma tarea. Un aspecto decisivo es la asignación de variables a registros.

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

Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explícita del programa fuente. Se puede considerar esta representación intermedia como un programa para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto.

9.- ¿Qué 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.

Nota: Cada instrucción de código intermedio puede dar lugar a más de una de código máquina.

10.- ¿Cuáles son las diferencias entre un interprete 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.




martes, 18 de mayo de 2010

Ligadores y Cargadores

1.-¿Qué son los ligadores?

Es un programa que enlaza todos los programas o módulos resultando de esto un programa ejecutable.

Estos programas que enlazan poseen subprogramas.

2.- ¿Cuáles son las principales funciones de un ligador?

*Enlazar código intermedio copilado

*Incorpora las rutinas de librería

*Reducir procedimientos por separados enlazarlos para que se ejecuten como una unidad llamada programa binario ejecutable.

3.- ¿Cuáles son los tipos de ligadores?

*-Editores de ligado

Realiza relocalización de todas las secciones de control relativas al inicio del programa ligado.

*-Ligador dinámico

Proporciona la posibilidad de cargar las rutinas sólo cuando y si se necesitan.

Cuando se utiliza el ligador dinámico se ejecuta la proposición llamada. LIGADOR DEL SISTEMA VAX que este es una acción del ligador en la creación de las secciones de imagen está controlada por ensamblador o compilador.

*-Editor de ligado de sistema /370

La técnica de referencia a un número se usa para mejorar la eficiencia. El programa de salida del editor de ligado se llama módulo de carga.

4.- ¿Cuáles son los ligadores estáticos?

Son los encargados de ligar el código objeto del programa que están guardados en uno o más archivos, además de todo ahorran espacio en el disco

5.- ¿Cuáles son los ligadores dinámicos?

Tiene ventajas ya que permite cargar rutinas solo cuando sea necesario, se puede obtener ahorro de tiempo y espacio en la memoria.

6.- ¿Cuáles son los ligadores de bibliotecas de códigos de objeto?

Ligador Estático

Ligador Dinámico

7.- ¿Qué es un cargador?

Es un programa que tiene como propósito colocar en la memoria las instrucciones y datos de un programa o información codificada en lenguaje máquina, para que entonces la computadora pueda procesarla. Un cargador es un programa que realiza la función de carga, pero muchos cargadores también incluyen relocalización y ligado.

8.- ¿Cuáles son las funciones de un cargador?

Colocar un programa objeto en la memoria e iniciar su ejecución, extraen información de un medio exterior de la memoria, traduce y carga el programa para ejecutarlo.

9.- ¿Tipos de cargadores?

*Cargadores iniciales.

Sirven para cargar en la memoria pequeños programas que inician el funcionamiento de una computadora.

*Cargadores absolutos.

Es cada vez que se ejecuta el programa cargador

*Cargadores con reubicación

Sirven para cargar programas de diferentes reubicación

*Cargadores ligadores

Esto es cuando adjunta al programa objeto

*Cargadores BOOTSTRAP

Es cuando la entrada es manual por medio del teclado

*Cargadores Absolutos

Lee la línea de código objeto inicial

*Cargadores Relocalizables

Permite localizar las posiciones de memoria para almacenar las palabras o instrucciones de datos

10. -¿Cuáles son los cargadores de carga absoluta y relocalizable?

Carga Absoluta: El cargador absoluto lee simplemente la línea de código objeto que contiene la dirección de inicio de las instrucciones y datos, y carga las palabras (o bytes) sucesivas en posiciones de memoria sucesivas.

Relocalizables: El cargador relocalizable es un programa más sofisticado, tiene las características del cargador absoluto, y además permite al usuario seleccionar y especificar las posiciones de memoria en las que se debe almacenar las palabras de instrucciones y datos.

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

Estáticos: Un cargador estático es útil cundo es posible asignar en memoria un programa completo.

Dinámicos: Un cargador dinámico es útil cuando no es posible asignar en memoria un programa completo, dicho cargador se basa en el binder para operar de esta forma.

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

Es el cambio del ultimo punto de consistencia del sistema en el que el usuario tenia control de la aplicaron, para que el sistema operativo se encargue de continuar son la ejecución.