Variável (ciência da computação) - Variable (computer science)

Em programação de computador , uma variável ou escalar é um local de armazenamento abstrato emparelhado com um nome simbólico associado , que contém alguma quantidade conhecida ou desconhecida de informação referida como um valor ; ou em termos fáceis, uma variável é um contêiner para um determinado conjunto de bits ou tipo de dados (como inteiro, float, String etc ...). Uma variável pode eventualmente ser associada ou identificada por um endereço de memória . O nome da variável é a forma usual de referenciar o valor armazenado, além de se referir à própria variável, dependendo do contexto. Essa separação de nome e conteúdo permite que o nome seja usado independentemente das informações exatas que representa. O identificador no código-fonte do computador pode ser vinculado a um valor durante o tempo de execução , e o valor da variável pode, portanto, mudar durante o curso da execução do programa .

As variáveis ​​na programação podem não corresponder diretamente ao conceito de variáveis ​​na matemática . O último é abstrato , não tendo referência a um objeto físico, como local de armazenamento. O valor de uma variável de computação não é necessariamente parte de uma equação ou fórmula como na matemática. As variáveis ​​na programação de computadores freqüentemente recebem nomes longos para torná-las relativamente descritivas de seu uso, enquanto as variáveis ​​na matemática costumam ter nomes concisos, de um ou dois caracteres para abreviar na transcrição e manipulação.

O local de armazenamento de uma variável pode ser referenciado por vários identificadores diferentes, uma situação conhecida como aliasing . Atribuir um valor à variável usando um dos identificadores mudará o valor que pode ser acessado por meio de outros identificadores.

Os compiladores devem substituir os nomes simbólicos das variáveis ​​pelas localizações reais dos dados. Embora o nome, o tipo e a localização de uma variável frequentemente permaneçam fixos, os dados armazenados na localização podem ser alterados durante a execução do programa.

Ações em uma variável

Em linguagens de programação imperativas , os valores geralmente podem ser acessados ou alterados a qualquer momento. Em linguagens puras funcionais e lógicas , as variáveis ​​são vinculadas a expressões e mantêm um único valor durante toda a sua vida devido aos requisitos de transparência referencial . Em linguagens imperativas, o mesmo comportamento é exibido por constantes (nomeadas) (constantes simbólicas), que são tipicamente contrastadas com variáveis ​​(normais).

Dependendo do sistema de tipos de uma linguagem de programação, as variáveis ​​podem apenas ser capazes de armazenar um tipo de dados especificado (por exemplo, inteiro ou string ). Como alternativa, um tipo de dados pode ser associado apenas ao valor atual, permitindo que uma única variável armazene qualquer coisa suportada pela linguagem de programação.

As variáveis ​​são os contêineres para armazenar os valores.

Variáveis ​​e escopo:

  • Variáveis ​​automáticas : Cada variável local em uma função passa a existir apenas quando a função é chamada e desaparece quando a função é encerrada. Essas variáveis ​​são conhecidas como variáveis ​​automáticas.
  • Variáveis ​​externas: são variáveis ​​externas a uma função e podem ser acessadas por nome por qualquer função. Essas variáveis ​​permanecem existindo permanentemente; em vez de aparecer e desaparecer à medida que as funções são chamadas e encerradas, eles retêm seus valores mesmo após o retorno das funções que os definiram.

Identificadores que fazem referência a uma variável

Um identificador que faz referência a uma variável pode ser usado para acessar a variável a fim de ler o valor, ou alterar o valor, ou editar outros atributos da variável, como permissão de acesso, bloqueios , semáforos , etc.

Por exemplo, uma variável pode ser referenciada pelo identificador " total_count" e a variável pode conter o número 1956. Se a mesma variável for referenciada pelo identificador " r" também, e se usar este identificador " r", o valor da variável é alterado para 2009, a leitura do valor usando o identificador " total_count" renderá um resultado de 2009 e não de 1956.

Se uma variável é referenciada apenas por um único identificador, esse identificador pode simplesmente ser chamado de nome da variável ; caso contrário, podemos falar dele como um dos nomes da variável . Por exemplo, no exemplo anterior, o identificador " total_count" é um nome da variável em questão e " r" é outro nome da mesma variável.

Escopo e extensão

