Processadors de Llenguatge II
Compiladores
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
Que es un compilador
Compiler
Source program
Target program
input output
Que es un interprete
n
Un interprete executa directamente las operaciones en el programa fuente.
INTERPRETER
Source program
input output
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
Intérpretes vs. compiladores
n
Inicialmente interpretes eran mas comunes
n
hoy en dia, compiladores mas comunes
Porque?
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
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.
Estructura de un compilador
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
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)
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
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.
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.
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
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
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)
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.
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
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: …
Ensamblador
WHILE COUNT < VALUE DO (COUNT:=COUNT+1;
RESULT:=RESULT*COUNT);
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
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.
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: …
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
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.
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