Departamento de Informática Universidad Técnica Federico Santa María Departamento de Informática Lenguajes de Programación Lenguajes de Programación Universidad Técnica Federico Santa María Características de un Subprograma • Permite crear abstracción de proceso: 2.7 Subprogramas – encapsulando código – definiendo una interfaz de invocación para paso de parámetros y resultados Ámbito, comprobación de tipos, semántica de paso de parámetros, funciones genéricas, implementación • Permite reutilizar código, ahorrando memoria y tiempo de codificación. • Existe en forma de procedimiento y función. 1 RMA/2000 Departamento de Informática Subprograma • Parámetros (Opcional): Define la comunicación de datos (nombre, orden y tipo de parámetros formales): • Valor de retorno: Opcional para funciones (tipificado). • Excepciones (Opcional): Permite manejo de un evento de excepción al retornar el control. Activación Retorno Resultados RMA/2000 II- 3 Departamento de Informática RMA/2000 II- 4 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María • La firma (signature) es un contrato entre el invocador y el subprograma que define la semántica de la interfaz. Lenguajes de Programación Parámetros Firmas y Protocolos de la Interfaz • Parámetros formales son un variables mudas que se ligan a los parámetros reales cuando se activa el subprograma. – Normalmente ligado se hace según posición en la lista. • El protocolo especifica cómo debe realizarse la comunicación de parámetros y resultados (tipo y orden de los parámetros y, opcionalmente, valor de retorno). • Parámetros permiten comunicación explícita de datos y, a veces, también (otros) subprogramas. • Comunicación implícita se da a través de variables no locales, lo que puede provocar efectos laterales. procedure random( in real semilla; out real aleat); RMA/2000 Lenguajes de Programación • Nombre: permite referenciar al subprograma como unidad e invocarlo. Parámetros Reanudación Universidad Técnica Federico Santa María Elementos en la Definición de Interfaces de Subprogramas Mecanismo de Invocación Universidad Técnica Federico Santa María II- 2 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Invocación y suspensión RMA/2000 II- 5 RMA/2000 II- 6 Departamento de Informática Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Lenguajes de Programación Universidad Técnica Federico Santa María Variables Locales Estáticas y Dinámicas de Stack Subprogramas en Cy C++ Característica Estática Overhead de Sin costo Asignación Acceso Directo (rápido) Memoria No comparte Historia sensible Recursión No soporta float potencia( float base, float exp); calculo = x * potencia(y, 2.5); int notas[50]; ... void sort (int lista[], int largo); ... sort(notas, 50); RMA/2000 II- 7 Departamento de Informática Dinámica Con costo Indirecto (lento) Comparte insensible Si soporta RMA/2000 II- 8 Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Œ Paso por Valor Semántica de Paso de Parámetros • Modo de interacción de parámetro actual a formal puede ser: – entrega de valor (IN) – recibo de valor (OUT) – ambos (INOUT) Lenguajes de Programación (pass-by-value) • Modo IN e implementado normalmente con copia de valor – Implementación con paso de referencia requiere protección de escritura, que puede ser difícil • Permite proteger de modificaciones al parámetro actual, pero es más costoso • La implementación de la transferencia de datos puede ser: – (más memoria y tiempo de copiado) • Permite usar expresiones como parámetro actual – copiando valores, o – pasando referencias (o puntero) RMA/2000 II- 9 Departamento de Informática RMA/2000 II- 10 Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Lenguajes de Programación • Paso por Resultado Ž Paso por Valor-Resultado (pass-by-result) (pass-by-value-result) • Modo INOUT con copia de parámetros en la entrega y en el retorno • Modo OUT y normalmente implementado con copia (mismas complicaciones que por valor) • Parámetro formal actúa como variable local, pero al retornar copia valor a parámetro actual • Parámetro actual debe ser variable • Dificultades: – Por esto llamada a veces paso por copia • Mismas dificultades que paso por valor y paso por resultado – Existencia de colisiones en los parámetros actuales, puede conducir a ambigüedad – Cuándo se evalúa dirección de parámetro actual? RMA/2000 II- 11 RMA/2000 II- 12 Departamento de Informática Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María • Paso por Referencia • Paso por Nombre (pass-by-reference) (pass-by-name) • Modo INOUT e implementación con referencias • Parámetro formal y real comparten misma variable • Modo INOUT, pero diferente a los modelos anteriores • Ventaja: Comunicación es eficiente en: • Nombres del parámetro real se liga al parámetro formal en el momento de la activación, pero valor o dirección se liga en el momento de la referencia • Es muy flexible, pero costoso (lento) y difícil de implementar y entender • Usado en ALGOL 60, discontinuándolo en versiones sucesivas – espacio (no requiere duplicar variable) – tiempo (no requiere copiar) • Desventaja – Acceso es más lento (indirección) – Es fuente de error (modificación de parámetro real) – Creación de alias a través de parámetros actuales RMA/2000 II- 13 Departamento de Informática RMA/2000 II- 14 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Ejemplo 1: Ejemplo 2: Paso por Referencia vs. Paso por Valor-Resultado Paso por Referencia vs. Paso por Nombre procedure EJEMPLO2; integer INDICE; integer array LISTA[1.2]; procedure EJEMPLO1; integer X; procedure SUB(inout integer PARAM) begin X := 2; PARAM := PARAM +1; end; begin {EJEMPLO1} X := 1; SUB( X); end ; Por Referencia: X=3 procedure SUB(PARAM) integer PARAM; begin PARAM := 4; INDICE := INDICE + 1; PARAM := 5; end; {SUB} begin {EJEMPLO2} INDICE := 1; LISTA[1] := 2; LISTA[2] := 3; SUB(LISTA[INDICE]); end; Por Valor-Resultado: X=2 RMA/2000 II- 15 Departamento de Informática Universidad Técnica Federico Santa María Por Referencia: LISTA = [5,3] Por Nombre: LISTA = [4,5] RMA/2000 II- 16 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Lenguajes de Programación Paso de Parámetros en C y C++ Paso de Parámetros en otros Lenguajes Populares • C: Paso por valor, y por referencia usando punteros (parámetros deben ser desreferenciados). • Java: Todos los parámetros son pasados por valor, excepto objetos que se pasan por referencia – Puntero pueden ser calificado con const; se logra semántica de paso por valor (sin permitir asignación) – Arreglos se pasan por referencia (son punteros) – No existencia de punteros no permite paso por referencia de escalares (si como parte de un objeto) • C++: Igual que C, más paso por referencia usando operador & (sin necesidad de desreferenciar). – Este operador también puede ser calificado con const, permitiendo semántica paso por valor con mayor eficiencia (e.g. paso de grandes arreglos) RMA/2000 II- 17 • Pascal y Modula-2: Por defecto paso por valor, y por referencia si se usa calificativo var. • ADA: Por defecto paso por valor, pero todos los parámetros se pueden calificar con in, out y inout. RMA/2000 II- 18 Departamento de Informática Universidad Técnica Federico Santa María Departamento de Informática Lenguajes de Programación Lenguajes de Programación Universidad Técnica Federico Santa María Comprobación de Tipos de Parámetros Comprobación de Tipos de Parámetros en C++ • Tendencia es a realizar comprobación de tipos, lo cual permite detectar errores. • Pascal, Modula-2, Fortran 90, Java y ADA lo requieren. • C en su primera versión no lo requiere, pero a partir de ANSI C si (método de prototipo). • Todas las funciones deben usar la forma de prototipo (ANSI C lo adoptó de C++) double power (double base, float exp); • Sin embargo se puede desactivar mediante una elipsis int printf(const char* ...); – Ante incompatibilidad de tipos el compilador realiza coerción, si es posible RMA/2000 II- 19 Departamento de Informática Universidad Técnica Federico Santa María • Comunicación de parámetro se realiza mediante el stack – Por valor: Al invocar, valor de la variable se copia al stack. – Por resultado: Al retornar, valor se copia del stack a la variable. – Por valor-resultado: combinando las anteriores. – Por referencia: Se escribe la dirección en el stack y luego se usa direccionamiento indirecto (el más simple de implementar). II- 21 Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Funciones como Parámetro • En Pascal function integrar (function fun(x:real): real; bajo, alto: real) : real; ... x := integrar(coseno, -PI/2, PI/2); ... • En C (solo usando punteros a funciones) float integrar (float *fun(float), float bajo, float alto ); ... x = integrar(&coseno, -PI/2, PI/2); ... RMA/2000 II- 22 Departamento de Informática Lenguajes de Programación • En el mismo ámbito existen diferentes subprogramas con el mismo nombre. Lenguajes de Programación Universidad Técnica Federico Santa María Ejemplo: Sobrecarga de Funciones en C++ Sobrecarga de Subprogramas double abs(double); int abs(int); • Cada versión debiera tener una firma diferente, de manera que a partir de los parámetros reales se pueda resolver a cual versión se refiere. • Las versiones pueden diferir en la codificación • Es una conveniencia notacional, que es evidente cuando se usan nombres convencionales, como en siguiente ejemplo RMA/2000 II- 20 Departamento de Informática Lenguajes de Programación Implementación de los Métodos de Paso de Parámetro RMA/2000 RMA/2000 II- 23 abs(1); abs(1.0); // invoca int abs(int); // invoca double abs(double); // se sobrecargará print void print(int); void print (char*); RMA/2000 II- 24 Departamento de Informática Universidad Técnica Federico Santa María Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Subprogramas Genéricos Lenguajes de Programación Funciones Genéricas en C++ • Permite crear diferentes subprogramas que implementan el mismo algoritmo, el cual actúa sobre diferentes tipos de datos . • Mejora la reutilización, aumentando productividad en el proceso de desarrollo de software. template <class Tipo> Tipo maximo (Tipo a, Tipo b) { return a>b ? a : b; } • Polimorfismo paramétrico: Parámetros genéricos de tipos usados para especificar los tipos de los parámetros de un subprograma int x, y, z; char u, v, w; z = maximo(x, y); w = maximo(u, v); • Sobrecarga de subprogramas corresponde a un polimorfismo ad-hoc RMA/2000 II- 25 Departamento de Informática Universidad Técnica Federico Santa María II- 26 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Lenguajes de Programación Compilación Separada e Independiente Sobrecarga de Operadores definida por el Usuario • Compilación Separada: unidades de programas pueden compilarse en diferentes tiempos, pero se consideran dependencias (tal como comprobación de interfaces, variables, etc.) de acuerdo a lo que exporta e importa (e.g. ADA) • Compilación Independiente: Se compilan unidades de programa sin información de otras (e.g. C, C++ y Fortran) • Permite que el usuario sobrecargue operadores existentes en el lenguaje (Lo permiten ADA y C++) int operator * ( const vector &a, const vector &b, int len) { int sum = 0; for (int i = 0; i < len; i++) sum += a[i] + b[i]; return sum; } ... vector x, y; ... printf(“%i”, x + y); RMA/2000 RMA/2000 • Es mejor compilación separada, pero es mejor tener compilación independiente que no tener nada II- 27 RMA/2000 II- 28