Alcance estático y dinámico

El alcance de una variable x en la región del programa en el que el uso de x se refiere a su declaración. Una de las razones básicas para definir el alcance es mantener las variables en diferentes partes del programa distintas entre sí. Dado que solo hay una pequeña cantidad de nombres de variables cortos, y los programadores comparten hábitos sobre la denominación de variables (por ejemplo, I para un índice de array), en cualquier programa de tamaño moderado, se usará el mismo nombre de variable en múltiples ámbitos diferentes.
El alcance generalmente se divide en dos clases: 
1. Alcance estático 
2. Alcance dinámico Alcance
estático: 
El alcance estático también se denomina alcance léxico.. En este alcance, una variable siempre se refiere a su entorno de nivel superior. Esta es una propiedad del texto del programa y no está relacionada con la pila de llamadas en tiempo de ejecución. El alcance estático también hace que sea mucho más fácil crear un código modular, ya que un programador puede averiguar el alcance con solo mirar el código. Por el contrario, el alcance dinámico requiere que el programador anticipe todos los contextos dinámicos posibles.
En la mayoría de los lenguajes de programación, incluidos C, C++ y Java, las variables siempre tienen un alcance estático (o léxico), es decir, el enlace de una variable puede determinarse mediante el texto del programa y es independiente de la pila de llamadas de función en tiempo de ejecución. 
Por ejemplo, la salida para el siguiente programa es 10, es decir, el valor devuelto por f() no depende de quién lo esté llamando (como lo llama g() y tiene ax con el valor 20). f() siempre devuelve el valor de la variable global x.
 

C

// A C program to demonstrate static scoping.
#include<stdio.h>
int x = 10;
 
// Called by g()
int f()
{
   return x;
}
 
// g() has its own variable
// named as x and calls f()
int g()
{
   int x = 20;
   return f();
}
 
int main()
{
  printf("%d", g());
  printf("\n");
  return 0;
}

Producción : 

10

En resumen, en el ámbito estático, el compilador primero busca en el bloque actual, luego en las variables globales y luego en ámbitos cada vez más pequeños.
Alcance dinámico: 
con alcance dinámico, un identificador global se refiere al identificador asociado con el entorno más reciente y es poco común en los lenguajes modernos. En términos técnicos, esto significa que cada identificador tiene una pila global de enlaces y la aparición de un identificador se busca en el enlace más reciente. 
En términos más simples, en el ámbito dinámico, el compilador primero busca en el bloque actual y luego, sucesivamente, en todas las funciones de llamada.
 

C

// Since dynamic scoping is very uncommon in
// the familiar languages, we consider the
// following pseudo code as our example. It
// prints 20 in a language that uses dynamic
// scoping.  
 
int x = 10;
 
// Called by g()
int f()
{
   return x;
}
 
// g() has its own variable
// named as x and calls f()
int g()
{
   int x = 20;
   return f();
}
 
main()
{
  printf(g());
}

 
Salida en un idioma que utiliza alcance dinámico: 
 

20

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.
Perl admite tanto el ámbito dinámico como el estático. La palabra clave de Perl «my» define una variable local de ámbito estático, mientras que la palabra clave «local» define una variable local de ámbito dinámico. 
 

Perl

# A perl code to demonstrate dynamic scoping
$x = 10;
sub f
{
   return $x;
}
sub g
{
   # Since local is used, x uses
   # dynamic scoping.
   local $x = 20;
 
   return f();
}
print g()."\n";

Producción : 

20

Este artículo es una contribución de Vineet Joshi . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *