La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Optimización automática de programas (OAP) Germán Vidal 1 Optimización automática de programas Tema 3: Funciones, tipos y expresiones 3.1. Intérpretes,

Presentaciones similares


Presentación del tema: "Optimización automática de programas (OAP) Germán Vidal 1 Optimización automática de programas Tema 3: Funciones, tipos y expresiones 3.1. Intérpretes,"— Transcripción de la presentación:

1 Optimización automática de programas (OAP) Germán Vidal 1 Optimización automática de programas Tema 3: Funciones, tipos y expresiones 3.1. Intérpretes, compiladores y tiempos de ejecución 3.2. El λ-cálculo sin tipos 3.3. Tres mini-lenguajes de programación

2 Optimización automática de programas (OAP) Germán Vidal 2 3.1. 3.1. Intérpretes, compiladores y tiempos de ejecución Semántica operacionalSemántica operacional  describe las normas que rigen la ejecución de un programa  similar a la idea de intérprete Lenguajes de programaciónLenguajes de programación  expresamos el “significado” de un programa (escrito en el lenguaje L) como una función que, a partir de una entrada, devuelve una salida: [[p]] L : input  output

3 Optimización automática de programas (OAP) Germán Vidal 3 Intérpretes y compiladores IntérpretesIntérpretes  definición ecuacional: [[p]] S [input] = [[int]] L [p,input]  notación: CompiladoresCompiladores  definición ecuacional: [[p]] S [input] = [[[[comp]] L [p]]] T [input]  notación: SL S  T L

4 Optimización automática de programas (OAP) Germán Vidal 4 Tiempos de ejecución Estimación: suele usarse el número de operaciones “elementales”:Estimación: suele usarse el número de operaciones “elementales”: acceso al valor de una variable acceso al valor de una variable llamada a función llamada a función pattern-matchings pattern-matchings operaciones aritméticas, etc, etc operaciones aritméticas, etc, etc  por ejemplo, el coste de evaluar la expresión x + (2 * y) sería de 5 operaciones elementales (acceso a “ x ”, acceso a “ y ”, recuperar valor de una constante, operación “ + ” y operación “ * ”) (acceso a “ x ”, acceso a “ y ”, recuperar valor de una constante, operación “ + ” y operación “ * ”)  notación: t p (d 1,…,d n )

5 Optimización automática de programas (OAP) Germán Vidal 5 Tiempos de ejecución de un intérprete El valor de una expresión, e.g., x + 2 * y, depende del valor de sus variablesEl valor de una expresión, e.g., x + 2 * y, depende del valor de sus variables  consideramos un “entorno” que almacena el valor actual de cada variable del programa: env: Variable  Value  así, la función que evalúa una expresión sería: eval: Expression x Environment  Value

6 Optimización automática de programas (OAP) Germán Vidal 6 Tiempos de ejecución de un intérprete En general, existen 2 alternativas para evaluar las expresiones de un lenguaje:En general, existen 2 alternativas para evaluar las expresiones de un lenguaje:  por sustitución: se reemplazan todas las variables por sus valores  mediante entorno: se mantienen los valores en el entorno y sólo se reemplazan las variables por sus valores cuando es necesario

7 Optimización automática de programas (OAP) Germán Vidal 7Ejemplo data exp = Num int | Var string | Add exp exp | Mul exp exp | Add exp exp | Mul exp exp eval (Num n) env = n eval (Var v) env = env v eval (Add e1 e2) env = (eval e1 env) + (eval e2 env) eval (Mul e1 e2) env = (eval e1 env) * (eval e2 env) E.g., evaluamos x+(2*y) con env = [x  5, y  7]: eval (Add (Var “x”) (Mul (Num 2) (Var “y”))) env  (eval (Var “x”) env) + (eval (Mul …) env)  (env “x”) + (eval (Mul (Num 2) (Var “y”)) env)  5 + (eval (Mul (Num 2) (Var “y”)) env)  5 + ((eval (Num 2) env) * (eval (Var “y”) env))  5 + (2 * (eval (Var “y”) env))  5 + (2 * (env “y”))  5 + (2 * 7)  5 + 14  19

