Post on 22-Feb-2016
description
1
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
3
Parametrización de datos Nombre Referencia Valor
Parametrización de tipos Tipo
Parametrización
Nombre Tipo Referencia Valor
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
5
Parametrización de datos
6
Por Nombre Por Referencia Por Copia
Por Valor Por Resultado Por Valor-Resultado
Por Indirección
Opciones de llamada
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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;}
22
Parametrización de tipos
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
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
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
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;
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);
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; }
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);
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
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;}
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;
}
33
Parametrización de subprogramas
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
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
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