Compiladores. Guía 12 1 Facultad: Ingeniería Escuela: Computación Asignatura: Compiladores Tema: Traductor ENSAMPOCO a ASM 8086 Contenido En esta práctica se desarrollará un traductor de lenguaje ENSAMPOCO/3 a lenguaje Ensamblador 8086 para completar el desarrollo de un compilador. Objetivos Específicos Reconocer las partes de un traductor y desarrollar un ejemplo de aplicación. Material y Equipo Guía de Laboratorio Nº 12. Computadora con DevC++ Set de instrucciones Ensamblador 8086 Traductor ENSAMPOCO/0: traducto.h Introducción Teórica Traductores Guía 3 Un traductor es un programa que procesa un texto fuente y genera un texto objeto. El traductor está escrito en un lenguaje Guía 4 de implementación (LI) o también denominado lenguaje host. fía texto fuente está escrito en lenguaje fuente (LF), por El ejemplo un lenguaje de alto nivel. El texto objeto está escrito en lenguaje objeto (LO), por ejemplo un lenguaje máquina, ensamblador u otro lenguaje de alto nivel. Se suele utilizar la notación en T, tal como se muestra en la figura. La notación en T también se puede representar de una forma abreviada como: LFLILO. 2 Compiladores. Guía 12 El lenguaje fuente (LF) es el lenguaje origen que transforma el traductor (por ejemplo C, C++, Pascal, FORTRAN,PL/I, COBOL, ADA, MODULA-2, BASIC, C). También pueden ser lenguajes de bajo nivel. El lenguaje objeto (LO) es el lenguaje al que se traduce el texto fuente. Los lenguajes objeto pueden ser por ejemplo otro lenguaje de alto nivel, el lenguaje máquina de un microprocesador determinado, un lenguaje ensamblador,... El lenguaje de implementación (LI) o lenguaje host es el lenguaje en que está escrito el traductor. Puede ser cualquier lenguaje, desde un lenguaje de alto nivel a un lenguaje máquina. Existen modelos de traductores que separan al traductor en distintos módulos, dando una idea de secuencialidad, sin embargo en muchos casos estos módulos se ejecutan simultáneamente. Hay interacciones entre el analizador léxico y el analizador sintáctico. La primera posibilidad es que el analizador léxico genere un token para que sea procesado por el analizador sintáctico. Una vez que el analizador sintáctico lo ha procesado pedirá al analizador léxico el siguiente token, o en el caso de que no lo necesite se lo devuelva, repitiéndose este proceso durante el análisis del lenguaje fuente. Otra posibilidad es que el analizador léxico genere todos los tokens del programa fuente de una pasada, y los almacene en memoria o en un disco para que sean procesados posteriormente por el analizador sintáctico. En este caso esta parte del traductor se dice que es de paso separado (separate pass). Algunos traductores realizan todo el proceso en un solo paso (traductores de un paso), mientras que otros realizan hastamásde30pasos (por ejemplo los primeros compiladores de Compiladores. Guía 12 3 PL/I de IBM). Los factores que influyen en el número de pasos de un compilador son los siguientes: 1. Complejidad del lenguaje fuente. 2. Distancia entre el lenguaje fuente y el lenguaje objeto. 3. Memoria mínima necesaria para compilar. 4. Velocidad y tamaño del compilador. 5. Velocidad y tamaño del programa objeto. 6. Necesidades de depuración (debugging). 7. Técnicas de detección y reconocimiento de errores. 8. Número de personas y tiempo disponible para realizar el traductor. La complejidad del lenguaje fuente también puede implicar que el compilador necesite realizar varias pasadas al lenguaje fuente para realizar el análisis del programa fuente, es decir es necesario leer varias veces el lenguaje fuente para obtener toda la información necesaria para la fase de análisis. Así por ejemplo la complejidad del lenguaje Eiffel obliga a sus compiladores a dar varias pasadas a los ficheros fuente [LEIV93]. Los compiladores orientados a educación de estudiantes de lenguajes de programación son compiladores de un paso. La optimización de código que se realiza en ellos es muy pequeña o no se hace, ya que la mayoría de los programas se compilarán muchas veces hasta que se pongan a punto. Ejecutándose una vez y descargándose. Las fases de análisis y generación de código se realizan a la vez. La parte más importante de este tipo de compiladores es la detección y reconocimiento de errores. Por ejemplo los compiladores Turbo Pascal y Turbo C de Borland. Los compiladores profesionales, en general no suelen de ser de un paso, sino que son de varios pasos. Se suele cuidar mucho la fase de optimización de código. Normalmente los fabricantes de compiladores comerciales suelen tener varias gamas de compiladores según el usuario al que vayan destinados. Así las Borland busquen código. gamas de compiladores Quick de Microsoft o Turbo de van destinadas a estudiantes o a profesionales que la velocidad de compilación sobre la optimización de Para profesionales que deseen una mejor calidad de 4 Compiladores. Guía 12 código objeto, perdiendo velocidad de compilación, estos mismos fabricantes ofrecen las gamas Professional y Borland respectivamente. Los traductores de un paso y de una pasada única al lenguaje fuente son los más rápidos. Así los diseñadores de traductores eligen este esquema cuando la complejidad del lenguaje lo permite construirlos. En este caso el esquema habitual de los traductores está dirigido por el analizador sintáctico, que constituye el centro del proceso de traducción o módulo principal, y el resto de los módulos cooperan a su alrededor. Procedimiento Revise la clase traducto.h proporcionada en los recursos, la Guíaes3 un traductor de ENSAMPOCO/0 a ASM 8086. Implemente cual con ella el traductor correspondiente. Guía 4 fía Compiladores. Guía 12 5 Análisis de resultados Explique cómo funciona el traductor mostrado, comente el código e identifique sus partes. Analice y responda, cuáles son las principales diferencias entre un traductor, un intérprete y un compilador; cómo se interrelacionan entre ellos para ejecutar un programa en un lenguaje específico. Pruebe el programa traduciendo el siguiente código: Ensampoco0.poc .CODE INPUT a INPUT b PUSHA c PUSHA a LOAD PUSHA b LOAD ADD STORE PUSHA d PUSHA a LOAD PUSHA b LOAD NEG ADD STORE PUSHA c PUSHA a LOAD PUSHA b LOAD MUL STORE OUTPUT c OUTPUT d END Investigación complementaria Desarrolle un traductor para ENSAMPOCO/3 en base al código de recursos de esta práctica y los resultados de la generación de código de la guía 9. Utilice las instrucciones de lenguaje ensamblador 8086 de los recursos de esta práctica. 6 Compiladores. Guía 12 Muestre evidencias del resultado para el siguiente programa. Ensampoco3.poc .DATA INT a INT b FLOAT c FLOAT d .CODE IINPUT a IINPUT b FPUSHA c IPUSHA a ILOAD IPUSHA b ILOAD IADD ITOF FSTORE FPUSHA d IPUSHA a ILOAD IPUSHA b ILOAD INEG IADD ITOF FSTORE FOUTPUT c FOUTPUT d END Bibliografía Cueva, J. lenguaje. (1998). Conceptos Universidad básicos de de procesadores de Oviedo, España. Compiladores. Guía 12 7 Hoja de cotejo: Guía 11: Traductor de Ensampoco a ASM 8086 Tema: Presentación del programa Alumno : Docente: 12 1 Máquina No: Máquina No: Máquina No: GL: Alumno: Docente: GL: Docente: GL: Fecha: a EVALUACION % CONOCIMIENTO Del 20 al 30% APLICACIÓN DEL CONOCIMIENTO Del 40% al 60% 1-4 5-7 8-10 Conocimie nto deficient e de los fundament os teóricos Conocimiento y explicación incompleta de los fundamentos teóricos Conocimiento completo y explicación clara de los fundamentos teóricos No tiene actitud proactiva . Actitud propositiva y con propuestas no aplicables al contenido de la guía. Tiene actitud proactiva y sus propuestas son concretas. ACTITUD Del 15% al 30% TOTAL 100% Nota