8 Optimización automática de programas (OAP) Germán Vidal 8 Sobrecarga de interpretación Si exp = x + (2 * y), entoncesSi exp = x + (2 * y), entonces  t exp () = 5  t int (exp) = 9 (contad el número de  ) En general,En general, t int (p,d 1,…,d n ) = α * t p (d 1,…,d n ) siendo α la llamada “sobrecarga de interpretación”  su valor, para intérpretes reales, oscila entre 3 y 200, dependiendo del lenguaje…

9 Optimización automática de programas (OAP) Germán Vidal 9 3.2. λ-cálculo sin tipos Alonzo Church se preguntaba…Alonzo Church se preguntaba… ...qué funciones matemáticas se pueden computar de forma mecánica (i.e., mediante un algoritmo)?  Su respuesta fue: aquéllas que se pueden especificar en el λ-cálculo (creado por él, 1930) El λ-cálculo constituye la base teórica de casi todos los lenguajes funcionalesEl λ-cálculo constituye la base teórica de casi todos los lenguajes funcionales  Lisp, Scheme, ML, Haskell, etc

10 Optimización automática de programas (OAP) Germán Vidal 10 Notación λ para las funciones Notación básica:Notación básica: λx.exp (ó λx  exp ó \x -> exp)  Se trata de una función “anónima” (sin nombre) con un solo parámetro, x, cuyo cuerpo es exp  Por ejemplo, (λx.x+1) 1 = 2 Si hay varios parámetros, podemos usar:Si hay varios parámetros, podemos usar: λ(x 1,x 2,…,x n ).exp  λx 1.λx 2.….λx n.exp También se pueden indicar los tipos:También se pueden indicar los tipos: λ(x 1 :A 1,x 2 :A 2,…,x n :A n ).exp

11 Optimización automática de programas (OAP) Germán Vidal 11 Ejemplos square = \x -> x*x suma = \x,y -> x+y k = \m,n -> (m+n, m-n) twice = \f -> (\x -> f(f(x))) add = \x -> (\y -> x+y)...

12 Optimización automática de programas (OAP) Germán Vidal 12 Sintaxis del λ-cálculo (extendido) ::= ::= | | |\ -> |\ -> |if then |if then else else |... |... donde es un operador básico (e.g. +, -, *,...)

13 Optimización automática de programas (OAP) Germán Vidal 13 Evaluación de λ-expresiones Idea básica:Idea básica:  reescribimos (toda o parte de) la expresión inicial mediante una serie de reducciones hasta que se alcanza un valor  usamos la notación: M  P, para indicar que M se reduce a P

14 Optimización automática de programas (OAP) Germán Vidal 14 Algunos conceptos previos… Ocurrencia ligada de una variable:Ocurrencia ligada de una variable:  una ocurrencia de la variable x está ligada en una expresión si aparece dentro del ámbito de una lambda  e.g., x está ligada en \x -> x+1 Ocurrencia libre de una variable:Ocurrencia libre de una variable:  si no está ligada,  e.g., x es libre en \y -> x+y

15 Optimización automática de programas (OAP) Germán Vidal 15 Algunos conceptos previos… Variable libre:Variable libre:  una variable x es libre en una expresión si existe al menos una ocurrencia libre de x  e.g., x es libre en \y -> x (\x -> x) pero no en \y -> (\x -> x) Sustitución:Sustitución:  son funciones finitas que denotan la asignación de expresiones a variables libres  así, [N/x]M denota la expresión M en la que las ocurrencias de la variable x se han sustituido por N  también se suele usar M[x/N] o, más a menudo, M[x  N] (nosotros usaremos la última opción!)

