La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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.

Presentaciones similares


Presentación del tema: "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."— Transcripción de la presentación:

1 1 6. PARAMETRIZACIÓN

2 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 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 4 Parametrización 1. Parametrización de datos 2. Parametrización de tipos 3. Parametrización de subprogramas  Nombre  Referencia  Valor  Tipo

5 5 Parametrización de Datos

6 6 Opciones de Llamada  Por Nombre Por Nombre  Por Referencia Por Referencia  Por Copia Por Copia  Por Valor Por Valor  Por Resultado Por Resultado  Por Valor-Resultado Por Valor-Resultado  Por Indirección Por Indirección

7 7 Subprogramas de ejemplo Procedure Uno( 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 8 Parametrización por Nombre ::= Name

9 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 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 b Uno: 7 5 5 7 c d Cero: c := 7; b := 5 Regla de sustitución en UNO 7 y 5 sustitución

11 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: x Dos: y x 1 x 2 x 1 y

12 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: c Tres: c d Swap: a b temp 5 7 5 ab 7,5 c 5 d 7 temp 5 7 5 5

13 13 Gráficamente Dos: c: 4 Swap a b temp: 5 c:5 d:7 temp: 5 Tres 7575 5 7,5

14 14 Efectos inesperados Procedure Swap(name a, b : integer); var temp : integer; begin temp := a; a := b; b := temp; end; swap(i, v  i  ); 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 4652713 i=3 1 2 3 4 5 6 7 4652313 i=5 ? 1 2 3 4 5 6 7 4632713 i=5

15 15 Parametrización Por Referencia ::= Ref

16 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 17 5 7 c d Cero: 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 b Uno: 7 y 5 7 5 c 5 d 7 a b

18 18 Parametrización por Copia Por Valor Por Resultado Por Valor-Resultado

19 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 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 ::= in

21 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 b Uno: a 5 b 7 5 7 c d Cero: Asignación en la llamada: a:= c; b:= d; 5 y 7 7 5 7 5

22 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. ::= out

23 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 b Uno: 5 7 c d Cero: Asignación al final de la ejecución: c:= a; d:= b; 7 y 5 7 5 7 5 7 5

24 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. ::= in-out a)Al efectuarse una invocación se realizan las asignaciones de los VALORES a los parámetros formales

25 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 b Uno: 5 7 c d Cero: 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 26 Parametrización por Indirección

27 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. ::= 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 28 Ejemplo c100 5 d300 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 b Uno: 5 7 c d Cero: 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 29 Resumen Aunque la implementación es diferente, las siguientes modalidades generan el mismo efecto: Por nombre Por referencia Por resultado Por valor-resultado Por indirección

30 30 Parametrización de Tipos

31 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 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 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 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 35 Alternativas ADA: Unidades GenéricasUnidades Genéricas C++: Plantillas de funcionesPlantillas de funciones

36 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 37 Unidades Genéricas La parametrización de tipos se implementa mediante macro-expansión Implementación el concepto de

38 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 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 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 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 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 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 void Imprimir(T *V, int k) {for(int i = 0; i < k; i++) cout<< V[i] << " "; cout<< endl; }

44 44 Parametrización de Subprogramas

45 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 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 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 48 Ejemplo i nt 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 49 Dos: Y: Tres(3) j : 2 2+ ___ Solución i nt 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: 3 Tres: 3 3 = 5

50 50 Ejemplo Function F: Integer; Var k: Integer; Begin Readln(k); If (k<>-1) then F:= k+F else 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 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

52 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) Enlace Dinámico : 4B (LongInt) 12 B


Descargar ppt "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."

Presentaciones similares


Anuncios Google