Procesadores de Lenguaje

Documentos relacionados
Tema 2 Introducción a la Programación en C.

LA MÁQUINA VIRTUAL JAVA (JVM). COMPILADOR E INTÉRPRETE. BYTECODE, CÓDIGO FUENTE Y CÓDIGO MÁQUINA. (CU00611B)

Técnicas de Programación

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Procesadores de Lenguaje

Qué es un programa informático?

Overview GeneXus - Demo: 2.Cómo obtener el ejecutable de la KB y declaración de algunas reglas del negocio.

ESTADÍSTICA CON EXCEL

Tema 2 Conceptos básicos de programación. Fundamentos de Informática

La lección de hoy es sobre resolver valores absolutos por Inecualidades. El cuál es la expectativa para el aprendizaje del estudiante SEI.2.A1.

Introducción a la programación

Lenguaje de programación. COMPILADORES Unidad I: Introducción al proceso de compilación

LABORATORIO Nº 6 SUMA DE DOS NUMEROS EN POWER BUILDER

Materia: Matemática de 5to Tema: Ecuación de la Recta. Marco Teórico

Comparativas de CPUs. Pablo Sanz Mercado.

Principios de Computadoras II

TEMA 3: El proceso de compilación, del código fuente al código máquina

Sistemas numéricos. Objetivos

FUNCIONAMIENTO DEL ORDENADOR

Lenguaje de Programación

COMUNICACIÓN ENTRE EL CLIENTE Y SERVIDOR SIN PHP Y CON PHP. INTÉRPRETE PHP Y GESTOR DE BASES DE DATOS (CU00804B)

Programación Avanzada

Unidad I: Organización del Computador. Ing. Marglorie Colina

2. Codificar de forma sistemática la secuencia de instrucciones en un lenguaje.

UNIDAD 6 PROGRAMACIÓN LINEAL ENTERA. de programación lineal entera. lineal entera.

1. Sistemas de ecuaciones lineales

Lección 1: Números reales

INICIACIÓN A LA PROGRAMACIÓN 1ª parte

TEST DE RAZONAMIENTO NUMÉRICO. Consejos generales

16 - Programando robots

Construcción de tablas de análisis sintáctico LL(1)

entonces las derivadas laterales existen y son iguales. y vale lo mismo. Si existen las derivadas laterales y son iguales, entonces existe f (a)

Java desde Consola Utilizando Java sin Path

Fundamentos de programación y Bases de Datos

DIAGRAMAS DE FLUJOS. Qué son Los Diagramas de Flujo y Para qué se Usan?

Aritmética de Enteros

Procesadores de Lenguaje

Análisis de Algoritmos

UNIDAD 2. Logaritmos DEFINICION DE LOGARITMO. Definiciones:

Circunferencia que pasa por tres puntos

Curso Completo de Electrónica Digital

Depr Version: 1.2. Modulo de Aval System + HP 50

Iván Ruiz Rube Departamento de Ingeniería Informática Escuela Superior de Ingeniería Universidad de Cádiz

Construyendo Programas más Complejos

Materia: Matemática de Octavo Tema: Conjunto Q (Números Racionales)

Minería de Datos. Árboles de Decisión. Fac. Ciencias Ing. Informática Otoño de Dept. Matesco, Universidad de Cantabria

Operadores lógicos y de comparación en programación. Not, and, or Ejemplos. (CU00132A)

EL LENGUAJE ALGEBRAICO

CALCULO DE NÚMEROS GRANDES UTILIZANDO UNA CALCULADORA DE BOLSILLO

Principios de Programación en Java

Unidad II: Análisis semántico

Bing (proveedor de busqueda) Bing es una herramienta de búsqueda que nos ayudará a encontrar lo que buscamos de forma rápida y sencilla.

3. Ecuaciones, parte I

Cómo resolver? Veremos dos métodos

INTRODUCCIÓN DEL TEMA 2 ESPACIOS VECTORIALES

Si recuerdas esto, será suficiente información para resolver este problema, que usa el triangulo derecho de 45, 45, 90, grados.

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

Retículos y Álgebras de Boole

matemáticas 4º ESO exponenciales y logaritmos

