6. PARAMETRIZACIÓN

36
1 6. PARAMETRIZACIÓN

description

Cobol. C. Pascal. Fortran. 6. PARAMETRIZACIÓN. SmallTalk. Java. C++. Parametrización. Los parámetros pertenecen a los subprogramas Permiten independizar la funcionalidad abstracta de las instancias de uso con datos concretos - PowerPoint PPT Presentation

Transcript of 6. PARAMETRIZACIÓN

Page 1: 6. PARAMETRIZACIÓN

1

6. PARAMETRIZACIÓN

Page 2: 6. PARAMETRIZACIÓN

2

Los parámetros pertenecen a los subprogramas

Permiten independizar la funcionalidad abstracta de las instancias de uso con datos concretos

Cada instancia de uso asocia parámetros actuales con parámetros formales

Los elementos comprometidos en la representación de una variable se utilizan para definir diferentes modelos de parametrización

Parametrización

Page 3: 6. PARAMETRIZACIÓN

3

Parametrización de datos Nombre Referencia Valor

Parametrización de tipos Tipo

Parametrización

Nombre Tipo Referencia Valor

Page 4: 6. PARAMETRIZACIÓN

4

Sin embargo, en la RAM de un computador sólo se representan

Datos Códigos

Y, como también es posible parametrizar códigos, se debe definir un último modelo

Parametrización de subprogramas

Parametrización

Page 5: 6. PARAMETRIZACIÓN

5

Parametrización de datos

Page 6: 6. PARAMETRIZACIÓN

6

Por Nombre Por Referencia Por Copia

Por Valor Por Resultado Por Valor-Resultado

Por Indirección

Opciones de llamada

Page 7: 6. PARAMETRIZACIÓN

7

void uno(<Modalidad> int a, <Modalidad> int b){

a = 7; b = 5;}void cero(){ int c, d; c = 5; d = 7; Uno(c, d); cout << c << d;}

Subprogramas de ejemplo

Page 8: 6. PARAMETRIZACIÓN

8

<Modalidad> ::= name Sólo la provee lenguaje Algol Cuando se invoca un subprograma se aplica la

denominada regla de sustitución La regla de sustitución establece el reemplazo

del nombre del parámetro formal por el nombre del respectivo parámetro actual

Llamada Por Nombre

Page 9: 6. PARAMETRIZACIÓN

9

void uno(name int a, name int b){ a = 7; b = 5;}

void cero(){ int c, d; c = 5; d = 7; uno(c, d); cout << c << d;}

a b uno:

7 55 7c dcero

: c = 7;d = 5;

Regla de sustitución en

uno

7 y 5

c 5

d 7

a

b

sustitución

sustitución

Llamada Por Nombre

Page 10: 6. PARAMETRIZACIÓN

10

procedure uno;var x : integer;procedure dos(name y : integer);

var x : integer;begin

x := 2;write(y);

end;begin

x := 1;dos(x);

end;

dos(x); Llamada:

x := 2;write(x);

Regla de sustitución

1 2uno: xdos: y x

1

x 2

x 1 y

Llamada Por Nombre

Page 11: 6. PARAMETRIZACIÓN

11

procedure swap(name a, b : integer);

var temp : integer;begin

temp := a;a := b;b := temp;

end;Si antes de la llamada:

i = 3 y v[3] = 5

swap(i, vi); Llamada:

temp := i;i := v[i];v[i] := temp;

Regla de sustitución

i = 5 y v[5] = 3

Pero queda:

1 2 3 4 5 6 74 6 5 2 3 1 3

i=5

?Efecto

indeseado

1 2 3 4 5 6 74 6 5 2 7 1 3

i=31 2 3 4 5 6 74 6 3 2 7 1 3

i=5

Llamada Por Nombre

Page 12: 6. PARAMETRIZACIÓN

12

<Modalidad> ::= ref La proveen lenguajes como Fortran, Pascal y

C++ Cuando se invoca un subprograma, el

parámetro formal se convierte en alias del respectivo parámetro actual, es decir,

La referencia del parámetro actual se copia como referencia del correspondiente parámetro formal

Llamada Por Referencia

Page 13: 6. PARAMETRIZACIÓN

13

void uno(ref int a, ref int b){ a = 7; b = 5;}

void cero(){ int c, d; c = 5; d = 7; uno(c, d); cout << c << d;}

5 7c dcero

