• No se han encontrado resultados

Processadors de Llenguatge II. Compiladores

N/A
N/A
Protected

Academic year: 2022

Share "Processadors de Llenguatge II. Compiladores"

Copied!
27
0
0

Texto completo

(1)

Processadors de Llenguatge II

Compiladores

(2)

Que es un compilador

n 

Un traductor es cualquier programa que toma un texto escrito en un lengiaje y da como salida otro lenguaje (llamado objeto)

texto lenguaje TRADUCTOR texto lenguaje

fuente objeto

(3)

Que es un compilador

Compiler

Source program

Target program

input output

(4)

Que es un interprete

n 

Un interprete executa directamente las operaciones en el programa fuente.

INTERPRETER

Source program

input output

(5)

Hybrid Compiler

Translator

Source program

Intermediate program Virtual Machine

input output

Java: Bytecodes

Just in time compilers translate bytecodes into ML just before runing IP

(6)

Intérpretes vs. compiladores

n 

Inicialmente interpretes eran mas comunes

n 

hoy en dia, compiladores mas comunes

Porque?

(7)

Intérpretes vs. compiladores

n 

Inicialmente interpretes eran mas comunes

n  mem(programa fuente + interprete) ≤ mem(compilador)

n 

hoy en dia, compiladores mas comunes

n  Compila una vez, ejecuta muchas veces

n  Ejecucion programa objeto mas rapida

n  Compilador tiene una vision mas global del programa

n  Interprete sin embargo da mejor diagnostico de errores

(8)

Tipos de compiladores

n 

Ensamblador: lenguaje fuente = ensamblador

n 

Compilador con montador: compila modulos independientes y luego los enlaza

n 

Autocompilador: escrito en el mismo lenguaje que va a compilar

n 

Descompilador: realiza proceso inverso a la

compilacion.

(9)

Estructura de un compilador

(10)

Phases of a Compiler

n 

Analysis of Language

n 

Synthesis of Language

ANALYSIS

LEXICAL ANALYSIS

SYNTAX ANALYSIS

SEMANTIC ANALYSIS

SYNTHESIS

INTERMEDIATE CODE GENERATION

CODE OPTIMIZATION

TARGET CODE GENERATION

(11)

Analisis léxico

n  Analizador léxico = scanner

n  Lee caracteres uno a uno y forma grupos de caracteres con alguna relación entre sí (tokens)

n  Cada token es una secuencia de caracteres tratados como una unica entidad. Los tokens son la entrada para la siguiente etapa del compilador.

n  Dos tipos de tokens:

n  palabras reservadas (p.e. if, while, begin)

n  cadenas no especificas (p.e. identificadores, constantes)

n  Frecuentemente va unido al analizador sintáctico (p.e. como subrutina)

(12)

LEXICAL ANALYZER

Lexical Analyzer or Linear Analyzer breaks the sentence into tokens. For example:

position = initial + rate * 60

Would be grouped into the following tokens:

1. The identifier position.

2. The assignment symbol =.

3. The identifier initial.

4. The plus sign.

5. The identifier rate.

6. The multiplication sign.

7. The number 60

(13)

SYMBOL TABLE

position Id1 & attributes Initial Id2 & attributes rate Id3 & attributes An expression of the form :

Position =Initial +60*Rate gets converted to à id1 = id2 +60*id3

So the Lexical Analyzer symbols to an array of easy to use

symbolic constants (TOKENS). Also, it removes spaces and other unnecessary things like comments etc.

(14)

Analisis sintáctico

n 

Analizador sintáctico = parser

n 

Recibe como entrada los tokens que le pasa el analizador lexico

n 

Comprueba si los tokens llegan en order correcto (orden permitido por el lenguaje)

n 

La salida es un arbol sintáctico (arbol de parse).

n 

Cuando el programa fuente es incorrecto

(sintacticamente) el analizador sintactico es el

responsable de producir un mensaje de error.

(15)

Parser consumes the tokens produced by the lexical analyzer. If any token is left unconsumed, the parser gives an error /warning.

Parser parses the tree such that –if all the tokens are

consumed by the parse tree, no non-terminal should be

left to be expanded

(16)

Analisis semántico

n 

Analizador semántico es dificil de formalizar

n 

