1 6. parametrizaciÓn. 2 parametrización la parametrización permite realizar una abstracción de...

Post on 23-Jan-2016

243 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

6. PARAMETRIZACIÓN

2

Parametrización

La parametrización permite realizar una abstracción de la identidad de varios ejemplos de los datos

Los valores reales de los datos NO son importantes.

Interesa la cantidad y tipo de datos de ellos.

Los parámetros están asociados a los procedimientos

Especifican la forma de los objetos de datos con los cuales se trabajará.

3

Parametrización

Cada uno de los elementos que participan en la representación de una variable:

es susceptible de ser parametrizado

Nombre Tipo Referencia Valor

La parametrización del tipo establece una diferencia conceptual importante en la categorización de los lenguajes.

4

Parametrización

1. Parametrización de datos

2. Parametrización de tipos

3. Parametrización de subprogramas

Nombre

Referencia

Valor

Tipo

5

Parametrización de Datos

6

Opciones de Llamada

Por Nombre

Por Referencia

Por Copia

Por Valor

Por Resultado

Por Valor-Resultado

Por Indirección

7

Subprogramas de ejemplo

Procedure Uno(<Modalidad> a, b :

integer);Begin

a := 7;b := 5;

End;Procedure Cero;Var c, d : integer;Begin

c:= 5;d := 7;Uno(c, d);Write(c, d);

End;

8

Parametrización por Nombre

<Modalidad>::= Name

9

Llamada por nombre (Algol)

La llamada al SP

realiza

en TODO el cuerpo del subprograma

una sustitución

parámetro formal

Permite modificar los parámetros actuales

argumento o parámetro actual

(Llamada)

10

Procedure Uno(Name a, b :

integer);Begin

a := 7;b := 5;

End;

Procedure Cero;Var c, d : integer;Begin

c:= 5;d := 7;Uno(c, d);Write(c,

d);End;

Llamada por nombre

c 5

d 7

a

b

a bUno:

7 55 7

c dCero: c :=

7;b := 5

Regla de sustitución en

UNO

7 y 5

sustitución

sustitución

11

Ejemplo

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);La llamada:

x=2;Write(x);

Regla de sustitución

1 2

Uno: xDos: y x

1

x 2

x 1 y

c 4

Ejemplo Situación poco clara:Procedure Dos;Var

c: integer;

Procedure swap(name a,b: Integer);Var

temp: Integer;Begin

temp:=a;a:=b;b:=temp:c:=c+1;

End;Procedure Tres;Var

c,d: Integer; Begin

c:=5;d:=7;Swap(c,d);Write(c,d);

End;Begin

c:=4;Tres;

End;

temp:=c;c:=d;d:=temp;c:=c+1;

Regla de sustitución en Swap

4 5 7 5

Dos: cTres: c d

Swap: a b temp

5 7 5

a

b

7,5

c 5

d 7

temp 5

7

5

5

13

Gráficamente

Dos:c: 4

Swapabtemp: 5

c:5d:7temp: 5

Tres75

5

7,5

14

Efectos inesperados

Procedure Swap(name a, b : integer);var

temp : integer;begin

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

end;

swap(i, vi);

La llamada:

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

Regla de sustitución

Si antes de la llamada:

i = 3 y v[3] = 5

i = 5 y v[5] = 3

Pero queda:

1 2 3 4 5 6 7

4 6 5 2 7 1 3

i=3

1 2 3 4 5 6 7

4 6 5 2 3 1 3

i=5

?

1 2 3 4 5 6 7

4 6 3 2 7 1 3

i=5

15

Parametrización Por Referencia

<Modalidad>::= Ref

16

Llamada por Referencia (Fortran)

Al SP se entrega el l-valor del ODD

El ODD no cambia su posición en la

RAM

argumento o parámetro actual

(Llamada)

Permite modificar los parámetros actuales

parámetro formal

Transferencia de la dirección

Parámetro Actual

Parámetro Formal

l-valor

17

5 7

c dCero:

Procedure Uno(ref a, b :

integer);Begin

a := 7;b := 5;

End;

Procedure Cero;Var c, d : integer;Begin

c:= 5;d := 7;Uno(c, d);Write(c,

d);End;

Llamada por Referencia

a bUno:

7 y 5

7 5 c 5

d 7

a

b

18

Parametrización por Copia

Por Valor

Por Resultado

Por Valor-Resultado

19

Llamada por Copia

Los parámetros actuales se relacionan con los parámetros formales por medio de:

Asignación de valores

