Está en la página 1de 47

Lenguajes y Paradigmas de Programación

Análisis Semántico. Subprogramas.

Yamisleydi Salgueiro
Departamento de Ciencias de la Computación
Universidad de Talca
¿Dónde estamos?

2
¿Dónde estamos?
• Definición 1. La semántica es el significado de las expresiones,
declaraciones y unidades de programa.
• Un compilador debe comprobar si el programa fuente sigue tanto las
convenciones sintácticas como las semánticas del lenguaje fuente.
• Esta comprobación se conoce como comprobación estática, garantiza
la detección y comunicación de algunas clases de errores de
programación.
•…

3
Comprobaciones estáticas realizadas por
el compilador:

Análisis 1. Comprobaciones de tipo


2. Comprobaciones relacionadas

semántico con nombres


3. Comprobaciones de unicidad
4. Comprobaciones de flujo de
control

4
Flujo de control

El Flujo de Control u Orden de ejecución


del programa es fundamental pues
determina qué se debe ejecutar primero,
qué segundo, y así sucesivamente para
lograr una tarea.

5
Agenda
• Introducción
• Abstracción procedural
• Mecanismos de paso de parámetros
• Funciones de orden superior

6
Introducción
• Todo programa sin importar su complejidad está compuesto por
muchos componentes, cada uno de los cuales sirve para proporcionar
partes de una solución global.
• La descomposición de un problema en subproblemas permite una
mejor gestión de la complejidad.
• La solución del problema global se obtiene mediante la adecuada
composición de las soluciones de estos subproblemas.

7
Introducción
• Para que todo esto sea eficiente, es necesario que el lenguaje de
programación proporcione un soporte que facilite y haga posible
estas subdivisiones y, por tanto, la recomposición.
• Abstracción procedural: una colección potencialmente compleja de
construcciones de control (una subrutina/ función/ método/
subprograma) se encapsula de una manera que permite tratarla como
una sola unidad, generalmente sujeta a parametrización.

8
Introducción
• El concepto clave que proporcionan todos los lenguajes modernos es
el de subprograma, procedimiento o función*.
• Estos tres términos tienen distintos significados en diferentes
lenguajes.
Por ejemplo, "subprograma" suele ser el término más general. En los
lenguajes de la familia Algol y sus descendientes, un procedimiento es
un subprograma que modifica el estado, mientras que una función es
un subprograma que devuelve un valor.

*En este curso, utilizaremos los tres términos como sinónimos.


9
Agenda
• Introducción
• Abstracción procedural
• Mecanismos de paso de parámetros
• Funciones de orden superior

10
Funciones
• Una función es un trozo de código identificado por un nombre, se le
da un ambiente local propio y es capaz de intercambiar información
con el resto del código mediante parámetros.
• Una función intercambia información con el resto del programa
mediante tres mecanismos principales: parámetros, valor de retorno,
ambiente no local.

11
Características generales de las funciones
• Cada subprograma tiene un solo punto de entrada.
• La unidad del programa que llama se suspende durante la ejecución
del subprograma llamado, lo que implica que solo hay un
subprograma en ejecución en un momento dado.
• El control siempre regresa al que llama cuando finaliza la ejecución
del subprograma.

12
Características generales de las funciones
Típicamente tienen:
• un nombre,
• una secuencia de parámetros
• declaraciones locales de variables y
• un cuerpo de sentencias.

13
Elementos generales de las funciones
• Definición de la función: describe la interfaz y las acciones de la
abstracción del subprograma.
• Llamada de la función: es la solicitud explícita de que se ejecute un
subprograma específico.
• Función activa: después de haber sido llamado (ha comenzado la
ejecución pero aún no ha completado esa ejecución).

14
Encabezado de un subprograma. Ejemplos
• C: void adder (parameters)
...
• JavaScript: function adder (parameters)
...
• Python: def adder (parameters):
...

15
C++ example
#include <stdio.h>
int addNumbers(int a, int b);//function prototype
int main(){
...
sum = addNumbers(n1, n2);//function call
return 0;
}
int addNumbers(int a,int b) {//function definition
...
}

16
Agenda
• Introducción
• Abstracción procedural
• Mecanismos de paso de parámetros
• Funciones de orden superior

17
Paso de parámetros
• Parámetros formales: nombres de los parámetros que se usan
cuando se declara una función (se comportan como variables locales
de la propia función).
• Parámetros reales: parámetros usados cuando se llama a una función
(valores efectivos de los parámetros formales en una llamada
concreta a la función).

18
Paso de parámetros por keyword
• Durante una llamada a una función, los parámetros pasados no
necesitan estar en el mismo orden de la definición de la función.
• Esto puede lograrse mediante kwarg=value.

19
Paso de parámetros por keyword
• En la 1ra llamada a add: el
orden de los parámetros no
necesariamente tiene que
coincidir con el orden en que
fueron definidos.
• En la 2da llamada a add: solo
son necesarios los keyword
obligatorios. Los parámetros
opcionales se omiten.

20
Paso de parámetros. Ejemplo
proc p(int x, int y){ • Los identificadores x e y son
if (x > y) then ...; parámetros formales del
procedimiento p.
...
• Los parámetros reales en la
x := y * 2 + 3; llamada a p son z y 4*z+1.
...
}
p(z, 4 * z+1);
...

21
Paso de parámetros posicionales
La correspondencia entre los parámetros reales y formales, o el
binding entre ellos, se realiza por posición: el primer parámetro real
está vinculado al primer parámetro formal y así sucesivamente.
Tales parámetros son llamados parámetros posicionales.

Paso de parámetros: la forma en que los parámetros reales se evalúan


y se pasan a la función depende del lenguaje de programación y el tipo
de mecanismo de paso de parámetros que utiliza.

