1 / 36

6. PARAMETRIZACIÓN

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

donnan
Télécharger la présentation

6. PARAMETRIZACIÓN

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Cobol C Pascal Fortran 6. PARAMETRIZACIÓN SmallTalk Java C++

  2. Parametrizació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

  3. Valor Nombre Referencia Tipo Parametrización • Parametrización de datos • Nombre • Referencia • Valor • Parametrización de tipos • Tipo

  4. Parametrizació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

  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 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; }

  8. Llamada Por Nombre • <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

  9. sustitución a 7 5 d c sustitución a b uno: c d cero: b 5 7 Regla de sustitución en uno 7 5 c = 7; d = 5; 7 y 5 Llamada Por Nombre void cero() { int c, d; c = 5; d = 7; uno(c, d); cout << c << d; } void uno(name int a, name int b) { a = 7; b = 5; }

  10. dos(x); Llamada: Regla de sustitución 1 2 x := 2; write(x); dos: y x 1 uno: x 1 y x 2 x Llamada 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;

  11. swap(i, vi); Llamada: Regla de sustitución temp := i; i := v[i]; v[i] := temp; ? Efecto indeseado i = 3 y v[3] = 5 Si antes de la llamada: Pero queda: i = 5 y v[5] = 3 i=3 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5 6 7 i=5 i=5 4 4 4 6 6 6 5 5 3 2 2 2 7 7 3 1 1 1 3 3 3 Llamada Por Nombre procedure swap(name a, b : integer); var temp : integer; begin temp := a; a := b; b := temp; end;

  12. Llamada Por Referencia • <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

  13. 5 7 c d a b uno: c d b a cero: 5 7 5 7 y 5 7 Llamada Por Referencia void cero() { int c, d; c = 5; d = 7; uno(c, d); cout << c << d; } void uno(ref int a, ref int b) { a = 7; b = 5; }

  14. Llamada Por Valor • <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

  15. 7 5 5 7 d b c a a b uno: c d cero: 7 5 7 5 7 7 5 5 Asignaciones en la llamada 5 y 7 a = c; b = d; Llamada Por Valor 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; }

  16. Llamada Por Resultado • <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 formal es decir, • El valor del parámetro formal se copia como valor del correspondiente parámetro actual

  17. a b uno: c d cero: 7 7 5 5 7 7 5 c a 7 5 5 5 7 d b 7 y 5 c = a; d = b; Asignaciones al finalizar Llamada Por Resultado void cero() { int c, d; c = 5; d = 7; uno(c, d); cout << c << d; } void uno(out int a, out int b) { a = 7; b = 5; }

  18. Llamada Por Valor-Resultado • <Modalidad> ::= in-out • La provee lenguaje Ada • Efecto combinado de • LlamadaPor Valor, al invocar un subprograma, y • LlamadaPor Resultado, el terminar la ejecución de un subprograma

  19. a b uno: 7 7 c d cero: 5 7 5 5 5 7 c a 5 5 7 5 7 5 7 7 d b a = c; b = d; c = a; d = b; Al llamar: Al terminar: 7 y 5 Llamada Por Valor-Resultado void cero() { int c, d; c = 5; d = 7; uno(c, d); cout << c << d; } void uno(in-out int a, in-out int b) { a = 7; b = 5; }

  20. Llamada Por Indirección • <Modalidad> ::= in • La provee lenguaje C • Se trata de una LlamadaPor 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

  21. a b uno: 7 c d 100 5 c 100 a cero: 5 7 100 300 5 300 7 7 5 d 300 b a  referencia de c b referencia de d Al llamar: 7 y 5 Llamada Por Indirección 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; }

  22. Parametrización de tipos

  23. Problema • 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; }

  24. Solució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++)

  25. Unidades 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

  26. Unidades 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;

  27. Unidades 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);

  28. Unidades 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; }

  29. Unidades Genéricas • Solución a) b) generic type T; Tmas(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. Plantillas 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

  31. Plantillas de funciones • Sea la siguiente plantilla de función en C++ • Aquí, T es el parámetro de tipo del arreglo V template <class T> void imprimir(T *V, int k) { for(int i=0; i<k; i++) cout<< V[i] << " "; cout<< endl; }

  32. Plantillas de funciones • Producción de tres unidades actuales a partir de tres invocaciones con arreglos de distinto tipo base 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. Có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

  35. 1. P llama a B con el procedimiento A como parámetro actual Como B tiene definido un parámetro formal X, la llamada a X activa el procedimiento A 2. B se autoinvoca con el procedimiento C como parámetro actual Códigos como parámetros Procedure P... ··· Procedure A... ··· Begin ··· End; Procedure B(procedureX); 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

  36. k: 3 3 Tres: Y:Tres(3) j : 2 Dos: 2+ ___ 3 = 5 X: Dos(Tres(3),2) i : 1 Uno: 1+ ___ 5 = 6 print(Uno(Dos(Tres(3),2),1)) Main: 6 Stack de RA Có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)); }

More Related