Variável global - Global variable

Em programação de computador , uma variável global é uma variável com escopo global , o que significa que é visível (portanto, acessível) em todo o programa, a menos que esteja sombreada . O conjunto de todas as variáveis ​​globais é conhecido como ambiente global ou estado global. Em linguagens compiladas , as variáveis ​​globais são geralmente variáveis ​​estáticas , cuja extensão (tempo de vida) é todo o tempo de execução do programa, embora em linguagens interpretadas (incluindo interpretadores de linha de comando ), as variáveis ​​globais são geralmente alocadas dinamicamente quando declaradas, uma vez que não são conhecidas antes do tempo.

Em algumas linguagens, todas as variáveis ​​são globais, ou globais por padrão, enquanto na maioria das linguagens modernas as variáveis ​​têm escopo limitado, geralmente escopo léxico , embora as variáveis ​​globais estejam frequentemente disponíveis declarando uma variável no nível superior do programa. Em outras linguagens, entretanto, variáveis ​​globais não existem; geralmente são linguagens de programação modulares que impõem uma estrutura de módulo ou linguagens de programação orientadas a objetos baseadas em classes que impõem uma estrutura de classes.

Usar

Os mecanismos de interação com variáveis ​​globais são chamados de mecanismos de ambiente global (ver também estado global ). O paradigma do ambiente global é contrastado com o paradigma do ambiente local , onde todas as variáveis ​​são locais sem memória compartilhada (e, portanto, todas as interações podem ser reconduzidas para a passagem de mensagens ).

Variáveis ​​globais são usadas extensivamente para passar informações entre seções de código que não compartilham uma relação chamador / receptor, como threads simultâneos e manipuladores de sinal. As linguagens (incluindo C) em que cada arquivo define um namespace implícito eliminam a maioria dos problemas vistos com linguagens com um namespace global, embora alguns problemas possam persistir sem o encapsulamento adequado. Sem o bloqueio adequado (como com um mutex ), o código que usa variáveis ​​globais não será seguro para thread, exceto para valores somente leitura na memória protegida .

Variáveis ​​ambientais

Variáveis ​​de ambiente são um recurso fornecido por alguns sistemas operacionais . No shell do sistema operacional ( ksh no Unix , bash no Linux , COMMAND.COM no DOS e CMD.EXE no Windows ), eles são um tipo de variável: por exemplo, no unix e sistemas relacionados, uma variável comum se torna uma variável de ambiente quando a exportpalavra - chave é usado. O código do programa diferente de shells deve acessá-los por chamadas de API , como getenv()e setenv().

Eles são locais para o processo no qual foram definidos. Isso significa que se abrirmos duas janelas de terminal (dois processos diferentes executando shell) e alterarmos o valor da variável de ambiente em uma janela, essa alteração não será vista por outra janela.

Quando um processo filho é criado, ele herda todas as variáveis ​​de ambiente e seus valores do processo pai. Normalmente, quando um programa chama outro programa, ele primeiro cria um processo filho por bifurcação , em seguida, o filho ajusta o ambiente conforme necessário e, por último, o filho se substitui pelo programa a ser chamado. Os processos filhos, portanto, não podem usar variáveis ​​de ambiente para se comunicar com seus pares, evitando o problema de ação à distância.

Apenas global e global por padrão

Uma série de linguagens não estruturadas , como (versões anteriores de) BASIC , COBOL e Fortran I (1956) fornecem apenas variáveis ​​globais. Fortran II (1958) introduziu sub-rotinas com variáveis ​​locais e a palavra-chave COMMON para acessar variáveis ​​globais. O uso de COMMON em FORTRAN continuou em FORTRAN 77 e influenciou linguagens posteriores, como PL / SQL. Grupos COMUM nomeados para globais se comportam de forma semelhante a namespaces estruturados. As variáveis ​​também são globais por padrão em FORTH , Lua , Perl e na maioria dos shells.

Por idioma

C e C ++

