Tema 7. Generación de código

Documentos relacionados
Procesadores de lenguaje Tema 7 Generación de código intermedio

Generación de Código Intermedio

Un. VI. Generador de código intermedio.

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Unidad II: Análisis semántico

GENERACIÓN DE CÓDIGO

GENERACIÓN DE CÓDIGO INTERMEDIO ÁRBOLES DE SINTAXIS ABSTRACTA (ASA)

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

JavaScript Básico. Elementos Básicos: Comentarios: Literales: Valores que puede tomar una variable o una constante.

Lección 2 Introducción al lenguaje C

Java. Introducción a la Programación Orientada a Objetos

Procesadores de lenguaje Tema 8 Generación de código y optimización

Compiladores: Generación de Código Intermedio

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

INTRODUCCIÓN AL ANÁLISIS ASCENDENTE. V id asig num. La siguiente figura muestra la tabla de análisis SLR de la gramática anterior:

Tema 05: Elementos de un programa en C

Compiladores e intérpretes Introducción

Construyendo Programas más Complejos

4. Operadores Operador asignación

ÍNDICE UNIDAD 2: GENERACION DE CODIGO INTERMEDIO

Introducción a PL/SQL

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Diseño de Compiladores I. Estructura General de un Compilador

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;)

Código Intermedio. Compiladores II 1

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.

Informática. JavaScript: Lenguaje de programación. Fco J. Martín Mateos Carmen Graciani

Compiladores: Introducción

ANÁLISIS DESCENDENTE. Compruébese que la siguiente gramática es LL(1) sin modificarla.

COMPILADORES E INTERPRETES

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 2. Lenguaje de programación y ejecución de un programa

LENGUAJE. Tema 2 Elementos de un programa

Tema 2. El lenguaje JAVA

Programación Estructurada

Tema 5. Análisis semántico

ÍNDICE CAPÍTULO 1 FUNDAMENTOS DE LOS MICROCONTROLADORES

Unidad V Análisis Semántico. M.C. Juan Carlos Olivares Rojas

Características de JavaScript

Escuela Normal Superior N 40 Mariano Moreno. Cuadernillo Propedéutico 2017 Nivel Superior

Java para programadores

REFERENCIA DEL LENGUAJE

PHP: Lenguaje de programación

Diseño de compiladores. Organización de memoria. Organización de memoria. Organización de memoria. Zona de código 04/05/2014 ORGANIZACIÓN DE MEMORIA

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples

Examen de Procesadores de Lenguaje

Procesadores de Lenguaje

Estatutos de Control C# Estatutos de Decisión (Selección)

Curso de Java Introducción a la Programación II

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Introducción a la. Programación con

Introducción al lenguaje C

Java para no Programadores

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO

Java para no Programadores

Operadores aritméticos. / División operando enteros o reales si operandos son entero resultado es entero. Resto de caso resultado real

Compiladores: Generación de Código. Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. María Constanza Pabón

El lenguaje C. 1. Identificadores, constantes y variables

3.3 Conceptos Básicos del Lenguaje Java

Introduccion a la Programacion. Pablo Sevilla Jarquin

Elementos de un programa en C

Operadores aritméticos

Es toda la información que utiliza el computador. Según sea la información que guardemos en los datos, se clasifican en los siguientes tipos:

Programcaión Básica. Secuencias de Control y Repetición. Arturo Vega González.

2. Se puede aplicar a la representación intermedia un optimizador de código independiente de la máquina.

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO

Análisis semántico. Análisis semántico. Índice (I)

Introducción a Java. Introducción a Java. Programación I

PROCESADORES DE LENGUAJE EXAMEN FINAL 8-JUNIO-07

Análisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas

1.1 Tipos de Datos Primitivos. 1.2 Tipos de datos estructurados. 1.3 Definición de estructura de datos

Estructuras de Datos Declaraciones Tipos de Datos

Descripción de un Programa

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

Una expresión es una combinación de uno o más operandos y operadores para obtener un resultado.

Árboles de Decisión Árboles de Sintaxis

Introducción a Python. Cecilia Manzino

Tema 3: Lenguaje ensamblador. La primera abstracción de la máquina para el programador