16 Optimización automática de programas (OAP) Germán Vidal 16 Ejercicio 3.1 Identifica las ocurrencias de variables libres y ligadas en las siguientes expresionesIdentifica las ocurrencias de variables libres y ligadas en las siguientes expresiones  para las ligadas, indica la lambda que le afecta 1.- (x (\x -> (\x -> x x)) x) 2.- (x (\x -> (\x -> x) x) x) 3.- \h -> (\x -> h (x x)) (\x -> h (x x))

17 Optimización automática de programas (OAP) Germán Vidal 17 Reglas de reducción α-conversión:α-conversión: \x -> M  \y -> M[x  y] donde y no debe ser libre en M Se emplea para renombrar las variables y evitar el “problema de la captura de nombres de variables” (luego lo vemos…)Se emplea para renombrar las variables y evitar el “problema de la captura de nombres de variables” (luego lo vemos…)

18 Optimización automática de programas (OAP) Germán Vidal 18 Reglas de reducción β-reducción:β-reducción: (\x -> M) N  M[x  N] Representa la aplicación de una función a un argumentoRepresenta la aplicación de una función a un argumento Restricción:Restricción:  ninguna variable libre de N puede convertirse en ligada tras el paso de β -reducción (problema de la captura de nombres de variables)  se puede evitar con un paso de α-conversión (luego vemos un ejemplo..)

19 Optimización automática de programas (OAP) Germán Vidal 19 Reglas de reducción δ-reducción:δ-reducción: op a 1 a 2... a n  b si b es el resultado de aplicar el operador op sobre las constantes a 1, a 2, …, a n E.g., (+ 5 6)  11E.g., (+ 5 6)  11 Restricción:Restricción:  los argumentos debe ser constantes

20 Optimización automática de programas (OAP) Germán Vidal 20 Reglas de reducción Reducción de condicional:Reducción de condicional: if true then M else N  M if false then M else N  N

21 Optimización automática de programas (OAP) Germán Vidal 21 Reglas de reducción Reducción en contextos:Reducción en contextos:...M... ...N... si M  N Significa que es correcto reducir una parte de una expresión, dejando el resto tal cualSignifica que es correcto reducir una parte de una expresión, dejando el resto tal cual

22 Optimización automática de programas (OAP) Germán Vidal 22 Reglas de reducción Reducción repetida:Reducción repetida: M 1  M 3 si M 1  M 2 y M 2  M 3 Básicamente, coincide con la propiedad transitiva…Básicamente, coincide con la propiedad transitiva… También lo denotaremos así:También lo denotaremos así: M 1  M 2  M 3 ...