O escopo de uma variável descreve onde no texto de um programa a variável pode ser usada, enquanto a extensão (também chamada de vida útil ) de uma variável descreve quando na execução de um programa a variável tem um valor (significativo). O escopo de uma variável afeta sua extensão. O escopo de uma variável é, na verdade, uma propriedade do nome da variável, e a extensão é uma propriedade do local de armazenamento da variável. Eles não devem ser confundidos com contexto (também chamado de ambiente ), que é uma propriedade do programa e varia por ponto no texto ou execução do programa - consulte o escopo: uma visão geral . Além disso, o tempo de vida do objeto pode coincidir com o tempo de vida variável, mas em muitos casos não está vinculado a ele.

O escopo é uma parte importante da resolução do nome de uma variável. A maioria das linguagens define um escopo específico para cada variável (bem como qualquer outra entidade nomeada), que pode diferir dentro de um determinado programa. O escopo de uma variável é a parte do texto do programa para a qual o nome da variável tem significado e para a qual a variável é considerada "visível". A entrada nesse escopo normalmente inicia o tempo de vida de uma variável (conforme ela entra no contexto) e a saída desse escopo normalmente termina seu tempo de vida (quando sai do contexto). Por exemplo, uma variável com " escopo léxico " é significativa apenas dentro de uma determinada função / sub-rotina , ou mais precisamente dentro de um bloco de expressões / declarações (de acordo com o escopo da função ou escopo do bloco ); esta é a resolução estática, executável em tempo de análise ou tempo de compilação. Como alternativa, uma variável com escopo dinâmico é resolvida em tempo de execução, com base em uma pilha de ligação global que depende do fluxo de controle específico. Variáveis ​​acessíveis apenas dentro de certas funções são chamadas de " variáveis ​​locais ". Uma " variável global ", ou uma com escopo indefinido, pode ser referenciada em qualquer parte do programa.

A extensão , por outro lado, é um aspecto de tempo de execução ( dinâmico ) de uma variável. Cada vinculação de uma variável a um valor pode ter sua própria extensão no tempo de execução. A extensão da ligação é a parte do tempo de execução do programa durante a qual a variável continua a se referir ao mesmo valor ou local de memória. Um programa em execução pode entrar e sair de uma determinada extensão muitas vezes, como no caso de um encerramento .

A menos que a linguagem de programação tenha coleta de lixo , uma variável cuja extensão permanentemente ultrapassa seu escopo pode resultar em um vazamento de memória , pelo qual a memória alocada para a variável nunca pode ser liberada, pois a variável que seria usada para referenciá-la para fins de desalocação não é mais acessível. No entanto, pode ser permitido que uma associação de variável se estenda além de seu escopo, como ocorre em fechamentos Lisp e variáveis ​​locais estáticas C ; quando a execução volta ao escopo da variável, a variável pode ser usada novamente. Uma variável cujo escopo começa antes de sua extensão é considerada não inicializada e freqüentemente tem um valor indefinido e arbitrário se acessada (consulte o ponteiro selvagem ), uma vez que ainda não recebeu explicitamente um valor particular. Uma variável cuja extensão termina antes de seu escopo pode se tornar um ponteiro pendente e considerada não inicializada mais uma vez, pois seu valor foi destruído. As variáveis ​​descritas nos dois casos anteriores podem ser consideradas fora de extensão ou não ligadas . Em muitas linguagens, é um erro tentar usar o valor de uma variável quando ela está fora de extensão. Em outras línguas, isso pode gerar resultados imprevisíveis . Essa variável pode, entretanto, receber um novo valor, o que lhe confere uma nova extensão.

Para eficiência de espaço, um espaço de memória necessário para uma variável pode ser alocado apenas quando a variável é usada pela primeira vez e liberado quando não é mais necessário. Uma variável só é necessária quando está no escopo, portanto, o início da vida útil de cada variável quando ela entra no escopo pode dar espaço para variáveis ​​não utilizadas. Para evitar o desperdício de espaço, os compiladores costumam avisar os programadores se uma variável for declarada, mas não usada.

É considerada uma boa prática de programação tornar o escopo das variáveis ​​o mais estreito possível, de modo que diferentes partes de um programa não interajam acidentalmente umas com as outras, modificando as variáveis ​​umas das outras. Isso também evita ações à distância . Técnicas comuns para fazer isso são fazer com que diferentes seções de um programa usem espaços de nomes diferentes ou tornar variáveis ​​individuais "privadas" por meio de escopo de variável dinâmica ou escopo de variável lexical .

