ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

Introduccion A La Compilacion Ensambler

jcarlos1224 de Mayo de 2013

6.425 Palabras (26 Páginas)401 Visitas

Página 1 de 26

UNIDAD 1

Introducción a la compilación

Breve Historia

En 1950, John Backus dirigió una investigación en I.B.M. en un lenguaje algebraico. En 1954 se empezó a

desarrollar un lenguaje que permitía escribir fórmulas matemáticas de manera traducible por un ordenador.

Le llamaron FORTRAN (FORmulae TRANslator), este fue el primer lenguaje considerado de alto nivel.

Surgió así por primera vez el concepto de un traductor, como un programa que traducía un lenguaje a

otro lenguaje. En el caso particular de que el lenguaje a traducir es un lenguaje de alto nivel y el lenguaje

traducido de bajo nivel, se emplea el término compilador.

La tarea de realizar un compilador no fue fácil, el primer compilador de FORTRAN tardó 18 añospersona

en realizarse y era muy sencillo. Este desarrollo del FORTRAN estaba muy influenciado por la máquina

objeto en la que iba a ser implementado.

En 1958, se dividía por primera vez el compilador en dos fases, designadas como el "front end" y el "back end".

La primera fase (front end) es la encargada de analizar el programa fuente y la segunda fase (back end) es la

encargada de generar código para la máquina objeto. El puente de unión entre las dos fases era un lenguaje

intermedio que se designó con el nombre de UNCOL (UNiversal Computer Oriented Language). Para que un

compilador fuera utilizable por varias máquinas bastaba únicamente modificar su back end.

La técnica de la optimización apareció desde el desarrollo del primer compilador de FORTRAN. Backus

comenta cómo durante el desarrollo del FORTRAN se tenía el miedo de que el programa resultante de la

compilación fuera más lento que si se hubiera escrito a mano. Para evitar esto, se introdujeron algunas

optimizaciones en el cálculo de los índices dentro de un bucle. Pronto se sistematizan y se recoge la división de

optimizaciones independientes de la máquina y dependientes de la máquina. Entre las primeras están la

propagación de valores , el arreglo de expresiones, la eliminación de redundancias, etc. Entre las segundas se

podría encontrar la localización de registros, el uso de instrucciones propias de la máquina y el

reordenamiento de código.

En la actualidad, el proceso de la compilación ya está muy asentado. Un compilador es una herramienta bien

conocida, dividida en diversas fases. Algunas de estas fases se pueden generar automáticamente (analizador

léxico y sintáctico) y otras requieren una mayor atención por parte del escritor de compiladores (las partes de

traducción y generación de código).

Se están mejorando las diversas herramientas disponibles. También la aparición de nuevas generaciones de

lenguajes ha provocado la revisión y optimización de cada una de las fases del compilador. El último lenguaje

de programación de amplia aceptación que se ha diseñado, el lenguaje Java, establece que el compilador no

genera código para una máquina determinada sino para una virtual, la Java Virtual Machine (JVM), que

posteriormente será ejecutado por un intérprete, normalmente incluido en un navegador de Internet. El gran

objetivo de esta exigencia es conseguir la máxima portabilidad de los programas escritos y compilados en Java,

pues es únicamente la segunda fase del proceso la que depende de la máquina concreta en la que se ejecuta el

intérprete.

¿ Qué es un compilador ?

Un traductor es cualquier programa que toma como entrada un texto escrito en un lenguaje, llamado fuente y

da como salida otro texto en un lenguaje, denominado objeto.

En el caso de que el lenguaje fuente sea un lenguaje de programación de alto nivel y el objeto sea un lenguaje

de bajo nivel, a dicho traductor se le denomina compilador. Un ensamblador es un compilador cuyo lenguaje

fuente es el lenguaje ensamblador. Un intérprete no genera un programa equivalente, sino que toma una

sentencia del programa fuente en un lenguaje de alto nivel y la traduce al código equivalente y al mismo

tiempo lo ejecuta. Históricamente, con la escasez de memoria de los primeros ordenadores, se puso de moda