A linguagem C não possui uma global palavra - chave . No entanto, as variáveis ​​declaradas fora de uma função têm "escopo de arquivo", o que significa que são visíveis dentro do arquivo. As variáveis ​​declaradas com o escopo do arquivo são visíveis entre sua declaração e o final da unidade de compilação ( .carquivo) (a menos que sejam sombreadas por um objeto com o mesmo nome em um escopo mais próximo, como uma variável local); e eles implicitamente têm ligação externa e, portanto, são visíveis não apenas para o .carquivo ou unidade de compilação que contém suas declarações, mas também para todas as outras unidades de compilação que estão vinculadas para formar o programa completo. A ligação externa, entretanto, não é suficiente para o uso de tal variável em outros arquivos: para uma unidade de compilação acessar corretamente tal variável global, ela precisará saber seu tipo. Isso é feito declarando a variável em cada arquivo usando a externpalavra - chave. (Ele será declarado em cada arquivo, mas pode ser definido em apenas um.) Tais externdeclarações são freqüentemente colocadas em um arquivo de cabeçalho compartilhado, uma vez que é prática comum para todos os arquivos .c em um projeto incluir pelo menos um .harquivo: o padrão O arquivo de cabeçalho errno.hé um exemplo, tornando a errnovariável acessível a todos os módulos de um projeto. Onde este mecanismo de acesso global for considerado problemático, ele pode ser desabilitado usando a staticpalavra - chave que restringe uma variável ao escopo do arquivo e causará tentativas de importá-la externpara gerar um erro de compilação (ou link).

Um exemplo de variável "global" em C :

#include <stdio.h>

// This is the file-scope variable (with internal linkage), visible only in
// this compilation unit.
static int shared = 3;

// This one has external linkage (not limited to this compilation unit).
extern int over_shared;

// Also internal linkage.
int over_shared_too = 2;

static void ChangeShared() {
  // Reference to the file-scope variable in a function.
  shared = 5;
}

static void LocalShadow() {
  // Local variable that will hide the global of the same name.
  int shared;

  // This will affect only the local variable and will have no effect on the
  // file-scope variable of the same name.
  shared = 1000;
}

static void ParamShadow(int shared) {
  // This will affect only the parameter and will have no effect on the file-
  // scope variable of the same name.
  shared = -shared;
}

int main() {
  // Reference to the file-scope variable.

  printf("%d\n", shared);

  ChangeShared();

  printf("%d\n", shared);

  LocalShadow();

  printf("%d\n", shared);

  ParamShadow(1);

  printf("%d\n", shared);

  return 0;
}

Como a variável é externa, não há necessidade de passá-la como parâmetro para utilizá-la em uma função além da principal. Ele pertence a todas as funções do módulo.

O resultado será:

3
5
5
5

Java

Algumas linguagens, como Java, não possuem variáveis ​​globais. Em Java, todas as variáveis ​​que não são variáveis ​​locais são campos de uma classe. Portanto, todas as variáveis ​​estão no escopo de uma classe ou de um método. Em Java, os campos estáticos (também conhecidos como variáveis ​​de classe ) existem independentemente de quaisquer instâncias da classe e uma cópia é compartilhada entre todas as instâncias; portanto, os campos estáticos públicos são usados ​​para muitas das mesmas finalidades que as variáveis ​​globais em outras linguagens devido ao seu comportamento de "compartilhamento" semelhante:

public class Global {
    public static int a;
}

PHP

PHP tem uma globalpalavra - chave e várias maneiras incomuns de usar variáveis ​​globais. As variáveis ​​declaradas fora das funções têm escopo de arquivo (que é, para a maioria dos propósitos, o escopo mais amplo). No entanto, eles não são acessíveis dentro das funções a menos que importados com a globalpalavra - chave (ou seja, a palavra-chave acessa variáveis ​​globais, ela não as declara ).

No entanto, algumas variáveis ​​predefinidas, conhecidas como superglobais, estão sempre acessíveis. Eles são todos matrizes. Um de propósito geral é o $GLOBALSsuperglobal, que contém todas as variáveis ​​definidas fora do escopo da função. Mudanças em seus elementos mudam as variáveis ​​originais e adições criam novas variáveis. Os superglobals $_POSTe $_GETsão amplamente utilizados em programação web.

Outras línguas

  • Em Python e MATLAB, uma variável global pode ser declarada em qualquer lugar com a globalpalavra - chave.
  • As variáveis ​​globais de Ruby são distinguidas por um símbolo ' $' . Existem vários globais predefinidos, por exemplo, é o ID do processo atual .$$

Veja também

Referências