Muitas linguagens de programação empregam um valor reservado (geralmente denominado nulo ou nulo ) para indicar uma variável inválida ou não inicializada.

Digitando

Em linguagens com tipagem estática , como Go ou ML , uma variável também tem um tipo , o que significa que apenas certos tipos de valores podem ser armazenados nela. Por exemplo, uma variável do tipo " inteiro " está proibida de armazenar valores de texto.

Em linguagens com tipagem dinâmica , como Python , o tipo de uma variável é inferido por seu valor e pode mudar de acordo com seu valor. No Common Lisp , as duas situações existem simultaneamente: Uma variável recebe um tipo (se não declarado, presume-se que seja T, o supertipo universal ) que existe em tempo de compilação. Os valores também têm tipos, que podem ser verificados e consultados em tempo de execução.

A digitação de variáveis ​​também permite que os polimorfismos sejam resolvidos em tempo de compilação. No entanto, isso é diferente do polimorfismo usado em chamadas de função orientadas a objetos (chamadas de funções virtuais em C ++ ), que resolve a chamada com base no tipo de valor em oposição aos supertipos que a variável pode ter.

As variáveis ​​geralmente armazenam dados simples, como inteiros e strings literais, mas algumas linguagens de programação permitem que uma variável armazene valores de outros tipos de dados também. Essas linguagens também podem permitir que as funções sejam polimórficas paramétricas . Essas funções operam como variáveis ​​para representar dados de vários tipos. Por exemplo, uma função chamada lengthpode determinar o comprimento de uma lista. Tal lengthfunção pode ser paramétrica polimórfica ao incluir uma variável de tipo em sua assinatura de tipo , uma vez que o número de elementos na lista é independente dos tipos dos elementos.

Parâmetros

Os parâmetros formais (ou argumentos formais ) de funções também são chamados de variáveis. Por exemplo, neste segmento de código Python ,

>>> def addtwo(x):
...     return x + 2
...
>>> addtwo(5)
7

a variável nomeada xé um parâmetro porque recebe um valor quando a função é chamada. O inteiro 5 é o argumento que fornece xseu valor. Na maioria das linguagens, os parâmetros de função têm escopo local. Essa variável específica nomeada xsó pode ser referenciada dentro da addtwofunção (embora, é claro, outras funções também possam ter variáveis ​​chamadas x).

Alocação de memória

As especificidades da alocação de variáveis ​​e a representação de seus valores variam amplamente, tanto entre as linguagens de programação quanto entre as implementações de uma determinada linguagem. Muitas implementações de linguagem alocam espaço para variáveis ​​locais , cuja extensão dura para uma única chamada de função na pilha de chamadas e cuja memória é automaticamente recuperada quando a função retorna. De maneira mais geral, na vinculação de nome , o nome de uma variável é vinculado ao endereço de algum bloco específico (sequência contígua) de bytes na memória e as operações na variável manipulam esse bloco. A referência é mais comum para variáveis ​​cujos valores têm tamanhos grandes ou desconhecidos quando o código é compilado. Essas variáveis ​​fazem referência à localização do valor em vez de armazenar o próprio valor, que é alocado a partir de um pool de memória chamado heap .

Variáveis ​​associadas têm valores. Um valor, entretanto, é uma abstração, uma ideia; na implementação, um valor é representado por algum objeto de dados , que é armazenado em algum lugar na memória do computador. O programa, ou o ambiente de execução , deve reservar memória para cada objeto de dados e, como a memória é finita, garantir que essa memória seja produzida para reutilização quando o objeto não for mais necessário para representar o valor de alguma variável.

