En programación informática , una variable global es una variable con alcance global , lo que significa que es visible (y, por lo tanto, accesible) en todo el programa, a menos que esté oculta . El conjunto de todas las variables globales se conoce como entorno global o estado global. En los lenguajes compilados , las variables globales son generalmente variables estáticas , cuya extensión (vida útil) es todo el tiempo de ejecución del programa, aunque en los lenguajes interpretados (incluidos los intérpretes de línea de comandos ), las variables globales generalmente se asignan dinámicamente cuando se declaran, ya que no se conocen de antemano.
En algunos lenguajes, todas las variables son globales, o globales por defecto, mientras que en la mayoría de los lenguajes modernos las variables tienen un alcance limitado, generalmente un alcance léxico , aunque las variables globales suelen estar disponibles declarando una variable en el nivel superior del programa. En otros lenguajes, sin embargo, las variables globales no existen; estos son generalmente lenguajes de programación modular que imponen una estructura de módulo, o lenguajes de programación orientados a objetos basados en clases que imponen una estructura de clase.
Los mecanismos de interacción con variables globales se denominan mecanismos de entorno global (véase también estado global ). El paradigma de entorno global se contrasta con el paradigma de entorno local, donde todas las variables son locales sin memoria compartida (y por lo tanto todas las interacciones pueden reconducirse al paso de mensajes ).
Las variables globales se utilizan ampliamente para pasar información entre secciones de código que no comparten una relación de llamador/destinatario, como subprocesos concurrentes y controladores de señales. Los lenguajes (incluido C) en los que cada archivo define un espacio de nombres implícito eliminan la mayoría de los problemas observados con los lenguajes con un espacio de nombres global , aunque algunos problemas pueden persistir sin una encapsulación adecuada. Sin un bloqueo adecuado (como con un mutex ), el código que utiliza variables globales no será seguro para subprocesos, excepto para valores de solo lectura en la memoria protegida .
Las variables de entorno son una función que ofrecen algunos sistemas operativos . Dentro del shell del sistema operativo ( ksh en Unix , bash en Linux , COMMAND.COM en DOS y CMD.EXE en Windows ) son un tipo de variable: por ejemplo, en Unix y sistemas relacionados, una variable ordinaria se convierte en una variable de entorno cuando export
se utiliza la palabra clave. El código de programa que no sea un shell tiene que acceder a ellas mediante llamadas a la API , como getenv()
y setenv()
.
Son locales al proceso en el que se establecieron. Esto significa que si abrimos dos ventanas de terminal (dos procesos diferentes que ejecutan el shell) y cambiamos el valor de la variable de entorno en una ventana, ese cambio no se verá en la otra ventana.
Cuando se crea un proceso hijo, este hereda todas las variables de entorno y sus valores del proceso padre. Normalmente, cuando un programa llama a otro programa, primero crea un proceso hijo mediante una bifurcación , luego el proceso hijo ajusta el entorno según sea necesario y, por último, el proceso hijo se reemplaza a sí mismo con el programa que se va a llamar. Por lo tanto, los procesos hijos no pueden usar variables de entorno para comunicarse con sus pares, lo que evita el problema de la acción a distancia.
Varios lenguajes no estructurados , como (las primeras versiones de) BASIC , COBOL y Fortran I (1956) solo proporcionan variables globales. Fortran II (1958) introdujo subrutinas con variables locales y la palabra clave COMMON para acceder a las variables globales. El uso de COMMON en FORTRAN continuó en FORTRAN 77, [1] e influyó en lenguajes posteriores como PL/SQL. Los grupos COMMON nombrados para variables globales se comportan de manera similar a los espacios de nombres estructurados. [2] Las variables también son globales de manera predeterminada en Forth , Lua , Perl y la mayoría de los shells.
El lenguaje C no tiene una global
palabra clave . Sin embargo, las variables declaradas fuera de una función tienen "ámbito de archivo", lo que significa que son visibles dentro del archivo. Las variables declaradas con ámbito de archivo son visibles entre su declaración y el final de la unidad de compilación ( .c
archivo) (a menos que estén ocultas por un objeto con el mismo nombre en un ámbito más cercano, como una variable local); e implícitamente tienen un enlace externo y, por lo tanto, son visibles no solo para el .c
archivo o la unidad de compilación que contiene sus declaraciones, sino también para todas las demás unidades de compilación que están vinculadas para formar el programa completo. Sin embargo, el enlace externo no es suficiente para el uso de dicha variable en otros archivos: para que una unidad de compilación acceda correctamente a dicha variable global, necesitará saber su tipo. Esto se logra declarando la variable en cada archivo utilizando la extern
palabra clave. (Se declarará en cada archivo, pero puede definirse solo en uno). Dichas extern
declaraciones a menudo se colocan en un archivo de encabezado compartido, ya que es una práctica común que todos .c
los archivos de un proyecto incluyan al menos un .h
archivo: el archivo de encabezado estándar errno.h
es un ejemplo, que hace que la errno
variable sea accesible para todos los módulos de un proyecto. Cuando este mecanismo de acceso global se considera problemático, se puede desactivar utilizando la static
palabra clave que restringe una variable al alcance del archivo y hará que los intentos de importarla extern
generen un error de compilación (o vinculación). [3]
Un ejemplo de una variable "global" en C :
#incluir <stdio.h> // Esta es la variable de alcance de archivo (con enlace interno), visible solo en esta unidad de compilación. static int shared = 3 ; // Éste tiene enlace externo (no limitado a esta unidad de compilación). extern int over_shared ; // También enlace interno. int over_shared_too = 2 ; static void ChangeShared () { // Referencia a la variable de ámbito de archivo en una función. shared = 5 ; } static void LocalShadow () { // Variable local que ocultará la global del mismo nombre. int shared ; // Esto afectará solo a la variable local y no tendrá efecto en la variable de alcance de archivo del mismo nombre. shared = 1000 ; } static void ParamShadow ( int shared ) { // Esto afectará solo al parámetro y no tendrá efecto en la variable de alcance del archivo del mismo nombre. shared = - shared ; } int main () { // Referencia a la variable de ámbito de archivo. printf ( "%d \n " , compartido ); CambioCompartido (); printf ( "%d \n " , compartido ); Sombra local (); printf ( "%d \n " , compartido ); ParamSombra ( 1 ); printf ( "%d \n " , compartido ); devuelve 0 ; }
Como la variable es externa, no es necesario pasarla como parámetro para usarla en una función que no sea la principal. Pertenece a todas las funciones del módulo.
La salida será:
3555
Algunos lenguajes, como Java, no tienen variables globales. En Java, todas las variables que no son variables locales son campos de una clase. Por lo tanto, todas las variables están en el ámbito de una clase o de un método. En Java, los campos estáticos (también conocidos como variables de clase ) existen independientemente de cualquier instancia de la clase y una copia se comparte entre todas las instancias; por lo tanto, los campos estáticos públicos se utilizan para muchos de los mismos propósitos que las variables globales en otros lenguajes debido a su comportamiento de "compartir" similar:
clase pública Global { int público estático a ; }
PHP tiene una global
palabra clave y varias formas inusuales de usar variables globales. Las variables declaradas fuera de las funciones tienen alcance de archivo (que para la mayoría de los propósitos es el alcance más amplio). Sin embargo, no son accesibles dentro de las funciones a menos que se importen con la global
palabra clave (es decir, la palabra clave accede a las variables globales, no las declara ).
Sin embargo, algunas variables predefinidas, conocidas como superglobales , siempre son accesibles. Todas son matrices. Una de propósito general es la $GLOBALS
superglobal, que contiene todas las variables definidas fuera del alcance de la función. Los cambios en sus elementos cambian las variables originales y las adiciones crean nuevas variables. Las superglobales $_POST
se $_GET
utilizan ampliamente en la programación web.
global
palabra clave. [4] [5]$
" " . Existe una serie de variables globales predefinidas, por ejemplo, el ID del proceso actual .$$