Ámbito (programación)

De Wikipedia, la enciclopedia libre

En programación de computadoras, el ámbito (referido mediante su denominación en inglés scope) es el contexto que pertenece a un nombre dentro de un programa. El ámbito determina en qué partes del programa una entidad puede ser usada.

Esto sirve para que se pueda volver a definir una variable con un mismo nombre en diferentes partes del programa sin que haya conflictos entre ellos.

Si una variable es declarada dentro de un bloque (método/función/procedimiento), esta será válida solo dentro de ese bloque y se destruirá al terminar el bloque. Adicionalmente, la variable no podrá verse ni usarse fuera del bloque (en el exterior del bloque). La variable dentro del bloque es una variable local y solo tiene alcance dentro del bloque que se creó y sus bloques hijos, pero no en bloques hermanos ni padres, una variable definida fuera de cualquier bloque es una variable global y cualquier bloque puede acceder a ella y modificarla.

En el caso de programación orientada a objetos (POO), una variable global dentro de una clase es llamada variable de instancia, y cada objeto creado con esa clase tiene una. Adicionalmente existen variables globales que son comunes a un todos los objetos creados con una clase y son llamadas variables de clase.

Hay dos tipos de alcances, el estático que también es llamado lexicográfico, donde el alcance se determina en tiempo de compilación, mientras que el alcance dinámico de las variables se verifica en el hilo de ejecución.

Ejemplo en Java[editar]

public class A {
    
    public Integer numeroEntero = new Integer(); /* Variable Global a todos los Métodos */
    
    public Integer metodo() {
        int num = 1; // Variable Local a método. Puede accederse dentro de este método en cualquier parte, pero no fuera del mismo.
        for (int i = 0;i<numeroEntero.intValue();i++) { // i es local al bucle for, sólo puede ser accedida dentro del mismo.
            num *= i;
        }
        // i = 2; Esta línea provocaría error al no haber declarado la variable i. i fue definida localmente al bucle for.
        return Integer.valueOf(num);
    }
    
    public void otroMetodo() {
        int num = 1; // Variable local a otroMetodo. num aquí es una variable distinta a la variable num de método
        System.out.println("Variable local num: " + num);
    }
}

Ámbito Léxico vs. ámbito dinámico[editar]

El uso de variables locales — de nombres variables con alcance limitado, que sólo existe dentro de una función específica— ayuda a evadir el riesgo de una colisión de nombres entre dos variables llamadas idénticamente. sin embargo, hay dos enfoques —muy diferentes— para contestar esta pregunta: ¿Qué significa estar dentro de una función?

En ámbito léxico (también llamado ámbito estático), si el ámbito del nombre de una variable es una cierta función, entonces su ámbito es el texto del programa de la función de definición: dentro de ese texto, el nombre de la variable existe, y está enlazada al valor de la variable, pero fuera del texto, el nombre de la variable no existe. Por el contrario, en ámbito dinámico, si el ámbito del nombre de una variable es cierta función, Entonces su ámbito es el periodo de tiempo durante el cual la función se ejecuta : mientras la función esté corriendo, el nombre de la variable existe, y está enlazado a su variable, pero después del retorno de la función, el nombre de la variable ya no existe.

Esto significa que si la función f invoca una función g definida de forma separada, entonces, bajo ámbito léxico, la función g no tiene acceso a las variables locales de f (asumiendo que el texto de g no se encuentra dentro del texto de f), mientras que bajo ámbito dinámico, la función g tendrá acceso a las variables locales de f (ya que g es invocado durante la invocación de f ).

Considere, por ejemplo el programa dado

$ x=1
$ function g () { echo $x ; x=2 ; }
$ function f () { local x=3 ; g ; }
$ f # retorna 1, o 3?.... RTA: retorna 3
$ echo $x # retorna 1, o 2?..... RTA: retorna 1

La primera línea X=1, crea una variable global x y la inicia en 1.

La segunda línea, function g () { echo $x ; x=2 ; } define una función g que imprime el valor actual de x, y entonces sobreescribe su valor en 2.

La tercera línea, function f () { local x=3 ; g ; } define una función f que crea una variable local x (escondiendo la variable global llamada idénticamente), la inicia en 3 y entonces llama a g.

La cuarta línea llama a la función f.

La quinta línea imprime el valor actual de x.

La pregunta es, que valores retornan las instrucciones de la cuarta y la quinta línea?. Ello depende de las reglas de ámbito. Si el lenguaje de dicho programa es uno que emplea el ámbito léxico, entonces g imprime y modifica la variable global x (porque g está definida fuera de f), Entonces el programa imprime 1 y luego 2. Por el contrario, si este lenguaje usa ámbito dinámico, entonces g imprime y modifica la variable local de f llamada x (porque g es llamada desde f), entonces el programa imprime 3 y luego 1 ( En el programa dado, implementado sobre Bash esto ocurre, pues dicho lenguaje emplea ámbito dinámico).

Ámbito léxico[editar]

Con ámbito léxico, un nombre siempre refiere a su entorno léxico local. Esta es una propiedad del programa y se realiza independientemente de la llamada a la pila durante el tiempo de ejecución a través de la implementación del lenguaje.

Debido a que esta correspondencia solo requiere un análisis del programa texto estático, este tipo de ámbito es también llamado ámbito estático.

Ámbito dinámico[editar]

Con ámbito 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 enlazamientos. Introduciendo una variable local de nombre x empuja un enlace a la pila global del identificador x, la cual es expulsada cuando el flujo de control deja el ámbito. Evaluando x en cualquier contexto siempre se produce con el enlace del tope de la pila. Nótese que esto no puede ser realizado en el momento de la compilación porque la pila de enlazamientos solo existe durante el tiempo de ejecución, lo cual hace que este tipo de ámbito se llame ámbito dinámico.

Véase también[editar]

Enlaces externos[editar]