28
1/25/16, 2:45 PM Compiladores: Introducción - (c)2014 LSUB Page 1 of 28 http://127.0.0.1:3999/s01.intro.slide#1 Compiladores: Introducción Francisco J Ballesteros LSUB, URJC

Compiladores: Introducción - (c)2014 LSUBlsub.org/comp/slides/s01.intro.pdf · Compiladores Traducen el lenguaje al de la máquina O al de una máquina virtual (intérprete). Procesan

Embed Size (px)

Citation preview

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 1 of 28http://127.0.0.1:3999/s01.intro.slide#1

Compiladores: IntroducciónFrancisco J BallesterosLSUB, URJC

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 2 of 28http://127.0.0.1:3999/s01.intro.slide#1

¿Qué es un lenguaje de programación?

C, Java, Go, ...

Pero también

ls *.c

grep '^[a-z].*\.8'

printf("%s %d", ...)

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 3 of 28http://127.0.0.1:3999/s01.intro.slide#1

¿Cómo se hace un lenguaje de programación?

Compilador

Intérprete

Ambos

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 4 of 28http://127.0.0.1:3999/s01.intro.slide#1

Compiladores

Traducen el lenguaje al de la máquina

O al de una máquina virtual (intérprete).

Procesan mucho el fuente y generan una estructura

Código binario para una máquina

Código de byte para un intérprete

Una estructura de datos para para otro programa

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 5 of 28http://127.0.0.1:3999/s01.intro.slide#1

Intérpretes

Utilizan directamente el fuente

Procesado un poco, hasta que es interpretable

El fuente está siempre "ejecutando"

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 6 of 28http://127.0.0.1:3999/s01.intro.slide#1

Ejemplos

Compiladores: C, Java, Go, Ada, Expresiones regulares, ...

Intérpretes: Shell, Java, Expresiones regulares, printf, ...

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 7 of 28http://127.0.0.1:3999/s01.intro.slide#1

Lenguajes

Normalmente hay varios lenguajes implicados en un compilador

El que queremos compilar

El que describe los tokens o lexemas

Los que describen parte de la gramática (ej. expresiones)

Esto es importante para ver cómo hacemos el compilador

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 8 of 28http://127.0.0.1:3999/s01.intro.slide#1

Lenguajes

Describen conjuntos de strings sobre un alfabeto Varios tipos (Noam Chomsky) Cada tipo incluye a los siguientes

Tipo 0: Recursivamente enumerable (reconocible por un programa)

Tipo 1: Sensible al contexto (reconocible por autómatas)

Tipo 2: Libre del contexto (reconocible por un autómata sólo con una pila)

Tipo 3: Regular (reconocible por un autómata finito)

Ejemplo de tipo Leng. Regular: lexemas de un lenguaje Ejemplo de tipo Leng. Libre del Contexto: expresiones simples Ejemplo de tipo Leng. Sens. al Contexto: los que vamos a compilar

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 9 of 28http://127.0.0.1:3999/s01.intro.slide#1

Estructura de un compilador

1. Análisis léxico

2. Análisis sintáctico

3. Análisis semántico

4. Optimización

5. Generación de código

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 10 of 28http://127.0.0.1:3999/s01.intro.slide#1

Estructura de un compilador

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 11 of 28http://127.0.0.1:3999/s01.intro.slide#1

Análisis léxico

Hecho por Lexer o Scanner

La entrada son caracteres

La salida son "palabras" o tokens

identificadores

signos de puntuación

comentarios, ...

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 12 of 28http://127.0.0.1:3999/s01.intro.slide#1

Análisis léxico

De código fuente:

/* an if */if(a == b) { return; }

A tokens:

COMM(" an if ") IF LPAREN ID("a")EQUAL ID("b") RPAREN LBRA RETURN SCOL RBRA

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 13 of 28http://127.0.0.1:3999/s01.intro.slide#1

Análisis léxico

Otro ejemplo

De código fuente:

"%s -> %d\n"

A tokens:

STRARG CHARS(" -> ") NUMARG NL

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 14 of 28http://127.0.0.1:3999/s01.intro.slide#1

Análisis léxico

Otro ejemplo

De código fuente:

abs(3*x/2)

A tokens:

ABS LPAREN NUM(3) STAR VAR("x") DIV NUM(2) RPAREN

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 15 of 28http://127.0.0.1:3999/s01.intro.slide#1

Análisis sintáctico

Hecho por el analizador sintáctico o parser

La entrada son tokens

La salida es la estructura sintáctica

como en lengua

es un árbol

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 16 of 28http://127.0.0.1:3999/s01.intro.slide#1

Análisis sintáctico

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 17 of 28http://127.0.0.1:3999/s01.intro.slide#1

Análisis sintáctico

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 18 of 28http://127.0.0.1:3999/s01.intro.slide#1

Análisis sintáctico

No sólo hay que reconocer programas correctos

Hay que reconocer programas con errores sintácticos e informar de errores.

Esto complica mucho el analizador y no es trivial.

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 19 of 28http://127.0.0.1:3999/s01.intro.slide#1

Análisis semántico

Comprobar el significado del árbol

Sólo lo que importa para generar código

Y para detectar errores sencillos

Detectar incoherencias

Comprobar tipos

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 20 of 28http://127.0.0.1:3999/s01.intro.slide#1

Optimización

Modificar el programa para

que ejecute más rápido

que utilize menos recursos

manteniendo su significado

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 21 of 28http://127.0.0.1:3999/s01.intro.slide#1

Optimización

true or x

lo cambiamos por

true

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 22 of 28http://127.0.0.1:3999/s01.intro.slide#1

Optimización

a*2/4

lo cambiamos por

a/2

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 23 of 28http://127.0.0.1:3999/s01.intro.slide#1

Optimización

Y puede que

a/2

lo cambiemos por

a>>1

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 24 of 28http://127.0.0.1:3999/s01.intro.slide#1

Optimización

(x*5/y) + (x*5/y)

lo cambiamos por

temp = x*5/ytemp + temp

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 25 of 28http://127.0.0.1:3999/s01.intro.slide#1

Generación de código

Traducir el árbol al lenguaje objeto

Tal vez pasando por uno intermedio (un "ensamblador abstracto").

normalmente optimizamos el árbol

generamos código intermedio

optimizamos el código intermedio

generamos código objeto

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 26 of 28http://127.0.0.1:3999/s01.intro.slide#1

Generación de código

Se utilizan facilidades hechas para usar durante la ejecución

Eso es el sistema de run-time del lenguaje.

En lenguajes interpretados el intérprete es el run-time.

En lenguajes compilados las librerías (y builtins) son el run-time.

Como mínimo el arranque, parada y E/S

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 27 of 28http://127.0.0.1:3999/s01.intro.slide#1

Run-time

Gestión de memoria

asignación

tal vez recolección

Entrada Salida

Objetos construidos dentro del lenguaje

Comprobaciones en tiempo de ejecución

1/25/16, 2:45 PMCompiladores: Introducción - (c)2014 LSUB

Page 28 of 28http://127.0.0.1:3999/s01.intro.slide#1

Questions?

Francisco J BallesterosLSUB, URJChttp://lsub.org (http://lsub.org)