Bootstrapping

26
BOOTSTRAPPING PUCESI ESCUELA DE INGENIERIA EN SISTEMAS COMPILADORES 5º NIVEL INGENIERIA PUCESI

description

Bootstraping. Compilador Fortran H. Compilador de Pascal. Autocompilador.Estructura general de un traductor Fases de un compilador.

Transcript of Bootstrapping

Page 1: Bootstrapping

BOOTSTRAPPINGPUCESI

ESCUELA DE INGENIERIA EN SISTEMAS

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Page 2: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

El bootstrapping (literalmente "truco o trampa de arranque"1) se basa en utilizar las facilidades que ofrece un lenguaje para compilarse a sí mismo. El bootstrapping puede plantear la cuestión: ¿Qué fue primero, el huevo o la gallina?Una forma de bootstrapping es construir el compilador de un lenguaje a partir de un subconjunto de dicho lenguaje. Supóngase que un nuevo lenguaje L se va a implementar en una máquina M. Como primer paso se puede escribir un pequeño compilador que traduce un subconjunto S de L a un lenguaje objeto que es el código de la máquina M; es decir un compilador SMM. Entonces se puede usar el subconjunto S para escribir un compilador LSM para L. Cuando LSM se ejecuta a través de SMM, se obtiene una implementación de L, que es LMM. El lenguaje Neliac (un derivado del Algol) fue uno de los primeros lenguajes que se implementó a partir de su propio lenguaje.

BOOTSTRAPPING

Page 3: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

El lenguaje Pascal fue implementado por primera vez por Niklaus Wirth (1971) por medio de un compilador escrito en un subconjunto del Pascal (más del 60%). También escribió un compilador de este subconjunto en un lenguaje de bajo nivel, y por medio de varios booststrapping logró construir un compilador para el Pascal completo. Los métodos utilizados para realizar el booststrapping de los compiladores de Pascal se describen por Lecarme y Peyrolle-Thomas.Las mayores ventajas del bootstrapping se producen cuando un compilador se escribe en el lenguaje que se compila. Supóngase que escribimos un un compilador LLN, para un lenguaje L, escrito en L para una máquina N. Pero las tareas de desarrollo se llevan a cabo en otra máquina M, donde existe un compilador LMM. En un primer paso se obtiene un compilador cruzado LMN, que se ejecuta sobre M y produce el código para N:

BOOTSTRAPPING

Page 4: Bootstrapping

El compilador LLN puede compilarse por segunda vez, pero ahora usando el generado por el compilador cruzado:

BOOTSTRAPPING

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Page 5: Bootstrapping

El resultado de la segunda compilación es un compilador LNN que se ejecuta en una máquina N, y produce un código para N. Sin embargo el compilador está construido en una máquina M (véase ejemplo 4.1). El proceso se muestra en la siguiente figura:

BOOTSTRAPPING

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Page 6: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Utilizando las técnicas del bootstrapping, un compilador puede optimizarse a sí mismo. Supongamos todo el desarrollo en una máquina dada M. Tenemos SSM, un buen compilador optimizado para el lenguaje S escrito en S, y queremos SMM, un buen compilador optimizado escrito en M.Se puede construir SM*M*, un compilador poco optimizado de S en M, que no sólo genera mal código, sino que además es lento. (M* indica una mala implementación en M. SM*M* es una implementación peor del compilador que genera peor código). Sin embargo, se puede usar este compilador no optimizado, para obtener un buen compilador de S en dos pasos:

BOOTSTRAPPING

Page 7: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Ejemplo 5.1: Compilador de FORTRAN H

La técnica de bootstrapping se ha utilizado para el desarrollo del compilador FORTRAN H. El compilador se escribió en FORTRAN. El primer paso fue convertir la ejecución sobre un IBM 7094 a un System/360, una tarea dura. El segundo paso fue optimizarse, pasar de un tamaño de alrededor de 550K a unos 400K bytes.

BOOTSTRAPPING

Page 8: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Ejemplo 5.2: Compilador de PascalAmmann describe como se desarrolló el compilador de Pascal, dividiendo la tarea en varias fases:

a) Se eligió un subconjunto básico de Pascal, y se programó en SCALLOP (lenguaje de nivel medio de los ordenadores CDC). Este primer conjunto se denominó Pascal sin revisar PSR. Por medio de un bootstrapping se consiguió un compilador PSR60006000*, denotando por 6000, el código de las serie CDC 6000, y por 6000* el código no óptimo.

BOOTSTRAPPING

Page 9: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

b) Se programó un nuevo compilador de Pascal revisado P, utilizando el Pascal sin revisar, PPSR6000. c) Se compila el compilador obtenido en b) con el obtenido en a), y se obtiene P6000*6000

d) Se vuelve a programar un compilador de Pascal revisado, pero esta vez en Pascal revisado, PP6000.

BOOTSTRAPPING

Page 10: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

e) Se compila el compilador d) con el obtenido en c) y se obtiene por fin P60006000.

BOOTSTRAPPING

Page 11: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Un autocompilador de un lenguaje es un compilador que puede compilarse a sí mismo. Es decir el lenguaje fuente y el lenguaje de implementación es el mismo, y el compilador es capaza de compilar el programa fuente del propio compilador. No debe confundirse autocompilación con bootstrapping, la autocompilación puede ser el resultado final de un bootstrapping, pero también puede llegarse a ella utilizando otro compilador del mismo lenguaje.Hendrix relata como construir un autocompilador de Small C (un subconjunto del lenguaje C). El libro incluye un disquete con todos los fuentes y un compilador de Small C.Otro ejemplo de autocompilador es el Ccc32, compilador de C concurrente para Windows