el uso de intérpretes frente a los compiladores, pues el programa fuente sin traducir y el intérprete juntos

daban una ocupación de memoria menor que la resultante de los compiladores. La mejor información sobre

los errores por parte del compilador así como una mayor velocidad de ejecución del código resultante hizo que

poco a poco se impusieran los compiladores.

Ventajas de compilar frente a interpretar

 Se compila una vez, se ejecuta n veces.

 En bucles, la compilación genera código equivalente al bucle, pero interpretándolo se traduce tantas

veces una línea como veces se repite el bucle.

 El compilador tiene una visión global del programa.

Ventajas del intérprete frente al compilador

 Un intérprete necesita menos memoria que un compilador.

 Permiten una mayor interactividad con el código en tiempo de desarrollo.

Un compilador no es un programa que funciona de manera aislada, sino que necesita de otros programas

para conseguir su objetivo: obtener un programa ejecutable a partir de un programa fuente en un lenguaje de

alto nivel. Algunos de esos programas son el preprocesador, el linker, el depurador y el ensamblador.

Clasificación de Compiladores

Para cada lenguaje de programación se requiere un compilador separado. El compilador traduce todo el

programa antes de ejecutarlo. Los compiladores son, pues, programas de traducción insertados en la memoria

por el sistema operativo para convertir programas de cómputo en pulsaciones electrónicas ejecutables

(lenguaje de máquina). Los compiladores pueden ser de:

 Una sola pasada.

 Pasadas múltiples.

 Optimación.

 Compiladores incrementales.

 Ensamblador.

 Compilador cruzado.

 Compilador con montador.

 Autocompilador.

 Metacompilador.

 Descompilador

COMPILADORES

 Un compilador es un programa que lee un programa escrito en 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.

Modelo de análisis y síntesis de la compilación

 En la compilación hay dos partes: análisis y síntesis. La parte del análisis divide al programa fuente en

sus elementos componentes y crea una representación intermedia del programa fuente. La parte de la

síntesis construye el programa objeto deseado a partir de la representación intermedia.

 Durante el análisis, se determinan las operaciones que implica el programa fuente y se registran en

una estructura jerárquica llamada árbol. A menudo, se usa una clase especial de árbol llamado árbol

sintáctico, donde cada nodo representa una operación y los hijos de un nodo son los argumentos de la

operación.

ANÁLISIS DEL PROGRAMA FUENTE

 El análisis consta de tres fases:

1. Análisis lineal: en el que la cadena de caracteres que constituye el programa fuente se lee de izquierda

a derecha y se agrupa en componentes léxicos, que son secuencias de caracteres que tienen un

significado colectivo.

2. Análisis jerárquico: en el que los caracteres o los componentes léxicos se agrupan jerárquicamente en

colecciones anidadas con un significado colectivo.

3. Análisis semántico: en el que se realizan ciertas revisiones para asegurar que los componentes de un

programa se ajustan de un modo significativo.

Análisis léxico

 En un compilador, el análisis lineal se llama análisis léxico o exploración. Por ejemplo, en el análisis

léxico los caracteres de la proposición de asignación

Posicion = inicial + velocidad * 60

se agruparía en los componentes léxicos siguientes:

1. El identificador posicion

2. El símbolo de asignación =

3. El identificador inicial

4. El signo de suma +

5. El identificador velocidad

6. El signo de multiplicación *

7. El número 60

Análisis sintáctico

 El análisis jerárquico se denomina análisis sintáctico. Este implica agrupar los componentes léxicos del

programa fuente en frases gramaticales que el compilador utiliza para sintetizar la salida. 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.

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)

De manera similar, muchos lenguajes definen recursivamente las proposiciones mediante reglas como:

1. Si identificador1 es un identificador y expresión2 es una expresión, entonces identificador1 =

expresión2 es una proposición.

2. Si expresión1 es una expresión y proposición2 es una proposición,

...

Descargar como (para miembros actualizados) txt (46 Kb)
Leer 25 páginas más »
Disponible sólo en Clubensayos.com