Variável local - Local variable

Em ciência da computação , uma variável local é uma variável que recebe um escopo local . As referências de variáveis ​​locais na função ou bloco em que são declaradas substituem o mesmo nome de variável no escopo maior. Em linguagens de programação com apenas dois níveis de visibilidade, as variáveis ​​locais são contrastadas com as variáveis ​​globais . Por outro lado, muitas linguagens derivadas do ALGOL permitem qualquer número de níveis aninhados de visibilidade, com variáveis ​​privadas, funções, constantes e tipos ocultos dentro deles, seja por blocos aninhados ou funções aninhadas . Variáveis ​​locais são fundamentais para a programação procedural e, mais geralmente, para a programação modular : variáveis ​​de escopo local são usadas para evitar problemas com efeitos colaterais que podem ocorrer com variáveis ​​globais .

Alcance

Variáveis ​​locais podem ter um escopo léxico ou dinâmico , embora o escopo léxico (estático) seja muito mais comum. No escopo léxico (ou escopo léxico; também chamado de escopo estático ou escopo estático), se o escopo de um nome de variável for um determinado bloco, então seu escopo é o texto do programa da definição do bloco: dentro do texto desse bloco, o nome da variável existe, e está vinculado ao valor da variável, mas fora do texto desse bloco, o nome da variável não existe. Em contraste, no escopo dinâmico (ou escopo dinâmico), se o escopo de um nome de variável é um determinado bloco, então seu escopo é aquele bloco e todas as funções transitivamente chamadas por aquele bloco (exceto quando sobrescrito novamente por outra declaração); após o término do bloco, o nome da variável não existe. Algumas linguagens, como Perl e Common Lisp , permitem que o programador escolha o escopo estático ou dinâmico ao definir ou redefinir uma variável. Exemplos de linguagens que usam escopo dinâmico incluem Logo , Emacs lisp e as linguagens de shell bash , dash e a declaração "local" do shell MirBSD Korn ( mksh ). A maioria das outras linguagens fornece variáveis ​​locais com escopo léxico.

Na maioria dos idiomas, as variáveis ​​locais são variáveis ​​automáticas armazenadas diretamente na pilha de chamadas . Isso significa que, quando uma função recursiva chama a si mesma, as variáveis ​​locais em cada instância da função recebem endereços distintos . Portanto, as variáveis ​​desse escopo podem ser declaradas, gravadas e lidas, sem nenhum risco de efeitos colaterais nas funções fora do bloco em que foram declaradas.

As linguagens de programação que empregam a semântica de chamada por valor fornecem uma sub-rotina chamada com sua própria cópia local dos argumentos passados ​​a ela. Na maioria dos idiomas, esses parâmetros locais são tratados da mesma forma que outras variáveis ​​locais na sub-rotina. Em contraste, a semântica de chamada por referência e chamada por nome permite que os parâmetros atuem como apelidos dos valores passados ​​como argumentos, permitindo que a sub-rotina modifique variáveis ​​fora de seu próprio escopo.

Variáveis ​​locais estáticas

Um tipo especial de variável local, chamado local estático, está disponível em muitas linguagens convencionais (incluindo C / C ++ , Visual Basic e VB.NET ) que permite que um valor seja retido de uma chamada da função para outra - é uma variável estática com escopo local. Nesse caso, as chamadas recursivas para a função também têm acesso à variável (única, estaticamente alocada ). Em todas as linguagens acima, as variáveis ​​estáticas são declaradas como tal com uma palavra-chave de classe de armazenamento especial (por exemplo, static ).

Locais estáticos em funções globais têm o mesmo tempo de vida que as variáveis ​​globais estáticas , porque seu valor permanece na memória durante a vida do programa, mas têm escopo de função (não escopo global), como acontece com as variáveis ​​locais automáticas.

Isso é diferente de outros usos da static palavra - chave , que tem vários significados diferentes em vários idiomas.

Variáveis ​​locais em Perl

Perl suporta variáveis ​​locais dinâmicas e com escopo léxico. A palavra local - chave é usada para definir variáveis ​​locais com escopo dinâmico, enquanto my é usada para variáveis ​​locais com escopo léxico. Como o escopo dinâmico é menos comum hoje, a documentação do Perl avisa que " local não é o que a maioria das pessoas pensa como“ local ”.". Em vez disso, a local palavra - chave fornece um valor temporário com escopo dinâmico para uma variável global (pacote), que dura até o final do bloco envolvente. No entanto, a variável é visível para qualquer função chamada de dentro do bloco. Para criar variáveis ​​locais com escopo léxico, use o my operador.

Para entender como funciona, considere o seguinte código:

$a = 1;
sub f() {
    local $a;
    $a = 2;
    g();
}
sub g() {
    print "$a\n";
}
g();
f();
g();

isso resultará em:

1
2
1

Isso acontece porque a variável global $ a é modificada para um novo significado temporário (local) interno f() , mas o valor global é restaurado ao sair do escopo de f() .

my Nesse caso, usar em vez de local teria impresso 1 três vezes, pois, nesse caso, a $a variável seria limitada ao escopo estático da função f() e não seria vista por g() .
Randal L. Schwartz e Tom Phoenix argumentam que a operadora local deveria ter um nome diferente como save .

Variáveis ​​locais em Ruby

Ruby como uma linguagem foi inspirada também em Perl, mas neste caso, a notação foi simplificada: um nome de variável global deve ser precedido por um sinal $, como $variable_name , enquanto uma variável local simplesmente não tem o sinal $ antes de seu nome, like variable_name (enquanto em perl todos os valores escalares têm um $ na frente). Observe que o Ruby só fornece suporte integrado para variáveis ​​locais com escopo estático como o Perl my , não variáveis ​​locais com escopo dinâmico como o Perl local . Existe pelo menos uma biblioteca para Ruby que fornece variáveis ​​com escopo dinâmico.

Veja também

Referências

  1. ^ "Padrão C atual" (PDF) .   (3,61 MB) (a partir de 2009). Em particular, consulte a seção 6.2.4 “Durações de armazenamento de objetos”, página 32.
  2. ^ perldoc.perl.org: local
  3. ^ perldoc.perl.org: perlsub: Valores temporários via local()
  4. ^ perldoc.perl.org: perlsub: Variáveis ​​privadas via my()
  5. ^ Randal L. Schwartz e Tom Phoenix (01/07/2001). Aprendizagem Perl 3ª edição . O'REILLY. parágrafo 4.7. ISBN   0-596-00132-0 .
  6. ^ Conrad Irwin. "LSpace: escopo dinâmico para Ruby". Dezembro de 2012 http://cirw.in/blog/lspace Recuperado 2013-10-16.