El parámetro actual entrega su r-valor al parámetro formal, el que es copiado en OTRA localidad.

Parámetro Actual

Parámetro Formal

r-valor

20

Llamada por Valor

Los VALORES de los parámetros actuales se utilizan para inicializar los respectivos parámetros formales

Al efectuarse una invocación se realizan las asignaciones de los VALORES a los

parámetros formales

<Modalidad>::= in

21

Ejemplo

c 5

d 7

Procedure Uno(in a, b : integer);Begin

a := 7;b := 5;

End;

Procedure Cero;Var c, d : integer;Begin

c:= 5;d := 7;Uno(c, d);Write(c,

d);End;

5 7

a bUno:

a 5

b 7

5 7

c dCero:

Asignación en la llamada:

a:= c;b:= d;

5 y 7

7 5

7

5

22

Llamada por Resultado

Los parámetros formales NO se inicializan al invocarse el subprograma

Al terminar la ejecución del subprograma, los valores de los parámetros formales, son

asignados a los respectivos parámetros actuales usados en la llamada.

<Modalidad>::= out

23

a

b

Ejemplo

c 5

d 7

Procedure Uno(out a, b :

integer);Begin

a := 7;b := 5;

End;

Procedure Cero;Var c, d : integer;Begin

c:= 5;d := 7;Uno(c, d);Write(c,

d);End;

7 5

a bUno:

5 7

c dCero:

Asignación al final de la ejecución:

c:= a;d:= b;

7 y 5

7

5

7 5

7

5

24

Llamada por Valor-Resultado

Se trata de un efecto combinado.

b) Al terminar la ejecución del subprograma, los valores de los parámetros formales, son asignados a los respectivos parámetros actuales usados en la llamada.

<Modalidad>::= in-out

a) Al efectuarse una invocación se realizan las asignaciones de los VALORES a los parámetros formales

25

Ejemplo

c 5

d 7

Procedure Uno(in-out a, b :

integer);Begin

a := 7;b := 5;

End;

Procedure Cero;Var c, d : integer;Begin

c:= 5;

d := 7;Uno(c, d);Write(c, d);

End;a bUno:

5 7

c dCero:

7 y 5

7 5

7

5 5 7

a 5

b 7 7 5

7

5

a:= c;b:= d;

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

Al terminar:

26

Parametrización por Indirección

27

Llamada por Indirección

Es una llamada por valor en la cual el parámetro formal recibe la dirección de la variable utilizada como parámetro actual.

<Modalidad>::= in

En la definición anteponer el operador de indirección al parámetro formal : * (en C)

En la llamada anteponer el operador de dirección al parámetro actual : & (en C)

28

Ejemplo

c 100 5

d 300 7

Procedure Uno(in *a, *b : integer);Begin

*a := 7;*b := 5;

End;

Procedure Cero;Var c, d : integer;Begin

c:= 5;

d := 7;Uno(&c, &d);Write(c, d);

End;a bUno:

5 7

c dCero:

7 y 5

100 300

l-valor de c a;l-valor de d b;

Al llamar:

a 100

b 300 7 5

7

5

29

Resumen

Aunque la implementación es diferente, las siguientes modalidades generan el mismo efecto:

Por nombrePor referenciaPor resultadoPor valor-resultadoPor indirección

30

Parametrización de Tipos

31

Problema

Se cuenta con una rutina que suma los elementos de un vector de n=100 enteros

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

¿Será posible utilizarla para sumar:

a) Los elementos enteros de un vector A[0..50]?

b) Los elementos enteros de un vector B[0..300]?

c) Los elementos reales de un vector C[0..100]?

32

Análisis

El problema radica en que, en los lenguajes fuertemente tipados, esta asociado el tipo de dato a los operadores.

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

La declarativa y verificación de tipos, restringe el tipo de dato "Vector" (según el ejemplo) que la rutina puede recibir.

33

Solución

Algunos lenguajes han desarrollado la facilidad de poder pasar como parámetro el tipo de dato de los ODD.

Así será posible tener unidades más genéricas. Es decir, unidades que no sólo reciban variables, valores o direcciones como parámetro, sino que también reciban el tipo de dato.

34

Solución

La parametrización de tipos involucra un alto nivel de abstracción y disminuye el tamaño del código fuente

La producción de distintos subprogramas, que difieran sólo en el tipo de dato de sus argumentos, se realiza en tiempo de traducción.

Se generan tantos subprogramas como tipos de datos se hayan indicado en el programa.

35

Alternativas