Compiladores: Análisis Semántico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inès Alvarez V.

Introducción a C# y la plataforma.net

Comprender las diferencias entre tipos de datos primitivos similares, y aprender a elegir el tipo más conveniente en cada caso.

Curso de Programación Avanzada en C

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

Traductores del lenguaje Pau Arlandis, Andrés Orcajo, Guillermo Ramos, Álvaro J. Aragoneses.

C1 INTRODUCCIÓN AL LENGUAJE C. Fundamentos de Informática Departamento de Ingeniería de Sistemas y Automática. EII. Universidad de Valladolid

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

Lenguaje de programación C. Introducción

GLOSARIO 1. Qué es bit y byte? Bit: Es la unidad mínima de información. Puede ser 0 o 1. Byte: Es el conjunto de 8 bits. Ejemplo:

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Transcripción:

Departamento de Tecnologías de la Información Tema 7 Generación de código Ciencias de la Computación e Inteligencia Artificial

Índice 7.1 Visión general 7.2 Código de tres direcciones 2

Índice 7.1 Visión general 7.2 Código de tres direcciones 3

7.1 Visión general La arquitectura front-end/back-end El objetivo final de un compilador es traducir el código fuente a código máquina (o ensamblador) de la plataforma de destino. Muchos compiladores presentan una arquitectura dividida en dos partes: front-end y back-end. El front-end realiza una traducción de código fuente a código intermedio. El back-end realiza una traducción de código intermedio a código máquina. Esta división permite generar familias de compiladores que comparten el front-end. 4

7.1 Visión general Características del código intermedio Sus instrucciones corresponden básicamente a las instrucciones generales de los procesadores. Es independiente de la máquina (hasta cierto punto). No tiene en cuenta características como la arquitectura del procesador, el número de registros del procesador o la funcionalidad de estos registros. Aunque se pueda expresar en modo texto, el código intermedio se almacena en memoria en forma de árbol (ASA). El modo texto se utiliza para depurar el compilador. 5

7.1 Visión general Otras opciones Lenguajes pseudointerpretados (Java). El compilador genera un código binario de una máquina virtual. Este código es interpretado en tiempo de ejecución. Traductores fuente-fuente. La idea es traducir un código fuente a un lenguaje de alto nivel diferente (generalmente C) para el que ya exista un compilador eficiente. Esta solución se aplica comúnmente para lenguajes declarativos (Prolog, Haskell) o para producir código para microprocesadores que se distribuyan con un compilador de C. 6

Índice 7.1 Visión general 7.2 Código de tres direcciones 7

7.2 Código de tres direcciones Características generales Se suele tomar como código intermedio. Está formado por instrucciones con un máximo de tres direcciones: operando1, operando2 y resultado. Las instrucciones se representan por cuartetos: (operador, operando1, operando2, resultado). No todas las direcciones deben estar ocupadas. Existen instrucciones con menos direcciones. Las instrucciones son muy parecidas a las de cualquier ensamblador: sumas, restas, multiplicaciones, saltos condicionales, saltos incondicionales,... 8

7.2 Código de tres direcciones Características generales Las direcciones de memoria se gestionan de manera simbólica, es decir, no se asigna un valor numérico a estas direcciones. No se trata de ningún estándar. Cada familia de compiladores define su propia representación intermedia. Al diseñar un compilador hay total libertad a la hora de definir las instrucciones del código intermedio. Por ejemplo, la familia de compiladores gcc utiliza el código intermedio RTL (Register Transfer Language). Los front-end de C y C++ definen además otras representaciones previas llamadas GENERIC y GIMPLE que facilitan la optimización. 9

7.2 Código de tres direcciones Instrucciones típicas Instrucciones básicas: x := y op z (operación binaria aritmética o lógica) x := op y (operación unaria aritmética o lógica) x := y (asignación simple) goto etiqueta (salto incondicional) if x oprelacional y goto etiqueta (salto condicional) Instrucciones de asignación con índice x[i] := y x := y[i] 10