Os objetos alocados do heap devem ser recuperados - especialmente quando os objetos não são mais necessários. Em uma linguagem com coleta de lixo (como C # , Java , Python, Golang e Lisp ), o ambiente de tempo de execução recupera objetos automaticamente quando as variáveis ​​existentes não podem mais se referir a eles. Em linguagens sem coleta de lixo, como C , o programa (e o programador) deve alocar explicitamente a memória e, posteriormente, liberá-la para recuperar sua memória. Deixar de fazer isso leva a vazamentos de memória , nos quais o heap se esgota à medida que o programa é executado, podendo ocorrer falha por esgotar a memória disponível.

Quando uma variável se refere a uma estrutura de dados criada dinamicamente, alguns de seus componentes podem ser acessados ​​apenas indiretamente por meio da variável. Em tais circunstâncias, os coletores de lixo (ou recursos de programa análogos em linguagens que não possuem coletores de lixo) devem lidar com um caso em que apenas uma parte da memória acessível a partir da variável precisa ser recuperada.

Convenções de nomenclatura

Ao contrário de suas contrapartes matemáticas, as variáveis ​​e constantes de programação geralmente recebem nomes de vários caracteres, por exemplo, COSTou total. Os nomes de um único caractere são mais comumente usados ​​apenas para variáveis ​​auxiliares; por exemplo, i, j, kpara o índice de matriz variáveis.

Algumas convenções de nomenclatura são aplicadas no nível do idioma como parte da sintaxe do idioma que envolve o formato de identificadores válidos. Em quase todos os idiomas, os nomes das variáveis ​​não podem começar com um dígito (0–9) e não podem conter caracteres de espaço em branco. Se os sinais de pontuação são permitidos ou não em nomes de variáveis, varia de idioma para idioma; muitos idiomas permitem apenas o sublinhado ("_") em nomes de variáveis ​​e proíbem todas as outras pontuações. Em algumas linguagens de programação, sigilos (símbolos ou pontuação) são afixados a identificadores de variáveis ​​para indicar o tipo de dados ou escopo da variável.

A diferenciação de maiúsculas e minúsculas de nomes de variáveis ​​também varia entre os idiomas e alguns idiomas requerem o uso de um determinado caso ao nomear certas entidades; A maioria das linguagens modernas diferencia maiúsculas de minúsculas; algumas línguas mais antigas não são. Alguns idiomas reservam certas formas de nomes de variáveis ​​para seu próprio uso interno; em muitos idiomas, os nomes que começam com dois sublinhados ("__") geralmente se enquadram nessa categoria.

No entanto, além das restrições básicas impostas por um idioma, a nomenclatura de variáveis ​​é em grande parte uma questão de estilo. No nível do código de máquina , os nomes das variáveis ​​não são usados, portanto, os nomes exatos escolhidos não importam para o computador. Assim, os nomes das variáveis ​​os identificam; de resto, são apenas uma ferramenta para os programadores tornarem os programas mais fáceis de escrever e compreender. Usar nomes de variáveis ​​mal escolhidos pode tornar o código mais difícil de revisar do que nomes não descritivos, então nomes que são claros são freqüentemente encorajados.

Os programadores geralmente criam e aderem às diretrizes de estilo de código que oferecem orientação sobre a nomenclatura de variáveis ​​ou impõem um esquema de nomenclatura preciso. Nomes mais curtos são mais rápidos de digitar, mas são menos descritivos; nomes mais longos geralmente tornam os programas mais fáceis de ler e o propósito das variáveis ​​mais fácil de entender. No entanto, o detalhamento extremo em nomes de variáveis ​​também pode levar a códigos menos compreensíveis.

Tipos de variáveis ​​(com base na vida útil)

Em termos de classificações de variáveis, podemos classificar variáveis ​​com base no tempo de vida delas. Os diferentes tipos de variáveis ​​são estática, dinâmica de pilha, dinâmica de pilha explícita e dinâmica de pilha implícita. Uma variável estática também é conhecida como variável global, ela é vinculada a uma célula de memória antes do início da execução e permanece na mesma célula de memória até o término. Um exemplo típico são as variáveis ​​estáticas em C e C ++. Uma variável dinâmica da pilha é conhecida como variável local, que é vinculada quando a instrução de declaração é executada e é desalocada quando o procedimento retorna. Os principais exemplos são variáveis ​​locais em subprogramas C e métodos Java. Variáveis ​​dinâmicas de heap explícitas são células de memória sem nome (abstratas) que são alocadas e desalocadas por instruções explícitas de tempo de execução especificadas pelo programador. Os principais exemplos são objetos dinâmicos em C ++ (via new e delete) e todos os objetos em Java. Variáveis ​​Heap-Dynamic implícitas são vinculadas ao armazenamento de heap apenas quando são atribuídos valores. A alocação e a liberação ocorrem quando os valores são reatribuídos às variáveis. Como resultado, as variáveis ​​dinâmicas no monte implícitas têm o mais alto grau de flexibilidade. Os principais exemplos são algumas variáveis ​​em JavaScript, PHP e todas as variáveis ​​em APL.

Veja também

Notas

Referências