Title: 6. PARAMETRIZACI
16. PARAMETRIZACIÓN
C
Cobol
Pascal
Fortran
SmallTalk
Java
C
2Parametrización
- 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
3Parametrización
- Parametrización de datos
- Nombre
- Referencia
- Valor
- Parametrización de tipos
- Tipo
4Parametrización
- 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
5Parametrización de datos
6Opciones de llamada
- Por Nombre
- Por Referencia
- Por Copia
- Por Valor
- Por Resultado
- Por Valor-Resultado
- Por Indirección
7Subprogramas de ejemplo
void uno(ltModalidadgt int a, ltModalidadgt int
b) a 7 b 5 void cero() int c,
d c 5 d 7 Uno(c, d) cout ltlt c
ltlt d
8Llamada Por Nombre
- ltModalidadgt 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
9Llamada Por Nombre
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 ltlt c ltlt d
10Llamada Por Nombre
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
11Llamada Por Nombre
procedure swap(name a, b integer) var temp
integer begin temp a a b b
temp end
12Llamada Por Referencia
- ltModalidadgt 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
13Llamada Por Referencia
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 ltlt c ltlt d
14Llamada Por Valor
- ltModalidadgt 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
15Llamada Por Valor
void cero() int c, d c 5 d 7
uno(c, d) cout ltlt c ltlt d
void uno(in int a, in int b) a 7 b
5
16Llamada Por Resultado
- ltModalidadgt 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 formal
- es decir,
- El valor del parámetro formal se copia como valor
del correspondiente parámetro actual
17Llamada Por Resultado
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 ltlt c ltlt d
18Llamada Por Valor-Resultado
- ltModalidadgt 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
19Llamada Por Valor-Resultado
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 ltlt c ltlt d
20Llamada Por Indirección
- ltModalidadgt 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
21Llamada Por Indirección
void uno(in int a, in int b) a 7 b
5
void cero() int c, d c 5 d 7
uno(c, d) cout ltlt c ltlt d
22Parametrización de tipos
23Problema
- La función
- suma los n40 elementos enteros de un arreglo v
- Sin embargo, para sumar los n60 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, s0 for
(i0 iltn i) s s vi return
s
24Solución
- 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)
25Unidades Genéricas
- 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
26Unidades Genéricas
- Sea el siguiente subprograma genérico en Ada
- Aquí, T es el parámetro de tipo de los datos X e Y
generic type T procedure Swap(X, Y in out T)
is Temp T begin Temp X X Y Y
Temp end
27Unidades Genéricas
- Producción de tres subprogramas que sólo difieren
en el tipo de sus parámetros
procedure Swapint is new Swap (integer) procedure
Swapreal is new Swap (real) procedure Swapchar
is new Swap (char)
28Unidades Genéricas
- Problema
- El código
- retorna la suma (or) de dos valores de tipo
logical - a) Efectuar las modificaciones necesarias para
que mas se convierta en unidad genérica - b) Declarar las instancias de producción de
cuatro versiones de mas que permitan sumar
valores de tipo logical, integer, rational y real
logical mas(logical in a, logical in b) return
a b
29Unidades 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)
30Plantillas de funciones
- 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
31Plantillas de funciones
- Sea la siguiente plantilla de función en C
- Aquí, T es el parámetro de tipo del arreglo V
template ltclass Tgt void imprimir(T V, int k)
for(int i0 iltk i) coutltlt Vi ltlt " "
coutltlt endl
32Plantillas de funciones
- Producción de tres unidades actuales a partir de
tres invocaciones con arreglos de distinto tipo
base
int main() int a4 1, 2, 3, 4 float
b6 1.1, 2.2, 3.3, 4.4, 5.5, 6.6 char c5
"Hola" imprimir(a, 4) imprimir(b,
6) imprimir(c, 5) return 0
33Parametrización de subprogramas
34Códigos como parámetros
- 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
35Códigos como parámetros
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
Una segunda invocación a X activará el
procedimiento C
36Códigos como parámetros
Ejercicio Mostrar las variaciones que presenta el
stack del registros de activación e indicar el
valor finalmente impreso, al ejecutarse el código
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))