:

a b uno:

7 y 5

7 5 c 5

d 7

a

b

Llamada Por Referencia

Page 14: 6. PARAMETRIZACIÓN

14

<Modalidad> ::= in La proveen lenguajes como Pascal, C y Ada Cuando se invoca un subprograma, se ejecuta

la asignación parámetro formal parámetro actual

es decir, El valor del parámetro actual se copia como

valor del correspondiente parámetro formal

Llamada Por Valor

Page 15: 6. PARAMETRIZACIÓN

15

5 7

a buno:

5 7c dcero

:

5 y 7

7 5 c 5

d 7

a 5

b 7

Asignaciones en la llamada

a = c;b = d;

7

5

void cero(){ int c, d; c = 5; d = 7; uno(c, d); cout << c << d;}

void uno(in int a, in int b){ a = 7; b = 5;}

Llamada Por Valor

Page 16: 6. PARAMETRIZACIÓN

16

<Modalidad> ::= out La provee lenguaje Ada Cuando se invoca un subprograma, no existe

copia de un valor; pero, cuando el subprograma termina, se ejecuta la asignación

parámetro actual parámetro formales decir,

El valor del parámetro formal se copia como valor del correspondiente parámetro actual

Llamada Por Resultado

Page 17: 6. PARAMETRIZACIÓN

17

7 5

a buno:

5 7c dcero

:

7 y 5

7 5 a

b

c 5

d 7

Asignaciones al finalizar

c = a;d = b;

7

5

7

5

void uno(out int a, out int b){ a = 7; b = 5;}

void cero(){ int c, d; c = 5; d = 7; uno(c, d); cout << c << d;}

Llamada Por Resultado

Page 18: 6. PARAMETRIZACIÓN

18

<Modalidad> ::= in-out La provee lenguaje Ada Efecto combinado de

Llamada Por Valor, al invocar un subprograma, y

Llamada Por Resultado, el terminar la ejecución de un subprograma

Llamada Por Valor-Resultado

Page 19: 6. PARAMETRIZACIÓN

19

a buno:

5 7c dcero

:

7 y 5

7 5 5 7 7 5

c 5

d 7

7

5

a 5

b 7

7

5

a = c;b = d;Al llamar: c = a;

d = b;Al terminar:

void uno(in-out int a, in-out int b){ a = 7; b = 5;}

void cero(){ int c, d; c = 5; d = 7; uno(c, d); cout << c << d;}

Llamada Por Valor-Resultado

Page 20: 6. PARAMETRIZACIÓN

20

<Modalidad> ::= in La provee lenguaje C Se trata de una Llamada Por Valor en la cual,

la referencia del parámetro actual se copia como valor del correspondiente parámetro formal

En la definición, se debe anteponer el operador de indirección al parámetro formal

En la invocación, se debe anteponer el operador de dirección al respectivo parámetro actual

Llamada Por Indirección

Page 21: 6. PARAMETRIZACIÓN

21

a buno:

5 7c dcero

:

7 y 5

100 300

7 5

c 100 5

d 300 7

a referencia de cb referencia de dAl

llamar:

a 100

b 300

7

5

Llamada Por Indirecciónvoid uno(in int *a, in int *b){ *a = 7; *b = 5;}

void cero(){ int c, d; c = 5; d = 7; uno(&c, &d); cout << c << d;}

Page 22: 6. PARAMETRIZACIÓN

22

Parametrización de tipos

Page 23: 6. PARAMETRIZACIÓN

23

La función

suma los n=40 elementos enteros de un arreglo v Sin embargo, para sumar los n=60 elementos

reales de un arreglo a, se debe implementar otra función, sintácticamente distinta pero semánticamente igual

int Suma(Vector v, int n){ int i, s=0; for (i=0; i<n; i++) s = s + v[i]; return s;}

Problema

Page 24: 6. PARAMETRIZACIÓN

24

Parametrizar el tipo de dato Esta solución involucra un alto nivel de abstracción

que reduce el tamaño del código fuente La producción de subprogramas, que difieran sólo

en el tipo de dato de sus parámetros, se realiza en tiempo de traducción

Ejemplos de formas de parametrización de tipos: Unidades genéricas (lenguaje Ada) Plantillas de funciones (lenguaje C++)

Solución

Page 25: 6. PARAMETRIZACIÓN

25

Definición Una Unidad Genérica es una unidad formal