7.2 Código de tres direcciones Instrucciones típicas Instrucciones de asignación con punteros x := &y x := *y *x := y Instrucciones de llamadas a funciones: param x (almacena el parámetro en la pila) pop x (saca el valor de la pila y lo almacena en x) call etiqueta, n (llama a la función que comienza en la etiqueta tomando n parámetros de la pila) return y (devuelve el valor y) 11

Índice 7.1 Visión general 7.2 Código de tres direcciones 12

Características generales Las instrucciones que aparecen en el código fuente suelen ser las siguientes: Declaraciones de variables Asignaciones Bucles (while, do-while, for) Instrucciones condicionales (if-then, if-then-else, switch-case) Saltos (return, break, continue) Bloques de instrucciones Estas instrucciones hacen uso de las siguientes construcciones: Expresiones aritméticas Condiciones Llamadas a funciones 13

Declaraciones Las declaraciones de variables no generan código. La declaración de una variable debe crear una entrada en la tabla de símbolos. Esta información incluye el identificador de la variable, el tipo de dato (que permite calcular su tamaño) y su posición de memoria (desplazamiento respecto a una posición conocida) El compilador debe mantener un contador para asignar el desplazamiento de forma consecutiva. Las variables declaradas en distintos niveles de anidamiento se tratan como variables locales normales a la hora de asignarles memoria. El analizador semántico debe garantizar que no se acceda a estas variables en un ámbito diferente. 14

Expresiones La sintaxis de las expresiones en el lenguaje fuente es de la siguiente forma: Expresión Expresión sum Término Término Término Término prod Factor Factor Factor literal id lpar Expresión rpar Las expresiones se almacenan en forma de árbol dentro del ASA. El código asociado a una expresión está formado por una lista de instrucciones en código intermedio que permite evaluar la expresión. El resultado de la expresión se almacena en una variable (temp). 15

Expresiones Para generar el código asociado a la expresión se utiliza una función que genere variables temporales ( getnewtemp() ). Código asociado a una constante: (A) Lista de instrucciones vacía. La variable temp es el valor de la constante. (B) Instrucción de asignación de la constante a una nueva variable temporal. Código asociado a una variable: Lista de instrucciones vacía. La variable temp es la variable referenciada. Código asociado a una operación unaria: Código de operando Se genera el código del operando Se crea una nueva variable temporal temp. temp = op temp1 Se añade la instrucción de asignación temp = operador operando.temp. (temp1) 16

Expresiones Código asociado a una operación binaria: Se genera el código de los operandos Se crea una nueva variable temporal temp. Se añade la instrucción de asignación temp = operando1.temp op operando2.temp Código de operando1 Código de operando2 temp = temp1 op temp2 (temp1) (temp2) Ejemplo: a 3 * (b + c) - a * 3 b tmp0 = 3 tmp1 = b + c + tmp2 = tmp0 * tmp1 tmp3 = a - tmp2 c 17

Condiciones Son expresiones booleanas que aparecen en los bucles e instrucciones condicionales. El código asociado debe generar un salto a dos posibles etiquetas: label_true, para el caso verdadero label_false, para el caso falso El código generado no escribe las etiquetas, sino que contiene saltos (condicionales o incondicionales) a esas etiquetas. Las condiciones se pueden representar de forma aritmética o por medio de saltos. 18

Condiciones Representación aritmética: Números: (falso = 0, verdadero!=0), (falso<=0, verdadero>0) Las condiciones se transforman en expresiones aritméticas: c = a & b ; c=0 si a=0 ó b=0, c=1 si a!= 0 y b!=0 c = a b ; c=0 si a=0 y b=0, c=1 si a!=0 ó b!=0 c = x > y ; c=0 si x<=y, c=1 si x>y El código se genera de forma idéntica al de las expresiones. Al final del código de la expresión se añaden los saltos a las etiquetas. 19

Condiciones Ejemplo: (x>y && m<=j) x==y x > && == x <= y m j y tmp0 = x>y tmp1 = m<=j tmp2 = tmp0 & tmp1 tmp3 = x==y tmp4 = tmp2 tmp3 if tmp4!= 0 goto label_true goto label_false 20