Guía número 1. Métodos numéricos. Universidad de san buenaventura de Cali

Lección 5: Ecuaciones con números naturales

Club GeoGebra Iberoamericano. 9 INECUACIONES 2ª Parte

Definición de Memoria

Guía práctica de estudio 06: Lenguaje binario

ENTORNO DE DESARROLLO Y COMPILACIÓN DE PELLES C

Probabilidad: Fórmulas y definiciones básicas. PROBABILIDAD Fórmulas y definiciones básicas

Introducción a Sistemas Operativos: Procesos

Métodos que devuelven valor Dado el siguiente triángulo rectángulo:

Tema V Generación de Código

FUNDAMENTOS DE INFORMÁTICA

1.1. Los números reales

Tema 2.- Formas Cuadráticas.

Diagramas de secuencia

Introducción a la Operación de Computadoras Personales

Materia: Matemática de Octavo Tema: Operaciones en Q Adición de fracciones con diferente denominador

Introducción a C Primera parte Sofía Vitale

Depurar programas

FASES DEL PROCESO TECNOLÓGICO

Algebra lineal y conjuntos convexos

Práctica 5 ANÁLISIS DE UNA MUESTRA INTERVALOS DE CONFIANZA CONTRASTE DE HIPÓTESIS

Programación Avanzada

Tema 6 Lenguaje Algebraico. Ecuaciones

TEMA 2. CONCEPTOS BÁSICOS DE ALGORÍTMICA

Pruebas de escritorio

Curso º ESO. UNIDADES 6 Y 7: EXPRESIONES ALGEBRAICAS Y ECUACIONES Departamento de Matemáticas IES Fray Bartolomé de las Casas de Morón

Una función arroja un valor (y sólo uno) por cada valor que se le introduce. En otras palabras, para cada valor de x, hay un solo valor de y.

INICIACIÓN A LA PROGRAMACIÓN I

Tema 5: Herramientas de programación y diseño modular

media = ( temp0 + temp1 + temp2 + temp3 + temp temp23 ) / 24; printf( "\nla temperatura media es %f\n", media );

5 Continuidad y derivabilidad de funciones reales de varias variables reales.

Lenguajes de Programacion

TEMA 4: SISTEMAS DE ECUACIONES LINEALES SISTEMA DE ECUACIONES LINEALES

Unidad I Introducción a la programación de Sistemas. M.C. Juan Carlos Olivares Rojas

Anexo. Control de errores

Solución: Utiliza la definición anterior, también llamada la "clave".

Tema: Entorno a C# y Estructuras Secuenciales.

Algoritmos y Lenguajes de Programación

3.- JUSTIFICACIÓN DE LA SOLUCIÓN ADOPTADA

Ejercicios Resueltos

Transcripción:

Procesadores de Lenguaje Bootstrapping de Compiladores y Diagramas en T Cristina Tîrnăucă Dept. Matesco, Universidad de Cantabria Fac. Ciencias Ing. Informática Primavera de 2012

Qué es un compilador? Compilador = un programa informático que traduce un programa escrito en un lenguaje de programación (high-level) a otro lenguaje de programación (lenguaje de máquina, low-level), generando un programa equivalente que la máquina será capaz de interpretar.

Notación (diagramas en T) Vamos a ver diferentes formas gráficas para representar: Compiladores que reciben un lenguaje A y lo transforman en un lenguaje B (están escritos en lenguaje K). Programas (están escritos en K). Máquinas (que ejecutan lenguaje K). Interpretes (traductor de A a B).

Problema I Nos inventamos un nuevo lenguaje de programación MiJava y tenemos que escribir nosotros el compilador. Soluciones al problema: Escribimos el compilador en MiJava (?). Escribimos el compilador en un lenguaje de programación que ya está disponible en la máquina donde vamos a utilizar el compilador (?).

Problema II Se inventa un nuevo tipo de procesador BetterThanPentium, con su propio lenguaje nativo para el que no existen compiladores de Pascal (por ejemplo). Soluciones al problema: Llamar al que hizo ese procesador. Escribir un compilador, desde cero, de Pascal en el lenguaje de máquina BetterThanPentium. Hacer un pequeño traductor de otro lenguaje máquina (por ejemplo, Pentium) a BetterThanPentium.