AUTOCOMPILADOR

Page 12: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Un traductor es un programa que tiene como entrada un texto escrito en un lenguaje (lenguaje fuente) y como salida produce un texto escrito en un lenguaje (lenguaje objeto) que preserva el significado de origen. Ejemplos de traductores son los ensambladores y los compiladores.

ESTRUCTURA GENERAL DE UN TRADUCTOR

Page 13: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

En el proceso de traducción se identifican dos fases principales:

ESTRUCTURA GENERAL DE UN TRADUCTOR

Page 14: Bootstrapping

Fase de análisis

ESTRUCTURA GENERAL DE UN TRADUCTOR

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Page 15: Bootstrapping

Fase de Síntesis

ESTRUCTURA GENERAL DE UN TRADUCTOR

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Page 16: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Algunos ejemplos de traductores son los compiladores (toma como entrada código en alto nivel y genera como salida código en bajo nivel), los interpretes (toma como entrada código en alto nivel y genera como salida un código intermedio), los preprocesadores (toma como entrada código en alto nivel y genera como salida código en alto nivel) y el ensamblador (toma como entrada código en ensamblador y genera como salida código en bajo nivel). Su estructura podría ser expresada de la siguiente manera:

código fuente -→>> traductor -→> código objeto

ESTRUCTURA GENERAL DE UN TRADUCTOR

Page 17: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

El programa ensamblador es el programa que realiza la traducción de un programa escrito en ensamblador a lenguaje máquina. Esta traducción es directa e inmediata, ya que las instrucciones en ensamblador no son más que nemotécnicos de las instrucciones máquina que ejecuta directamente la CPU.

Tipos de ensambladores

Podemos distinguir entre tres tipos de ensambladores:

ENSAMBLADORES

Page 18: Bootstrapping

Ensambladores básicos. Son de muy bajo nivel, y su tarea consiste básicamente en ofrecer nombres simbólicos a las distintas instrucciones. Ensambladores modulares, o macro ensambladores.

Descendientes de los ensambladores básicos. Hacen todo lo que puede hacer un ensamblador, y además proporcionan una serie de directivas para definir e invocar macroinstrucciones.

Ensambladores modulares 32-bits o de alto nivel. Son ensambladores que aparecieron como respuesta a una nueva arquitectura de procesadores de 32 bits, realizan la misma tarea que los anteriores, permitiendo también el uso de macros, permiten utilizar estructuras de programación más complejas propias de los lenguajes de alto nivel.

ENSAMBLADORES

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Page 19: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Un compilador es un programa informático

que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, es decir programa que permite traducir el código fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (lenguaje máquina). Generando un programa equivalente a capaz de interpretar.

FASES DE UN COMPILADOR

Page 20: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Estructura de un Compilador

FASES DE UN COMPILADOR

Page 21: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Cualquier compilador debe realizar dos tareas

principales: análisis del programa a compilar y síntesis de un programa en lenguaje maquina. Para el estudio de un compilador, es necesario dividir su trabajo en fases. Cada fase representa una transformación al código fuente para obtener el código objeto. En cada una de las fases se utiliza un administrador de la tabla de símbolos y un manejador de errores.

FASES DE UN COMPILADOR

Page 22: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Componentes en que se divide un compilador:

Análisis Léxico. En esta fase se lee los caracteres del programa fuente y se agrupan en cadenas que representan los componentes léxicos. A la secuencia de caracteres que representa un componente léxico se le llama lexema (o con su nombre en inglés token).

Análisis Sintáctico. Los componentes léxicos se agrupan en frases gramaticales que el compilador utiliza para sintetizar la salida.

Análisis Semántico. Intenta detectar instrucciones que tengan la estructura sintáctica correcta, pero que no tengan significado para la operación implicada.

FASES DE UN COMPILADOR

Page 23: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Generación de código Intermedio. Se puede considerar esta operación intermedia como un subprograma para una máquina abstracta, a esta representación debe tener dos propiedades importantes: debe ser fácil de producir y fácil de traducir al programa objeto.

Optimización de Código. Se trata de mejorar el código intermedio, de modo que resulte un código de máquina más rápido de ejecutar.

Generación de Código. Esta constituye la fase final de un compilador.Administrador de la tabla de símbolos. Se encarga de manejar los accesos a la tabla de símbolos, en cada una de las etapas de compilación de un programa.

Manejador de errores. Es posible encontrar errores. De esta forma podrán controlarse más eficientemente los errores encontrados en cada una de las fases de la compilación de un programa.

FASES DE UN COMPILADOR

Page 24: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Los intérpretes realizan normalmente dos operaciones: Traducen el código fuente a un formato interno. Ejecutan o interpretan el programa traducido al formato interno.

La primera parte del intérprete se llama a veces "el compilador", aunque el código interno que genera no es el lenguaje de la máquina, ni siquiera lenguaje simbólico, ni tampoco un lenguaje de alto nivel.

INTERPRETES

Page 25: Bootstrapping

COMPILADORES 5º NIVEL INGENIERIA PUCESI

Estructura del Intérprete

INTERPRETES

Page 26: Bootstrapping

Particularidades de la interpretación:Ahorra memoria.Produce un resultado que no se puede almacenar, lo cual hace la ejecución lenta.No demasiado eficiente, cada vez que se entre en un bucle se analizaran sus sentencias.Facilita el proceso de depuración.No produce resultados transportables.

La interpretación es útil en: Sistemas interactivos. Programas de pequeña envergadura. Programas de prototipo y de enseñanza.

INTERPRETES

COMPILADORES 5º NIVEL INGENIERIA PUCESI