(modelo) cuyos parámetros se instalan en tiempo de traducción para producir una unidad actual

Implementación La generación de múltiples unidades

actuales se logra mediante el concepto de macro-expansión

Unidades Genéricas

Page 26: 6. PARAMETRIZACIÓN

26

Sea el siguiente subprograma genérico en Ada

Aquí, T es el parámetro de tipo de los datos X e Y

Unidades Genéricas

generic type T;procedure Swap(X, Y : in out T) is

Temp : T;begin

Temp:= X;X := Y;Y := Temp;

end;

Page 27: 6. PARAMETRIZACIÓN

27

Producción de tres subprogramas que sólo difieren en el tipo de sus parámetros

Unidades Genéricas

procedure Swapint is new Swap (integer);procedure Swapreal is new Swap (real);procedure Swapchar is new Swap (char);

Page 28: 6. PARAMETRIZACIÓN

28

ProblemaEl código

retorna la suma (or) de dos valores de tipo logicala) Efectuar las modificaciones necesarias para que mas se convierta en unidad genéricab) Declarar las instancias de producción de cuatro versiones de mas que permitan sumar valores de tipo logical, integer, rational y real

Unidades Genéricas

logical mas(logical in a, logical in b){ return a + b; }

Page 29: 6. PARAMETRIZACIÓN

29

Solucióna)

b)

Unidades Genéricas

generic type T;T mas(T in a, T in b){ return a + b; }

logical maslogical is new mas(logical);integer masinteger is new

mas(integer);real masreal is new mas(real);rational masrational is new

mas(rational);

Page 30: 6. PARAMETRIZACIÓN

30

Definición Una Plantilla de Función es una unidad

formal utilizada como modelo de producción de una unidad actual

Implementación El compilador genera, de manera

automática, tantas unidades actuales como invocaciones con diferentes tipos de datos existan

Plantillas de funciones

Page 31: 6. PARAMETRIZACIÓN

31

Sea la siguiente plantilla de función en C++

Aquí, T es el parámetro de tipo del arreglo V

Plantillas de funciones

template <class T>void imprimir(T *V, int k){ for(int i=0; i<k; i++) cout<< V[i] << " "; cout<< endl;}

Page 32: 6. PARAMETRIZACIÓN

32

Producción de tres unidades actuales a partir de tres invocaciones con arreglos de distinto tipo base

Plantillas de funciones

int main() { int a[4] = {1, 2, 3, 4};

float b[6] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6};

char c[5] = "Hola";imprimir(a, 4);imprimir(b, 6);imprimir(c, 5);return 0;

}

Page 33: 6. PARAMETRIZACIÓN

33

Parametrización de subprogramas

Page 34: 6. PARAMETRIZACIÓN

34

El uso de un subprograma como parámetro actual requiere el envío de

La referencia del segmento de código en RAM, y La información respecto de su entorno no local

Un subprograma parámetro se puede representar como un par ordenado de punteros (C, R), donde

C apunta al segmento de código, y R apunta al registro de activación de la más próxima

unidad perteneciente a su entorno no local

Códigos como parámetros

Page 35: 6. PARAMETRIZACIÓN

35

Procedure P... ··· Procedure A...

···

Begin ··· End; Procedure B(procedure X); var y: integer; Procedure C... ··· Begin ··· End; Begin X; B(C); ··· End; Begin ··· B(A); ··· End

Como B tiene definido un parámetro formal X, la llamada a X activa el procedimiento A

1. P llama a B con el procedimiento A como parámetro actual

Una segunda invocación a X activará el procedimiento C

2. B se autoinvoca con el procedimiento C como parámetro actual

Códigos como parámetros

Page 36: 6. PARAMETRIZACIÓN

36

Dos: Y: Tres(3)j : 2 2+ ___

int Tres(int k){ return(k); }int Dos(int Y, int j){ return(j + Y); }int Uno(int X, int i){ return(i + X); }void Main(){ print(Uno(Dos(Tres(3),2),1)); }

print(Uno(Dos(Tres(3),2),1))Main: 6Uno: X: Dos(Tres(3),2)

i : 11+ ___5 = 6

Stack de RA

k: 3Tres:

3

3 = 5

EjercicioMostrar las variaciones que presenta el stack del registros de activación e indicar el valor finalmente impreso, al ejecutarse el código

Códigos como parámetros