Além de outras boas respostas, devemos considerar as noções separadas, mas intimamente relacionadas, de tempo de vida variável, escopo variável e permissão de acesso; vamos considerá-los em relação ao conceito de variáveis globais, estáticas e locais. Ao separá-las, vamos analisar algumas das diferenças nas declarações.
E o ponto que o @JacquesB faz sobre a complexidade do programa está certo.
Cada um dos itens acima pode ser usado para reduzir ou ampliar a complexidade do programa.
Tempo de vida é a duração efetiva da variável; simplesmente, quanto tempo a variável vive. Uma variável global vive durante todo o programa. Uma variável local vive pelo comprimento do método em que está (diferenças de módulo menores em linguagens de programação e a noção de escopo). Uma variável que vive mais tem mais efeito potencial na complexidade do programa. Variáveis estáticas têm o mesmo tempo de vida de variáveis globais.
Também vamos observar que, quando há várias variáveis de toda a duração do programa (global ou estática), há problemas de ordenação de inicialização (que são ou não resolvidos pela ordenação de inicialização do idioma). Os problemas de encomenda por terminação também estão presentes.
O escopo é uma noção do contexto e do ambiente de compartilhamento. A maioria das linguagens permite o aninhamento de escopos. Uma variável global está no maior escopo, o que significa que está sendo compartilhada com todos os outros códigos. Uma variável estática é (potencialmente) reduzida em escopo para a classe que está definindo-a, portanto, seu compartilhamento pode ser limitado a uma classe em vez de a todas as funções (também diferenças de módulo nas linguagens de programação e a noção de permissão de acesso). Uma variável local é declarada como um dos menores escopos possíveis, que é o escopo da função, e como tal só é acessível ao código dentro da função. Algumas linguagens permitem que os escopos internos restrinjam ainda mais o compartilhamento da variável com um código ainda menor.
Normalmente, variáveis declaradas em uma função ou escopo aninhado também têm vida útil do escopo funcional ou aninhada, mas isso nem sempre é o caso devido a diferenças de idioma e recursos como closures, que podem efetivamente estender o tempo de vida de variáveis locais. / p>
Permissões de acesso concedem permissão de leitura e / ou gravação a vários públicos-alvo. Quando falamos de variáveis globais, a permissão de acesso conotada é geralmente leitura e escrita, a permissão mais permissiva. Os idiomas que suportam variáveis estáticas, por outro lado, geralmente permitem que restrições de acesso personalizadas sejam aplicadas, como públicas ou privadas. Público sendo o mesmo que leitura / gravação global e acesso restrito privado ao escopo (ou seja, a classe de definição).
Variáveis locais, por definição na maioria das linguagens, são inacessíveis a outros códigos em outras funções, embora as linguagens geralmente não tentem restringir a leitura vs. escrita para locais (embora algumas linguagens como Swift e Javascript (e outras) suportem write-once (inicializar apenas) por meio de uma palavra-chave LET
ou const
, não confundir com a palavra-chave LET
do VB para atribuição de valor versus a SET
para atribuição de referência).
O raciocínio sobre a maior parte do que está acontecendo em relação ao estado no escopo da função não requer análise completa do programa (diferenças de idioma do módulo e métodos de passagem de parâmetros).
Em resumo
As variáveis globais vivem pelo tempo de vida do programa, são compartilhadas com todas as funções e geralmente permitem read & acesso de gravação.
Variáveis estáticas vivem pelo tempo de vida do programa; permitir escopo restrito (para a classe) e permitir permissão diferente de leitura vs. gravação.
As variáveis locais, por outro lado, são válidas para o tempo de vida do escopo (função ou outro), são compartilhadas apenas para o código no mesmo escopo.
Decompõe esses aspectos da declaração de variáveis, você provavelmente pode imaginar o efeito que cada um deles tem na complexidade potencial e o esforço exigido por humanos ou ferramentas com relação à análise do que o programa está fazendo ou tem potencial para fazer. / p>