El ámbito (scope) de una variable, función o método es la región en la que estos existen o desde la cual se puede acceder a ellos. Se puede definir de muchas formas dependiendo del enfoque que le demos o el lenguaje de programación del que hablamos, pero la idea principal siempre es la misma: es la sección de código en la que se puede “ver” y acceder a una entidad. Existen 2 clases de ámbitos: lexicográficos y dinámicos.
Nota: los ámbitos internos pueden “ver” las variables del externo. El ámbito externo no puede “ver” las variables de los ámbitos internos.
En seguida analizamos un par de ejemplos de ámbito lexicográfico puesto que son los más conocidos y utilizados. Comencemos con el primer ejemplo:
#include ; void foo(){ int a = 10; } int main(){ foo(); printf("%i\n", a); return 0; }
Al intentar compilar:
Error de compilación: la variable 'a' no ha sido declarada en esta función.
Como te puedes dar cuenta, el programa intenta imprimir la variable a desde la función main, sin embargo, esta se encuentra en un ámbito interno de otra función, fuera del alcance de la función main.
Ahora veamos el siguiente ejemplo:
#include int a = 10; int main(){ printf("%i\n", a); return 0; }
Salida:
10
La función main se encuentra dentro del ámbito que engloba a a, por tanto es posible acceder a dicha variable a pesar de que no se encuentra dentro de la función main.
Como pudiste darte cuenta, cuando intentas acceder a una variable desde un ámbito externo a su definición, ocurrirá un error. En cambio, cuando intentas acceder a una variable (o entidad, en general) externa al ámbito en el que se encuentra el programa, no habrá ningún problema. Cabe aclarar que ámbitos independientes (ninguno engloba al otro), no pueden “ver” las entidades del otro.
Origen
En los primeros años de la programación, se utilizaban segmentos de memoria como hoy en día lo hacemos (aunque de una forma más arcaica), sin embargo, en ese tiempo se tenía acceso completo a la memoria desde cualquier parte del programa sin ninguna clase de control o jerarquía. Lo anterior generaba muchos problemas para los programadores porque, entre otras cosas, también debían de preocuparse por no modificar accidentalmente segmentos de memoria que no deberían de comunicarse.
El primer lenguaje de programación que incluyó el ámbito fue ALGOL 60. En aquellos años se definió como: el conjunto de expresiones y sentencias en las cuales la declaración de un identificador es válida.
Con el paso de los años, otras definiciones han aparecido dependiendo del lenguaje de programación que implemente ámbitos, pero, en general, se mantiene la definición que estos tuvieron al momento de su creación.
Ámbito lexicográfico
Conocido también como ámbito estático. Las entidades pueden ser “vistas” solamente desde el bloque al que pertenecen o desde bloques internos. Esta clase de ámbito es el más conocido y utilizado por muchos lenguajes de programación, generalmente el compilador es el que define los bloques de código al que pertenece cada entidad.
Ámbito dinámico
Con ámbitos dinámicos se pueden crear entidades que pueden ser llamadas desde bloques independientes al que fueron definidas. Esta clase de ámbito es poco común (a comparación del estático), muy pocos lenguajes de programación lo implementan y, generalmente, lo hacen como una herramienta extra, no para su uso por defecto. Suelen ser poco recomendados porque vuelven el código fuente más complicado de comprender y dar soporte.
Diferencias entre ámbito y contexto
Muchos programadores confunden lo que es un ámbito con el contexto y viceversa ya que son términos que a primera vista resultan similares, sin embargo, son cosas muy distintas que muchas veces se incluyen en preguntas de entrevistas de trabajo (por ejemplo de Javascript). De forma resumida el ámbito se refiere a la visibilidad de las entidades, es decir, desde qué bloques pueden ser vistas y desde cuales no. En cambio, el contexto se refiere a la pertenencia de entidades (variables, métodos, funciones) a cierto objeto o estructura, por ejemplo, dos objetos de la misma clase comparten implementaciones de los mismos métodos pero cada uno es un contexto diferente para esos métodos por ejemplo:
objeto01.DefineNombre("Marcos"); objeto02.DefineNombre("Maria"); objeto01.DameNombre(); //Marcos objeto02.DameNombre(); //Maria
Suponiendo que ambos objetos son instancias de la misma clase, cuando llaman al método DameNombre, cada uno devuelve su propio nombre. Si llamáramos al método de un objeto desde el contexto del otro, devolverían el nombre del contexto que se esté utilizando.
Finalizando…
Espero que hayas comprendido qué es el ámbito de entidades y te haya sido de utilidad. A pesar de que es un concepto para muchas personas muy sencillo, para quien recién comienza a programar le puede resultar muy complicado. Cualquier duda o comentario puedes dejarlo en la sección de comentarios. Hasta la próxima, see ya!
Muy Buena explicación con bases solidas y se nota; de buena experiencia tambien.