Condiciones Representación con saltos (en cortocircuito) Las expresiones booleanas se basan en saltos condicionales Permite no evaluar la parte innecesaria de la condición (cortocircuito) Comparaciones aritméticas (c = x > y) if x>y goto label_true goto label_false Operaciones lógicas ( c = a & b) (c = a b) if a!=0 goto Etiqueta0 goto label_false Etiqueta0: if b!=0 goto label_true goto label_false if a!=0 goto label_true goto Etiqueta0 Etiqueta0: if b!=0 goto label_true goto label_false 21

9.3 Código asociado a las Condiciones Ejemplo: (x>y && m<=j) x==y if x>y goto Etiqueta0 goto Etiqueta1 && == Etiqueta0: > <= x y if m<=j goto label_true goto Etiqueta1 x y m j Etiqueta1: if x==y goto label_true goto label_false 22

Asignaciones La sintaxis de la instrucción de asignación en el lenguaje fuente es: InstAsig id asig Expresión pyc Código asociado a una instrucción de asignación: generando el código de la expresión generar una instrucción id = Expr.temp Código de la expresión (temp) id = temp 23

Instrucción if-then La sintaxis de la instrucción if-then en el lenguaje fuente es: InstIf if Condición then Instrucción La estructura del código generado es Código de la condición label_true label_false Cond.label_true: Código de la instrucción Cond.label_false: 24

Instrucción if-then-else La sintaxis de la instrucción if-then-else en el lenguaje fuente es: InstIfElse if Condición then Instrucción1 else Instrucción2 La estructura del código generado es Código de la condición label_true label_false Cond.label_true: Código de la instrucción1 goto label_end Cond.label_false: Código de la instrucción2 label_end: 25

Instrucción switch-case La sintaxis de la instrucción switch-case en el lenguaje fuente es: InstSwitch switch lparen Expresión rparen BloqueSwitch BloqueSwitch lbrace ( SentenciaCase )* [ SentenciaDefault ] rbrace SentenciaCase case Valor colon ( Instrucción )* SentenciaDefault default colon ( Instrucción )* 26

Instrucción switch-case La estructura del código generado es Código de la expresión temp if temp==valor1 goto label_case1 if temp==valor2 goto label_case2 goto label_default (o label_end) label_case1: Código del bloque case1 label_case2: Código del bloque case2 label_default: Código del bloque default label_end: 27

Instrucción while La sintaxis de la instrucción while en el lenguaje fuente es: InstWhile while Condición do Instrucción La estructura del código generado es label_begin: Código de la condición label_true label_false Cond.label_true: Código de la instrucción goto label_begin Cond.label_false: 28

Instrucción do-while La sintaxis de la instrucción de do-while en el lenguaje fuente es: InstDoWhile do Instrucción while Condición La estructura del código generado es Cond.label_true: Código de la instrucción Código de la condición label_true label_false Cond.label_false: 29

Instrucción for La sintaxis de la instrucción for en el lenguaje fuente es: InstFor for lparen Instrucción1 semicolon Condición semicolon Instrucción2 rparen Instrucción3 La estructura del código generado es Código de la instrucción1 label_begin: Código de la condición Cond.label_true: Código de la instrucción3 Código de la instrucción2 goto label_begin Cond.label_false: label_true label_false 30

Instrucción break Representa un salto incondicional (goto) hacia la etiqueta final de una instrucción switch, while, do-while o for. Requiere una pila de etiquetas, de manera que al entrar en una de estas instrucciones, se almacena la etiqueta final en la pila. Al salir de las instrucciones se desapila la etiqueta. Instrucción continue Representa un salto incondicional (goto) hacia la etiqueta inicial de una instrucción while, do-while o for. Requiere una pila de etiquetas, de manera que al entrar en una de estas instrucciones, se almacena la etiqueta inicial en la pila. Al salir de las instrucciones se desapila la etiqueta. 31

Llamadas a funciones La sintaxis de la llamada a una función en el lenguaje fuente es: InstCall identificador lparen ListaParametros rparen ListaParámetros [ Expresión ( comma Expresión )* ] La estructura del código generado es Código Expresión1 param temp1 Código Expresión2 param temp2... call id.comienzo temp1 temp2 32