Lectura 4

Anuncio
B. Universidad Autónoma de Puebla
Algoritmos y Programación
Primavera de 2006
Lectura 4:
Compilación e Interpretación
Javier M. Hernández
FCFM
1
Del Código Fuente al Código Ejecutable
program gcd(input, output);
var i, j: integer;
begin
read(i, j);
while i <> j do
if i > j then i := i – j;
else j := j – i;
Compilación
writeln(i)
end.
2
Compilando un Programa
Un programa llamado un “compilador” se usa para
traslada su “programa fuente” (en un lenguaje como
C++) hacia un“programa objeto” (en el lenguaje de
máquina de su sistema).
#include <iostream.h>
void main()
{
int x, y;
cout << “Enter two integers: ”;
cin >> x >> y;
if (x > y)
cout << x << “ is the largest!”;
else
cout << y << “ is the largest!”;
return;
}
Programa Fuente
ANALISIS
LEXICO
Divide el
programa
fuente en
palabras
como “void”,
“x”, “>”, y “;”.
PARSING
Analize la
sintaxis
gramatical del
programa fuente
(e.g., “if (x > y)”
tiene sentido,
pero “if (x > ) y”
no).
GENERACION
DEL CODIGO
Generate un
programa
equivalente
en lenguaje
de máquina.
110101000101100011000
010010110110100010101
011110010101011100000
010011100101011001110
101010111001010100101
010101000000110110111
011101010100111110101
010101001001001010000
010101010101000000101
111100101100001011101
010101010100010101111
110010100100100101000
Programa Objeto
3
Compilación e Interpretación
• Un compilador es un programa que translada
programas fuente de alto nivel en programas blanco
• Un interprete es un programa que ejecuta otro
programa
4
Mezclando Compilación e Interpretación
• Diferencia difusa:
– Un lenguaje es interpretado cuando la traducción inicial
es simple
– Un lenguaje es compilado cuando el proceso de
traduccion es complicado
5
Preprocesamiento
• Macros
– #define <macro> <replacement name>
– #define FALSE 0
– #define max(A,B) ( (A) > (B) ? (A):(B))
6
Linking
• Bibliotecas de subrutinas
7
Linking y carga
Después de ser compilado, el programa objeto debe ser
“linked (unido)” (i.e., conectado a otro código compilado
de las bibliotecas, como funciones matemáticas u
operadores input/output) y entonces “loaded (cargado)”
en la memoria principal para su ejecución.
Programa
fuente
COMPILAR
Programa
objeto
LINK
Programas
Biblioteca
compiladas
Programa
unido
CARGAR
8
Portabilidad
• Lenguaje en lugar de lenguaje de máquina
• Código fuente intermedio
9
Ambiente de Programación
• Mucho mas que compiladores e interpretes
– Assemblers, debuggers, preprocesadores y linkers
– Editores
– Impresion embellecida
– Verificación de estilo
– Manejo de versiones
• Ambientes integrados
– Mas allá de un simple bus error
– Emacs ?
10
Vistazo de la Compilación
program gcd(input, output);
var i, j: integer;
begin
read(i, j);
while i <> j do
if i > j then i := i – j;
else j := j – i;
Compilación
writeln(i)
end.
11
Fases de la Compilación
12
Ejemplo
• Lenguaje de calculadora de mesa
• Programa de ejemplo:
read A
read B
sum := A + B
write sum
write sum / 2
13
Análisis Léxico
• Tokens:
id
= letter ( letter | digit ) * [ except "read" and "write" ]
literal = digit digit *
":=", "+", "-", "*", "/", "(", ")“
$$$ [end of file]
14
Análisis Sintáctico
• Gramática en EBNF
<pgm>
->
<statement list> $$$
<stmt list>
->
<stmt list> <stmt> | E
<stmt>
->
id := <expr> | read <id> | write <expr>
<expr>
->
<term> | <expr> <add op> <term>
<term>
->
<factor | <term> <mult op> <factor
<factor>
->
( <expr> ) | id | literal
<add op>
->
+ | -
<mult op>
->
* | /
15
Generación de código
• Código Intermedio:
read
pop A
read
pop B
push A
push B
add
pop sum
push sum
write
push sum
push 2
div
write
16
Generación de código
• Código Blanco:
.data
A:
.long 0
B:
.long 0
sum:
.long 0
.text
main:
jsr read
movl
d0,d1
movl
d1,A
jsr read
movl
d0,d1
movl
d1,B
movl
A,d1
17
Generación de código
movl
B,d2
addl
d1,d2
movl
d1,sum
movl
sum,d1
movl
d1,d0
jsr write
movl
sum,d1
movl
#2,d2
divsl
d1,d2
movl
d1,d0
jsr write
18
Descargar