22
Mecanismos de paso de parámetros
Los mecanismos de paso de parámetros tienen cuatro
implementaciones básicas:
• valor
• referencia (aliasing)
• valor/resultado (copying)

23
24
Paso por valor (call-by-value)
• Es la estrategia de evaluación más común en los lenguajes de
programación.
• Es una forma estricta de pasaje de parámetros, es decir, que el
argumento se evalúa, y el valor que se obtiene (su R-valor) se liga a
una variable local de la función, en general copiando el valor a una
nueva ubicación de memoria en el activation record de la llamada a
función.

25
Paso por valor (call-by-value). Ejemplo
• Ejemplo en C++ de paso de
parámetros por valor.

26
Paso por valor (call-by-value). Ejemplo
• Ejemplo en C++ de paso de
parámetros por valor.
R/ 10, 20

27
Paso por referencia (call-by-reference)
• En este caso se tiene un único valor referenciado (o apuntado) desde
dos lugares diferentes, (i) el programa principal y (ii) la función a la
que se le pasa el argumento, por lo que cualquier acción sobre el
parámetro se realiza sobre la misma posición de memoria (aliasing).
• Esto significa que la función que es llamada puede modificar la
variable con efecto en el bloque que llama a la función.

28
Paso por referencia (call-by-reference)

• Ejemplo en C++ de paso de


parámetros por
referencia.

29
Paso por referencia (call-by-reference)
• Ejemplo en C++ de paso de
parámetros por
referencia.
R/ 12, 15

30
Paso por valor/resultado (call-by-result)
• Se basa en que, dentro de la función, se trabaja como si los
argumentos hubieran sido pasados por valor pero al acabar la función
los valores que tengan los argumentos serán copiados a la ubicación
de memoria de la variable inicialmente pasada.

31
Paso por valor/resultado (call-by-result)
• El siguiente método C#, que
especifica el método de paso por
resultado con el especificador
out en su parámetro formal.

32
Ejercicio 1

¿Qué dos valores se imprimen si k


se pasa...
• por valor?
• por valor-resultado?
• por referencia?

33
Ejercicio 1

¿Qué dos valores se imprimen si k


se pasa...
• por valor?
R/ 6 4
• por valor-resultado?
R/ 6 18
• por referencia?
R/ 6 18

34
Ejercicio 2

35
Ejercicio 2

Cuáles son los valores impresos por el programa bajo las siguientes
condiciones:
• Todos los parámetros son pasados por valor.
• Los parámetros a y b son pasados por referencia y c por valor.
• Los parámetros a y b son pasados por valor-resultado y c es pasado
por valor.

36
Ejercicio 2
Cuáles son los valores impresos por el programa bajo las siguientes
condiciones:
• Todos los parámetros son pasados por valor.
R/ 1er print -> 10, 39, 25
2do print -> 10, 15
• Los parámetros a y b son pasados por referencia y c por valor.
R/ 1er print -> 44, 44, 25
2do print -> 44, 15
• Los parámetros a y b son pasados por valor-resultado y c es pasado
por valor.
R/ 1er print -> 10, 39, 25
2do print $->$ 39, 15
37
Problemas de diseño para
subprogramas
• ¿Qué método o métodos de paso de
parámetros son usados?
• ¿Se verifican los tipos de parámetros reales
contra los tipos de los parámetros formales?
• ¿Se permiten efectos secundarios
funcionales?
• ¿Qué tipos de valores se pueden retornar
desde las funciones?

38
Problemas de diseño para
subprogramas
• ¿Cuántos valores se pueden devolver
desde una función?
• ¿Se pueden sobrecargar los
subprogramas?
• ¿Pueden los subprogramas ser genéricos?

39
Agenda
• Introducción
• Abstracción procedural
• Mecanismos de paso de parámetros
• Funciones de orden superior

40
Funciones de orden superior
• Una función es de orden
superior cuando acepta como
parámetros, o retorna como
resultado otra función.

41
Funciones como parámetros.
Ejemplo en un pseudo lenguaje
• Cuando definimos la función g (línea 6)
esta tiene como parámetro formal a la
función h.
• Al llamar a la función g (en la línea 12)
pasamos como parámetro real la
función f por lo que dentro de g
tendrá el alias h.

¿Qué valor se le asignaría a z?


42
Funciones como retorno.
Ejemplo en un pseudo lenguaje
• Cuando definimos la función F (línea 3)
dentro definimos otra función g (líneas
4, 5 y 6) la que luego retornamos (línea
7).
• Por void->int denotamos el tipo de
las funciones que no toman argumento
(void) y devuelven un valor de tipo
entero (int).
• !!Importante: return g devuelve la
"función", no su aplicación.
¿Qué valor se le asignaría a z?
43
Funciones como retorno
• En general, cuando una función devuelve una función como
resultado, este resultado es un closure (cierre).

44
Resumen…
• La abstracción procedural permite encapsula código de manera que
permite tratarlo como una sola unidad, generalmente sujeta a
parametrización.
• La abstracción procedural incluye subrutinas, funciones, métodos y
subprogramas.
• Los mecanismos de paso de parámetros a las funciones pueden ser
por: valor, valor/resultado y referencia. Estos mecanismos deben
tenerse en cuenta a la hora de manejar los parámetros reales.

45
Estudio Autónomo
• Revise la siguiente literatura:
Del libro "Programming Language Pragmatics", 4th Edition, Michael L.
Scot, 2016. Capítulo 7, epígrafes 7.1 y l7.2.
• Realizar los ejercicios de estudio autónomo del Educandus.

46
Lenguajes y Paradigmas de Programación
Análisis Semántico. Subprogramas.

Yamisleydi Salgueiro
Departamento de Ciencias de la Computación
Universidad de Talca

También podría gustarte