23 Optimización automática de programas (OAP) Germán Vidal 23 Ejemplo (\x -> ((\x -> x+x)5)+x+(\x -> x*x)3)4  (\x -> ((5+5)+x+(\x -> x*x)3)4  (\x -> (10+x+(\x -> x*x)3)4  10+4+(\x -> x*x)3  10+4+(3*3)  14+(3*3)  14+9  23

24 Optimización automática de programas (OAP) Germán Vidal 24 Ejercicio 3.2 Usad las reglas de α- y β-reducción para reducir las siguientes expresionesUsad las reglas de α- y β-reducción para reducir las siguientes expresiones 1. x ((\y -> x) z) 2. (\x -> x y) (\z -> z) 3. (\y -> (\z -> z y)) (\k -> z) 4. (\x -> (\y -> x y) x) (\x -> z) 5. (\f -> (\g -> (\x -> f x (g x)))) (\x -> (\y -> x)) (\x -> (\y -> x)) a (\x -> (\y -> x)) (\x -> (\y -> x)) a

25 Optimización automática de programas (OAP) Germán Vidal 25 Concepto de redex Un redex (reducible expression) es:Un redex (reducible expression) es:  cualquier expresión que se puede reducir mediante una β-reducción, una δ-reducción o una reducción de condicional Un redex top-level es:Un redex top-level es:  un redex que no se encuentra dentro del ámbito de una lambda Una expresión está en weak head normal form (whnf) siUna expresión está en weak head normal form (whnf) si  es una constante, e.g., 17  una función, e.g., \x -> M  una variable libre, e.g., x  o la aplicación de una variable libre a una expresión, e.g., x M

26 Optimización automática de programas (OAP) Germán Vidal 26 Concepto de redex Si una expresión está en whnfSi una expresión está en whnf  no tiene top-level redexes Existen expresiones que nunca alcanzan la whnfExisten expresiones que nunca alcanzan la whnf  e.g., (\y -> y y) (\y -> y y) Ejemplo de captura de nombres:Ejemplo de captura de nombres: (\x -> 2 + (\y -> x + y) 5) (y + 1)  2 + (\y -> (y + 1) + y) 5)  2 + (5 + 1) + 5 ...  13 Error!

27 Optimización automática de programas (OAP) Germán Vidal 27 Evaluación CBV y CBN Aunque nos limitemos a la reducción de top-level redexes, existen 2 posibilidades:Aunque nos limitemos a la reducción de top-level redexes, existen 2 posibilidades:  reducir primero “el argumento” de una función antes de su evaluación (CBV, call by value)  reducir primero la aplicación de una función (CBN, call by name)

28 Optimización automática de programas (OAP) Germán Vidal 28 Evaluación CBV y CBN CBV:CBV:  para aplicar una β-reducción a (\x -> N) M, antes hay que reducir la expresión M a whnf CBN:CBN:  podemos reducir (\x -> N) M sin necesidad de reducir previamente M a una whnf

29 Optimización automática de programas (OAP) Germán Vidal 29 CBV vs CBN En principio, CBN es preferible porque se cumple la “propiedad de completitud”:En principio, CBN es preferible porque se cumple la “propiedad de completitud”:  si existe alguna posibilidad de reducir M a una whnf P, entonces la estrategia CBN reduce M a P  probad: (\x -> 1) ((\y -> y y) (\y -> y y)) Sin embargo, CBV puede ser más eficiente que CBN!Sin embargo, CBV puede ser más eficiente que CBN!  probad a reducir, e.g., (\x -> x + x + x) (2+2) La mejor solución: usar CBN con “sharing”…La mejor solución: usar CBN con “sharing”… (base de Haskell, LML, etc)

30 Optimización automática de programas (OAP) Germán Vidal 30 Ejercicio 3.3 Encontrad 2 expresiones M y N tales queEncontrad 2 expresiones M y N tales que 1. M se evalúe más rápido con CBV que con CBN 2. N se evalúe más rápido con CBN que con CNV

31 Optimización automática de programas (OAP) Germán Vidal 31 Ejercicio 3.5 Una expresión está en forma normal si no es posible realizar un paso de β-reducción, δ-reducción o reducción de condicional sobre cualquier sub- expresión (no necesariamente un top-level redex)Una expresión está en forma normal si no es posible realizar un paso de β-reducción, δ-reducción o reducción de condicional sobre cualquier sub- expresión (no necesariamente un top-level redex) Encontrad una expresión P sin variables libres cuya reducción a forma normal requiera algún renombramiento mediante α-conversionEncontrad una expresión P sin variables libres cuya reducción a forma normal requiera algún renombramiento mediante α-conversion

32 Optimización automática de programas (OAP) Germán Vidal 32 3.3 Tres mini-lenguajes de programación 1.Un intérprete para el λ-cálculo CBV sin tipos 2.Un intérprete para ecuaciones recursivas de primer orden (CBV) 3.Un intérprete para un lenguaje imperativo simple

33 Optimización automática de programas (OAP) Germán Vidal 33 Un intérprete para el λ-cálculo CBV sin tipos data lambda = Int int// constante | Var string// variable | Abs string lambda// lambda | Apply lambda lambda// aplicación | Op string [lambda]// operador | If lambda lambda lambda// condicional type environment = ([string],[value]) data value = Numb int | Closure lambda environment

34 Optimización automática de programas (OAP) Germán Vidal 34 Un intérprete para el λ-cálculo CBV sin tipos // función principal: interpret :: lambda -> value interpret e = eval e ([],[]) // ([],[]) es el entorno “vacío” // función auxiliar: lookup :: a -> ([a],[b]) -> b lookup x (n:ns,v:vs) = if x == n then v else lookup x (ns,vs)

35 Optimización automática de programas (OAP) Germán Vidal 35 Un intérprete para el λ-cálculo CBV sin tipos eval :: lambda -> environment -> value eval (Int n) env = Numb n eval (Var x) env = lookup x env eval (Abs x e) env = Closure (Abs x e) env eval (Apply f e) env = let v = eval e env Closure (Abs x e1) (ns,vs) = eval f env in eval e1 (x:ns,v:vs)

36 Optimización automática de programas (OAP) Germán Vidal 36 Un intérprete para el λ-cálculo CBV sin tipos eval (Op “+” [e1,e2]) env = let Numb v1 = eval e1 env Numb v2 = eval e2 env in Numb (v1 + v2) // similar para “-”, “*”, etc eval (If c e1 e2) = case (eval c env) of (Numb 1) -> eval e1 env // 1 es True (Numb _) -> eval e2 env // el resto False

37 Optimización automática de programas (OAP) Germán Vidal 37 Ejercicio 3.8 Escribe un intérprete para el λ-cálculo CBN sin tiposEscribe un intérprete para el λ-cálculo CBN sin tipos

38 Optimización automática de programas (OAP) Germán Vidal 38 Un intérprete para ecuaciones recursivas de primer orden (CBV) // prog = // ([nombres_funcion],[([lista_vars],cuerpo)]) type prog = ([string], [([string],expr)]) data expr = Int int// constante | Var string// variable | If expr expr expr// condicional | Call string [expr]// llamada func. | Op string [expr]// operador

39 Optimización automática de programas (OAP) Germán Vidal 39 Un intérprete para ecuaciones recursivas… // función principal (value = int): interpret :: prog -> [expr] -> int interpret pgm [args] = let (_, (vars,exp):_) = pgm in eval exp (vars,args) pgm // asumimos que la ejecución comienza con // la primera función, por eso sólo pasamos // los argumentos...

40 Optimización automática de programas (OAP) Germán Vidal 40 Un intérprete para ecuaciones recursivas… // función auxiliar: lookup :: a -> ([a],[b]) -> b lookup x (n:ns,v:vs) = if x == n then v else lookup x (ns,vs) // función auxiliar: evlist :: [exp] -> ([string],[int]) -> prog -> int evlist [] _ _ = [] evlist (e:es) env pgm = (eval e env pgm) : (evlist es env pgm)

41 Optimización automática de programas (OAP) Germán Vidal 41 Un intérprete para ecuaciones recursivas… eval :: exp -> ([string],[int]) -> prog -> int eval (Int n) env pgm = n eval (Var x) env pgm = lookup x env eval (Call f exps) env pgm = let vals = evlist exps env pgm (vars,exp) = lookup f pgm in eval exp (vars,vals) pgm

42 Optimización automática de programas (OAP) Germán Vidal 42 Un intérprete para ecuaciones recursivas… eval (Op “+” [e1,e2]) env pgm = (eval e1 env pgm) + (env e2 env pgm) // similar para “-”, “*”, etc eval (If c e1 e2) env pgm = case (eval c env pgm) of 1 -> eval e1 env pgm // 1 es True _ -> eval e2 env pgm // resto False

43 Optimización automática de programas (OAP) Germán Vidal 43 Ejercicio 3.9 Escribe un intérprete para ecuaciones recursivas de primer orden CBNEscribe un intérprete para ecuaciones recursivas de primer orden CBN

44 Optimización automática de programas (OAP) Germán Vidal 44 Un intérprete para un lenguaje imperativo simple No lo vemos en clase…No lo vemos en clase… (lo podéis encontrar en [Jones, Gomard, Sestoft 93])


Descargar ppt "Optimización automática de programas (OAP) Germán Vidal 1 Optimización automática de programas Tema 3: Funciones, tipos y expresiones 3.1. Intérpretes,"

Presentaciones similares


Anuncios Google