Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad

Binding dinámico y estático, Apuntes de Programación Informática

Información sobre esto lo que es el binding dinámico y estático

Tipo: Apuntes

2024/2025

Subido el 17/04/2025

yolieska-ramos
yolieska-ramos 🇻🇪

1 documento

1 / 12

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Introducción
Es bien sabido quela Programación Orientada a Objetoses útil de muchas maneras en
términos de la flexibilidad que brinda al crear clases, llamar a funciones, etc. Para entender
que ocurre detrás de estas funciones, es necesario tener noción de los parámetros que se
estudian a continuación.
¿Qué es Binding?
Binding, que significa vinculación, se refiere a la vinculación entre la llamada a la función y
la definición de la función.
En su código, en cualquier momento cuando se llama a una función, el control del programa
se vincula a la dirección en la memoria donde se ha definido la función.
Ejemplo:
Código C++ que demuestra el enlace:
#include <iostream>
usingnamespacestd;
classA
{
public:
voidm1()
{
cout <<"m1 is invoked\n";
}
voidm2()
{
cout <<"m2 is invoked\n";
}
};
intmain()
{
A obj;
obj.m1();
obj.m2();
return0;
}
pf3
pf4
pf5
pf8
pf9
pfa

Vista previa parcial del texto

¡Descarga Binding dinámico y estático y más Apuntes en PDF de Programación Informática solo en Docsity!

Introducción

Es bien sabido que la Programación Orientada a Objetos es útil de muchas maneras en términos de la flexibilidad que brinda al crear clases, llamar a funciones, etc. Para entender que ocurre detrás de estas funciones, es necesario tener noción de los parámetros que se estudian a continuación.

¿Qué es Binding?

Binding, que significa vinculación, se refiere a la vinculación entre la llamada a la función y la definición de la función. En su código, en cualquier momento cuando se llama a una función, el control del programa se vincula a la dirección en la memoria donde se ha definido la función. Ejemplo: Código C++ que demuestra el enlace: #include using namespace std; class A { public: void m1() { cout << "m1 is invoked\n"; } void m2() { cout << "m2 is invoked\n"; } }; int main() { A obj; obj.m1(); obj.m2(); return 0; }

Producción: m1 is invoked m2 is invoked Explicación: Supongamos que tenemos una clase A, que tiene dos funciones, m1 y m2 y sus definiciones. Entonces, para identificar para qué llamada de función en particular, qué función se ejecutará, se necesita binding, es decir, vinculación.

Tipos de Binding

Static binding o enlace estático El enlace estático ocurre en tiempo de compilación, es decir, la llamada a la función y la definición de la función están vinculadas durante el tiempo de compilación. Por lo tanto, también se denomina vinculación anticipada. Esto se debe a que toda la información necesaria para asociar la llamada de función a su definición está disponible en el momento de la compilación. ¿Cuándo tiene lugar la unión estática?

Código C++ para demostrar el enlace estático: #include using namespace std; class findSum { public: //The function sum() is overloaded in this class. int sum(int a, int b) { return a + b; } int sum(int a, int b, int c) { return a + b + c; } }; int main() { findSum obj; int a, b, c; a = 10; b = 20; c = 30; cout << "The sum is " << obj.sum(a, b) << endl; cout << "The sum is " << obj.sum(a, b, c) << endl; return 0; } Producción: The sum is 30 The sum is 60 Explicación:

