Semántica de subrutinas
Pasaje por valor:
En el pasaje por valor los argumentos reales son copiados en los parámetros formales. Todo
procesamiento que se haga en la subrutina sobre estos parámetros no afecta a los valores originales de
los argumentos reales.
No es un método adecuado para pasar objetos de datos grandes que ocupan mucho espacio en
memoria, puesto que mantener duplicados de objetos grandes implica un uso poco eficiente de la
memoria.
Dado que se copian valores, los argumentos reales pueden ser:
Variables: se extrae y pasa su valor
Expresiones: se calcula el resultado y se pasa este resultado.
Constantes literales: se pasa el valor constante.
Si un parámetro se transmite por valor, el valor (es decir, el valor r) del parámetro real se pasa al
parámetro formal llamado. El mecanismo de implementación es similar al modelo de llamada por
referencia, excepto que:
Al invocar un subprograma, un parámetro de llamada por referencia pasa su valor 1, en tanto que un
parámetro de llamada por valor pasa su valor r.
Semántica de subrutinas
Cuando se hace la referencia en el subprograma, un parámetro de llamada por referencia utiliza el
valor 1 guardado en el parámetro formal para tener acceso al objeto de datos real, mientras que, en
la llamada por valor, el parámetro formal contiene el valor que se usa.
Una vez que un parámetro real se pasa por valor, el parámetro formal no tiene acceso a modificar el valor
del parámetro real. Todos los cambios hechos a los valores del parámetro formal durante la ejecución del
subprograma se pierden cuando el subprograma termina
Pasaje por referencia:
En este método, el l-value (referencia) de cada argumento real es copiado en los parámetros formales.
De esta forma, cualquier procesamiento que se realiza sobre el parámetro formal afectará al objeto de
datos referenciado por el argumento real. Dado que en el pasaje por referencia se pasa una dirección de
memoria o l-value, no es factible pasar constantes o expresiones por referencia. En tal caso se termina
forzando un pasaje por valor.
La llamada por referencia es tal vez el mecanismo más común de transmisión de parámetros. Transmitir
un objeto de datos como parámetro de llamada por referencia significa que se pone a disposición del
subprograma un apuntador a la localidad del objeto de datos. El objeto de datos mismo no cambia de
posición en la memoria.
El paso de parámetros de llamada por referencia tiene lugar en dos etapas:
1. En el programa de llamada, cada expresión de parámetro real se evalúa para dar un apuntador al
objeto de datos del parámetro real (es decir, su valor 1). Se guarda una lista de estos apuntadores en un
área de almacenamiento común que también es accesible para el programa que se está llamando (a
menudo en un conjunto de registros internos o en la pila del programa). El control se transfiere luego al
subprograma, es decir, se crea el registro de activación para el subprograma (si es necesario), se establece
el punto de regreso, y así sucesivamente.
2. En el subprograma llamado, se tiene acceso a la lista de apuntadores a parámetros reales para
recuperar los valores r apropiados de los parámetros reales.
Durante la ejecución del subprograma, las referencias a nombres de parámetros formales se tratan como
referencias ordinarias a variables locales. Al terminar el subprograma, los resultados son regresados al
programa de llamada también a través de los objetos de datos de parámetro real
Semántica de subrutinas
Pasaje por resultado:
El pasaje de argumentos por resultado permite que la subrutina devuelva más de un valor como
resultado. A diferencia del pasaje por referencia, en el pasaje por resultado los argumentos reales
pueden no estar inicializados. Lógicamente, no se pueden pasar constantes o expresiones por
resultados.
Un parámetro transmitido por resultado se usa sólo para transmitir un resultado de regreso desde un
subprograma. El valor inicial del objeto de datos de parámetro real no importa y el subprograma no
lo puede usar. El parámetro formal es una variable (objeto de datos) local sin valor inicial (o con la
inicialización usual que se proporciona para variables locales). Cuando el subprograma termina, el
valor final del parámetro formal se asigna como el nuevo valor del parámetro real, justamente como
en la llamada por valor-resultado
Pasaje por valor-resultado:
Este mecanismo propone una combinación de los mecanismos por valor y por resultado (in out). Dentro
de la función activada se trabaja como si los argumentos hubieran sido pasados por valor, pero al finalizar
la ejecución de la subrutina los valores que tengan los parámetros formales serán copiados en los
argumentos reales, modificando su valor.
Si un parámetro se transmite por valor-resultado, el parámetro formal es una variable (objeto de datos)
local del mismo tipo de datos que el parámetro real. El valor (es decir, el valor r) del parámetro real se
copia en el objeto de datos de parámetro formal en el momento de la llamada, de modo que el efecto es
el mismo que si se ejecutara una asignación explícita de parámetro real a parámetro formal. Durante la
ejecución del subprograma, todas las referencias al nombre del parámetro formal se tratan igual que una
referencia ordinaria a una variable local. El parámetro real conserva su valor original hasta la terminación
del subprograma, cuando se asigna su nuevo valor como resultado del subprograma.
Pasaje por nombre
Este modelo de transmisión de parámetros contempla una llamada de subprograma como una sustitución
del cuerpo completo del subprograma.
en el punto de llamada del subprograma no se evalúen los parámetros reales sino hasta que
efectivamente se haga referencia a ellos en el subprograma. Los parámetros se transmiten sin evaluar, y
el subprograma llamado determina cuando, en su caso, se evalúan efectivamente.
La regla básica de llamada por nombre se puede enunciar en términos de sustitución: el parámetro formal
del cuerpo del programa llamado se debe sustituir en todas partes por el parámetro real antes de que se
inicie la ejecución del subprograma.
Semántica de subrutinas
Pasaje por evaluación tardía:
Esta forma de pasaje de argumentos permite implementar el pasaje de expresiones como argumentos a
otras funciones, con un comportamiento diferente, llamado evaluación tardía o perezosa (lazy) La
evaluación tardía posterga la evaluación de la expresión hasta el momento en que verdaderamente se usa
en la subrutina llamada. Es decir, no se anticipa a calcular el resultado y enviar un valor. Espera hasta que
el parámetro formal (el nombre) sea efectivamente usado en la subrutina.
Pasaje por valor constante:
Si un parámetro se transmite por valor constante, entonces no se permite cambio alguno en el valor del
parámetro formal durante la ejecución del programa; es decir, no se permite asignar un nuevo valor u
otra modificación del valor del parámetro, y el parámetro formal no se puede transmitir a otro
subprograma excepto como parámetro de valor constante. El parámetro formal actúa, así como una
constante local durante la ejecución del subprograma.
Tanto la llamada por valor como la llamada por valor constante tienen el efecto de proteger al programa
que llama contra cambios en el parámetro real. Así pues, desde el punto de vista del programa que llama,
el parámetro real es sólo un argumento de entrada para el subprograma. Su valor no puede ser
modificado por el subprograma, ya sea inadvertidamente o para transmitir los resultados de regreso.
evaluación ansiosa: Si en un pasaje por referencia se pasa una expresión, se fuerza el pasaje por valor y
el comportamiento es el mismo que el pasaje por valor. Este tipo de comportamiento se llama evaluación
ansiosa.
Algunos lenguajes, soportan el uso de lista variable de parámetros. Es decir, subprogramas a los cuales
podemos invocar con más o menos parámetros dependiendo de la ocasión.
Un objeto de datos que es estrictamente local es usado por operaciones sólo dentro de un único
ambiente local de referencia, por ejemplo, dentro de un solo subprograma. Los objetos de datos, sin
embargo, suelen compartirse entre varios subprogramas para que las operaciones de cada uno de los
subprogramas puedan utilizar los datos. Un objeto de datos se puede transmitir como un parámetro
explícito entre subprogramas
Se usan cuatro enfoques básicos en cuanto a ambientes no locales en los lenguajes de programación:
ambientes comunes explícitos y ambientes no locales implícitos con base en
alcance dinámico
alcance estático
herencia
Semántica de subrutinas
Parámetros reales y formales:
El término argumento se usa para un objeto de datos (o un valor) que se envía a un subprograma u
operación primitiva como uno de sus operandos, es decir, como un dato para usarse en el procesamiento.
El término resultado se refiere a un dato (objeto de datos o valor) que es regresado desde una operación
al final de su ejecución. Así pues, los términos argumento y resultado se aplican a datos enviados al
subprograma y regresados por el mismo a través de diversos mecanismos de lenguaje
Un parámetro formal es una clase particular de objeto de datos local dentro de un subprograma. La
definición del subprograma enumera ordinariamente los nombres y declaraciones para parámetros
formales como parte de la sección de especificación (encabezamiento). Un nombre de parámetro formal
es un simple identificador, y la declaración proporciona el tipo y otros atributos.
Un parámetro real es un objeto de datos que se comparte con el subprograma de llamada. Un parámetro
real puede ser un objeto de datos local perteneciente al que llama, puede ser un parámetro formal del
que llama, puede ser un objeto de datos no local visible para el que llama, o puede ser un resultado
regresado por una función invocada por el que llama y transmitido de inmediato al subprograma llamado.
Un parámetro real se representa en el punto de llamada del subprograma por medio de una expresión,
llamada expresión de parámetro real, que ordinariamente tiene la misma forma que cualquier otra
expresión en el lenguaje.
Valores de función explícitos:
En casi todos los lenguajes, un solo resultado se puede regresar como valor de función explícito antes que
como parámetro. El subprograma se debe declarar como un subprograma de función, y el tipo de
resultado regresado se debe declarar como parte de la especificación del subprograma. Dentro del
subprograma de función, el resultado por regresar como valor de la función se puede especificar en una
de dos formas.
Un método, que se usa en C, consiste en designar el valor de función por devolver por medio de una
expresión de resultado explícita dada como parte del enunciado return que termina la ejecución del
subprograma. Un método alternativo, que se usa en Pascal, consiste en designar el valor por devolver por
medio de una asignación del valor al nombre de la función dentro del subprograma. En este último
método, el subprograma puede contener varias asignaciones al nombre de la función. El valor de función
regresado es el último valor asignado al nombre de la función antes de que el subprograma termine
De acuerdo a como un lenguaje trata a sus subrutinas puede implementar:
1. subrutina de primera clase (orden superior): las subrutinas pueden ser pasadas como argumentos,
retornadas como valor de retorno de otra subrutina o pueden ser asignadas a una variable.
2. subrutina de segunda clase (segundo orden): subrutinas que solo admiten ser pasadas como
argumentos a otra subrutina. Ej: JavaScript
3. subrutina de tercera clase (tercer orden): no se permite tratar a las subrutinas como datos, por lo
que no pueden ser pasadas ni retornadas. Ej: C, C++
Semántica de subrutinas
¿Qué pasa con el ambiente de referencia? Para establecer el ambiente de referencia correcto al ejecutar
subprogramas pasados como parámetros hay tres opciones, que tiene que ver con el momento en el que
el lenguaje decide interpretar el ambiente de la subrutina:
1. El ambiente del subprograma que invoca al subprograma pasado. (El ambiente que existe cuando
la subrutina que fue pasada como argumento se esta ejecutando, es el que existía cuando
efectivamente se llamo en el subprograma al cual le pasamos esa subrutina como argumento)
2. El ambiente del bloque o subprograma, en el que el subprograma pasado esta declarado. (se utiliza
un concepto estático)
3. El ambiente del bloque o subprograma, que incluye la instrucción de llamada que trasmite el
subprograma como un parámetro real.
Los vínculos son los que operan cuando hay pasaje de funciones como argumentos a otras funciones.
Vinculo profundo (Deep): ambiente de la rutina desde el que se pasa como argumento.
Vinculo superficial (shallow): ambiente de la rutina desde el que se llama.
Expansión (in line): cuando las instrucciones que hay en el cuerpo de la función son muy simples y podrían
ubicarse en el punto donde se llamaba la función, podemos calificar a esa función como una función en
línea (in line). Es decir que se puede pedir al traductor que expanda en línea la función, es decir, que en el
punto donde esta la llamada a la función en vez de implementar toda la semántica de llamar a una
subrutina, se copie el código de implementación de la función y se resuelva en este punto. Esto es mas
eficiente.
Sobrecarga: se dice que una subrutina esta sobrecargada cuando tenemos más de una función o
procedimiento con el mismo nombre pero que reciben distinta lista de argumentos.
Stack vs heap
Stack
Heap
Es un sector que se utiliza cuando se declaran
variables simples que no son punteros.
El formato de locación de memoria es el de una
pila.
Espacio limitado y fijo cuando inicia la ejecución
del programa. (estática)
El espacio puede crecer a medida que se requiera
(dinámica)
La alocacion se realiza mas rápidamente
La alocacion es más lenta
Se tiene un acceso mas directo a los datos, ya que
se puede acceder mediante nombre de una
variable y eso nos enmascara una dirección de
memoria
Los datos se acceden mediante punteros.
Las variables se desalojan automáticamente al
terminar el programa.
El desalojo se tiene que manejar manualmente
por el programador. (new/delete)
Almacenamiento contiguo
Almacenamiento no contiguo (puede producirse
fragmentación)
resumen pasajes.pdf
browser_emoji Estamos procesando este archivo...
browser_emoji Lamentablemente la previsualización de este archivo no está disponible. De todas maneras puedes descargarlo y ver si te es útil.
Descargar
. . . . .