Dos problemas, una solución: Bootstrapping Fuente: http://www.nationalview.org/thumbnails.htm

Qué fue primero: el huevo o la gallina? La idea del bootstrapping es simple: escribes el compilador del lenguaje A al lenguaje B en A, y luego dejas el compilador compilarse a sí mismo. El resultado es un compilador de A a B escrito en B. Puede sonar un poco paradójico que el compilador se compile a sí mismo. En breve veremos cómo se resuelve esta aparente paradoja.

Ventajas del bootstrapping es un test no trivial para el lenguaje que está siendo compilado; los desarrolladores del compilador sólo necesitan saber el lenguaje de programación que está siendo compilado; se trata de una comprobación de coherencia global, ya que debe ser capaz de reproducir su propio código objeto.

Compilando compiladores (half bootstrapping) Volvamos otra vez al problema II. Supongamos que tenemos: una máquina Pentium (que ejecuta lenguaje nativo Pentium) una máquina BetterThanPentium (que ejecuta lenguaje nativo BetterThanPentium) un compilador que transforma Pascal en código nativo Pentium y que está escrito en Pentium. Queremos hacer un compilador de Pascal a BetterThanPentium escrito en BetterThanPentium.

Solución ineficiente Hacemos un traductor binario de código Pentium a código BetterThanPentium que se ejecute en Pentium, y lo utilizamos para traducir nuestro compilador. Problemas que surgen: Genera código Pentium. Lo resolvemos utilizando nuestro traductor. Ahora tenemos que hacer dos operaciones: compilar nuestro programa escrito en Pascal a código Pentium, y traducir el resultado de Pentium a BetterThanPentium. Seguramente se pierda eficiencia. Pero lo más gordo de todo, todavía necesitamos la máquina Pentium para traducir de Pentium a BetterThanPentium.

Una solución mejor Empezamos escribiendo un compilador de Pascal a BetterThanPentium en Pascal. Después lo compilamos con nuestro compilador de Pascal a Pentium (en nuestra máquina Pentium). El resultado es un compilador de Pascal a BetterThanPentium escrito en código nativo Pentium. Ahora podemos ejecutar este último compilador en la máquina Pentium, dejándole compilarse a sí mismo. Hemos obtenido el compilador deseado.

Compilando compiladores (full bootstrapping) Lo anterior se basa en que tenemos un compilador del lenguaje deseado en una máquina diferente. Pero que pasa si diseñamos un lenguaje desde cero? Tres maneras distintas: escribiendo un compilador QAD (quick and dirty) en un lenguaje de programación existente utilizando un interprete QAD bootstrapping incremental

El compilador QAD Dado un nuevo lenguaje de programación MiJava, vamos a utilizar uno ya conocido (por ejemplo, Java) para construir un compilador para MiJava que se ejecute en nuestra máquina (vamos a suponer que tenemos un Pentium). Empezamos construyendo un compilador muy sencillo, de MiJava a Java, escrito en Java. Lo compilamos para obtener un ejecutable (hemos obtenido lo que se llama el compilador QAD). Escribimos otro compilador, de MiJava a Pentium (esta vez en MiJava) y lo compilamos con el QAD. El resultado es un programa en Java, que vamos a compilar, obteniendo un compilador que hace lo que queremos (pero puede ser demasiado lento)

El interprete QAD Empezamos escribiendo un traductor de MiJava a Java y lo compilamos. Obtenemos un traductor de MiJava a Pentium. Como en el caso anterior, escribimos un compilador de MiJava a Pentium en MiJava y lo dejamos compilarse a sí mismo (vamos a necesitar el traductor de MiJava a Pentium).

Bootstrapping incremental Empezamos escribiendo un compilador para un pequeno subconjunto del lenguaje, utilizando sólo este subconjunto para escribirlo. Bootstraping (con uno de los métodos anteriores) para compilar este compilador. Aumentamos un poco el subconjunto, y añadimos al primer compilador más funcionalidad, sin utilizar las nuevas características. Lo compilamos con el compilador obtenido en el paso anterior. Repetimos el proceso.