En el código anterior, en la clase findSum(), vemos que la función sum() está sobrecargada. Hay dos definiciones de sum, y la única diferencia está en el número de parámetros pasados. Cuando llamamos a la misma función sum() desde el principal, se vincula a la definición correcta. Entonces, en este caso, en el momento de la compilación, la llamada a la función se vincula a la función correcta según los parámetros que se le hayan pasado. Dynamic binding o enlace dinámico El enlace dinámico tiene lugar durante el tiempo de ejecución en función del tipo de objeto. Dado que se retrasa hasta el tiempo de ejecución, también se denomina enlace tardío o enlace en tiempo de ejecución. Cuando el compilador no puede determinar toda la información necesaria para resolver una llamada de función durante el tiempo de compilación, estas llamadas de función no se vinculan hasta el tiempo de ejecución. ¿Cuándo tiene lugar el enlace dinámico? Se puede lograr con el uso de funciones virtuales en C++ y métodos anulados en Java. Ejemplo: Código Java para demostrar el enlace dinámico: class Human { // Overridden Method public void walk() { System.out.println("Human walks"); }

cout << "The base class function is called.\n"; } }; class D : public B { public: void f() //function overriding { cout << "The derived class function is called.\n"; } }; int main() { B base; // base class object D derived; //derived class object B *basePtr = &base; // base class pointer pointing to base class object basePtr->f(); //calls function of base class basePtr = &derived; // base class pointer pointing to object of derived class basePtr->f(); //calls function of derived class return 0; } Producción: The base class function is called. The derived class function is called. Explicación: En el ejemplo anterior, tenemos una clase base B en la que se ha declarado la función f() con la palabra clave "virtual". La clase derivada D hereda de la clase base B, lo que significa que todas las funciones miembro de la clase B también estarán disponibles en la clase D. Por lo tanto, la función f() de la clase B será accesible desde la clase D.

Pero vemos que la función f() ha sido definida nuevamente en la clase derivada. Ahora, en el código principal, tenemos un puntero de clase base basePtr. En primer lugar, apunta a un objeto de clase base "base", y la llamada de función basePtr->f() llama a la función f() de la clase base, que también se espera porque el puntero, así como el objeto al que apunta , son ambos del tipo clase base. Pero cuando basePtr apunta al objeto de clase derivada "derivado", es importante tener en cuenta que el puntero es de tipo clase base y el objeto al que apunta es de tipo clase derivada. La función llama a basePtr->f() que se resuelve en tiempo de ejecución y, por lo tanto, la función f() de la clase derivada se ejecuta ya que el objeto es de la clase derivada. Enlace estático vs Enlace dinámico Enlace estático Enlace dinámico Ocurre en el momento de la compilación. Sucede en el tiempo de ejecución. También se denomina vinculación anticipada. También se denomina enlace tardío. Cuando toda la información necesaria para llamar a una función está disponible en el momento de la compilación, se produce un enlace estático. Cuando el compilador no puede determinar toda la información para resolver la llamada de función, se produce un enlace dinámico. Se puede lograr durante las llamadas de funciones normales, la sobrecarga de funciones y la sobrecarga de operadores. Se logra con el uso de funciones virtuales. La ejecución se vuelve más rápida que el enlace dinámico porque la llamada a la función se resuelve antes del tiempo de ejecución. Como la llamada de función se resuelve en tiempo de ejecución, a veces conduce a una ejecución de código más lenta. Proporciona menos flexibilidad en comparación con la unión dinámica. Proporciona más flexibilidad, ya que se pueden manejar diferentes tipos de objetos en tiempo de ejecución mediante una sola llamada de función, lo que hace que el código fuente sea más legible. El concepto de Binding está íntimamente relacionado con el concepto de ámbito scope (que significa alcance), ya que el análisis de ámbito es la determinación de las relaciones de binding. El Scope es un contexto de ejecución de código que determina que ciertas variables sean accesibles, mientras que otras no. Para que una variable esté disponible para su uso, deberá estar en el scope o alcance desde el cual se intenta acceder a ella. Existen dos tipos de scope:

  1. console.log(h); // ReferenceError: h is not defined
  2. // i es local en la función probarScope y por lo tanto inaccesible también en el contexto global
  3. console.log(i); // ReferenceError: i is not defined Alcance estático frente a dinámico En la mayoría de los lenguajes de programación, el alcance estático es dominante. Esto se debe simplemente a que en el alcance estático es fácil razonar y comprender con solo mirar el código. Podemos ver qué variables están en el alcance simplemente mirando el texto en el editor. El alcance dinámico no se preocupa por cómo se escribe el código, sino por cómo se ejecuta. Cada vez que se ejecuta una nueva función, se coloca un nuevo ámbito en la pila.

Alcance estático

Ventajas Desventajas Es fácil razonar sobre el alcance de las variables en un programa, porque se determina en tiempo de compilación. Puede ser más difícil escribir y depurar programas porque el alcance de las variables puede ser menos flexible. Puede conducir a una ejecución más rápida porque el alcance de las variables se puede determinar en tiempo de compilación, lo que elimina la necesidad de realizar búsquedas en tiempo de ejecución. Puede ser más difícil escribir código que sea reutilizable, porque solo se puede acceder a las variables dentro de su ámbito definido. Es menos propenso a errores porque solo se puede acceder a las variables dentro de su ámbito definido. El alcance estático no es adecuado para implementar características dinámicas como el alcance dinámico o los cierres, que requieren un enfoque más flexible para el alcance variable. Dado que el alcance estático permite que el compilador determine el alcance de las variables en tiempo de compilación, puede optimizar el código eliminando búsquedas de variables innecesarias. El alcance estático puede dificultar el logro de la encapsulación, un principio fundamental de la programación orientada a objetos. La encapsulación permite una mejor organización del código, mejora la legibilidad del código y facilita el

mantenimiento del código.

La eliminación de las búsquedas en tiempo de ejecución debido al alcance estático puede resultar en una ejecución más rápida del programa, lo que lleva a un mejor rendimiento El alcance estático puede generar colisiones de espacios de nombres, donde las variables en diferentes alcances tienen el mismo nombre, lo que genera confusión y errores.

del programa. El alcance estático evita la modificación accidental o intencional de variables fuera de su alcance, lo que hace que el programa sea más seguro de ejecutar. Dado que el alcance estático facilita el razonamiento sobre el alcance de las variables en un programa, puede hacer que el mantenimiento y la depuración del programa consuman menos tiempo y sean menos propensos a errores.

Alcance Dinámico

Ventajas Desventajas Es más flexible, porque se puede acceder a las variables desde cualquier parte del programa. Puede ser más difícil razonar sobre el alcance de las variables en un programa porque se determina en tiempo de ejecución. Puede ser más fácil escribir código que sea reutilizable, porque se puede acceder a las variables desde cualquier lugar. Puede conducir a una ejecución más lenta porque el alcance de las variables solo se puede determinar en tiempo de ejecución, lo que requiere búsquedas adicionales. El alcance dinámico puede facilitar la depuración de ciertos tipos de código, como funciones recursivas o código con flujo de control complejo. Esto se debe a que se puede acceder a las variables desde cualquier parte del programa, lo que facilita el seguimiento de sus valores y comportamiento. Puede ser más propenso a errores porque se puede acceder a las variables desde lugares inesperados. Permite que el código se adapte más fácilmente a los requisitos o circunstancias cambiantes. Esto se debe a que se puede acceder a las variables desde cualquier parte del programa, lo que permite una mayor flexibilidad en el alcance de las variables.

Referencias

https://www.codingninjas.com/codestudio/library/static-binding-vs-dynamic-

binding

https://www.geeksforgeeks.org/static-and-dynamic-scoping/