Comprueba que el significado de lo que se va leyendo sea válido.

n 

P.e. determina el tipo de los resultados intermedios, si los operandos son validos, si son compatibles

entre si.

n 

En caso de los operadores polimórficos (un símbolo con varios significados), el analizador semantico

detremina cual es el aplicable. P.e. A := B + C en

Pascal

(17)

SEMANTIC ANALYSIS

The semantic analysis phase checks the source program for semantic errors and gathers type information for the subsequent code-generation phase. These checks are performed to ensure that the components of a program fit together meaningfully.

For example: we have a sample code:

int a; int b;

char c[ ];

a=b + c; (Type check is done)

(18)

Código intermedio

n  Una empresa que implementa un compilador normalmente implementa mas de uno (p.e. C de GNU).

n  Para evitar implementar M*N compiladores (M fuentes, N objetos), la solución es utilizar un lenguaje intermedio.

n  Asi solo hay que construir M programas que traduzcan al lenguaje intermedio (los front ends) y N que traduzcan del intermedio a cada lenguaje objeto (los back ends).

n  Lenguaje intermedio es suficientemente sencillo para luego generar código de máquina.

(19)

v 

INTERMEDIATE CODE GENERATION:

We can think of this intermediate representation as a program for an abstract machine. For the example used in lexical analysis the intermediate representation will be:

temp1=real(60)

temp2= id3*temp1

temp3=id2+temp2

id1=temp3

(20)

Código intermedio

WHILE (A>B) AND (A<=2*B-5) DO A:=A+B

L1: IF A>B GOTO L2 GOTO L3

L2: T1:=2*B (* nivel mas alto que ensamblador *) T2:=T1-5 (* pero mas sencillo que pascal *)

IF A<=T2 GOTO L4 GOTO L3

L4: A:=A+B GOTO L1 L3:

(21)

Ensamblador

WHILE COUNT < VALUE DO (COUNT:=COUNT+1;

RESULT:=RESULT*COUNT);

(22)

Ensamblador

WHILE COUNT < VALUE DO (COUNT:=COUNT+1;

RESULT:=RESULT*COUNT);

LABEL1 6 LOAD 19

7 SUB 21

8 JUMPGE 16

9 LOAD 19

10 ADDC 1

11 STORE 19

12 LOAD 20

13 MUL 19

14 STORE 20

15 JUMP 6

n  COUNT 19 BLOCK 3

n  RESULT 20

n  VALUE 21

(23)

Optimizacion de Codigo

n 

Es posible realizar mejoras en al código intermedio y el código objeto.

n 

Optimizacion del código intermedio es independiente del lenguaje fuente y lenguaje objeto.

n 

Optimizacion del código objeto suele incluir

optimizaciones dependiente de la maquina objeto.

(24)

Optimizacion de Codigo

L1: IF A<=B GOTO L3

T1:=2*B

T2:=T1-5

IF A>T2 GOTO L3 A:=A+B

GOTO L1 L3: …

L1: IF A>B GOTO L2 GOTO L3

L2: T1:=2*B

T2:=T1-5

IF A<=T2 GOTO L4 GOTO L3

L4: A:=A+B GOTO L1 L3: …

(25)

Optimizacion de Codigo

n 

Eliminar expresiones comunes:

A:=B+C+D E:=B+C+F

Quedaria asi:

T1:=B+C

A:=T1+D E:=T1+F

(26)

Generación de código objeto

n  En esta parte, el código intermedio optimizado es traducido a una secuencia de instrucciones en ensamblador o en codigo de maquina del procesador que nos interese.

n  Por ejemplo: A:=B+C se convertira en:

LOAD B ADD C STORE A

n  Existen técnicas para mejorar el codigo objeto (normalmente no óptimo), p.e. utilizar al maximo los registros de acceso rapido en vez de direcciones de memoria.

(27)

Tabla de símbolos

n 

Un compilador necesita guardar y usar la informacion de los objetos que va encontrando en el texto fuente. P.e.

variables, declaraciones de tipos.

n 

Esta información se almacena en una estructura de datos interna: tabla de símbolos

n 

El compilador debe desarrollar funciones para manipular esta tabla. P.e. insertar, borrar, …

n 

Accesos a la tabla deben ser rapidos.

Referencias

Documento similar