Documento 89540

Anuncio
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
Descargar