ADA: Unidades Genéricas

C++: Plantillas de funciones

36

Unidades Genéricas

El concepto de UNIDAD GENÉRICA Se utiliza para definir la parametrización de tipo.

Una unidad genérica es una unidad formal (modelo) cuyos parámetros son instalados en tiempo de traducción produciéndose una unidad actual.

Definición

37

Unidades Genéricas

La parametrización de tipos se implementa mediante

macro-expansión

Implementación

el concepto de

38

Unidades Genéricas

Sea el siguiente subprograma genérico en lenguaje Ada

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

Temp : T;begin

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

end;

En este caso, el tipo de dato de X e Y es el parámetro que debe ser sustituido en tiempo de traducción.

T: es el tipo de dato genérico

39

Unidades Genéricas

La producción de distintos subprogramas, que difieran sólo en el tipo de sus argumentos, se puede lograr, por ejemplo, mediante:

procedure Swapinteger is new Swap (integer);

procedure Swapreal is new Swap (real);

Generará dos subprogramas equivalentes.

40

Ejemplo

El código:

logical mas(logical in a, logical in b)

{ mas := a + b; }

permite obtener el resultado de la suma (or) de dos valores de tipo logical.

a) Agregar y/o modificar el código necesario para que la unidad "mas" permita, además, sumar valores de tipos integer, rational y real.

b) Citar el concepto utilizado en la parte anterior y, además, las formalidades de definición e implementación en modalidad Ada

41

Solución del ejemplo

generic type T

T Mas(T in a, T in b)

{ mas := a + b; }

b) Concepto: Parametrización de tipos.

Definición: Unidades genéricas.

Implementación: como macro-expansión

procedure Maslogical is new Mas (logical);

procedure Masinteger is new Mas (integer);

procedure Masreal is new Mas (real);

procedure Masrational is new Mas (rational);

a)

42

Plantillas de funciones

Se escribe una definición de plantilla de función

tantos códigos objeto de función como llamadas con diferentes tipos de argumentos existan.

Para que el compilador genere, en forma

automática,

43

Plantillas de funciones

void 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";

cout << "El arreglo A contiene: ";

Imprimir(a, 4);

cout << "El arreglo B contiene: ";

Imprimir(b,6);

cout << "El arreglo C contiene: ";

Imprimir(c, 5);

}

template <class T>

void Imprimir(T *V, int k)

{for(int i = 0; i < k; i++)

cout<< V[i] << " ";

cout<< endl;

}

44

Parametrización de Subprogramas

45

Subprogramas como parámetros

El envío de un subprograma como parámetro

Una referencia al segmento de código del parámetro actual y

La información respecto del entorno no local de ese parámetro.

requiere pasar

46

Subprogramas como parámetros

Un subprograma parámetro

se puede representar como un par ordenado (c,

r)

donde c es un puntero al segmento de código y r un puntero al registro de activación de la unidad que

contiene la definición del subprograma

47

Ejemplo

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

48

Ejemplo

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()

{ display(Uno(Dos(Tres(3),2),1)); }

a) Mostrar claramente la secuencia de invocaciones mediante el stack del registros de activación e indicar el valor desplegado en Main.

b) Citar y explicar claramente el concepto que más se destaca en este código.

Con respecto a la ejecución del siguiente código:

49

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

Solución

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()

{ display(Uno(Dos(Tres(3),2),1)); }

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

Uno:X: Dos(Tres(3),2)i : 1

1+ ___5 = 6

Stack de RA

k: 3Tres: 3

3 = 5

50

Ejemplo

Function F: Integer;Var k: Integer;Begin

Readln(k);If (k<>-1) then

F:= k+Felse

F:= 0;End;

Si se invoca x:= F;

Determinar la cantidad de veces que se ejecutó la sentencia Readln(k) si la memoria utilizada por el stack es de 60B.

Con respecto a la ejecución del siguiente código:

51

Solución

Tamaño del Stack de RA = Cantidad de RA * Tamaño del RA

La cantidad de veces que se ejecutó la sentencia Readln(k) es igual al N° de activaciones (o llamadas) de la función.

El N° de activaciones = Cantidad de RA

RAdelTamañostackdelTamaño

RAdeCantidad

52

Solución

Tamaño del Stack de RA = 60 B

Tamaño del RA

Variables locales: k : 2B (Integer)Valor de retorno : 2B (Integer)Dirección de retorno: 4B (LongInt)

51260 RA#

Enlace Dinámico : 4B (LongInt)

12 B

top related