Como um programa de computador consegue receber valores, processar esses valores e retornar um resultado?
A resposta é simples: usando variáveis.
E isso leva a outra pergunta:
O que são variáveis em programação?
As variáveis são os elementos da programação que permitem o armazenamento de valores na memória do computador e seu uso pelo programa.
O conceito de variável inclui quatro características: o nome usado pelo programa para a variável, o endereço de memória para o qual aquele nome aponta, o valor armazenado naquele endereço de memória e o tipo de dado armazenado.
Se você achou complicado, nesse post eu explico em detalhes essa definição e dou vários exemplos para que você comece a usar variáveis em seus programas agora mesmo.
Qual é a definição de variável em programação?
Se você pesquisar na Internet o que são variáveis em programação, vai encontrar várias respostas dizendo que variáveis são “caixas” na memória do computador onde os programas armazenam valores.
Apesar de ser uma analogia muito boa, essa informação não está completa.
Como eu expliquei na definição acima, um programa armazena e lê dados da memória do computador usando variáveis.
Então, vamos analisar em detalhes as características de uma variável e como ela utiliza a memória.
E não se preocupe com a precisão dos detalhes técnicos agora. O importante é você entender o que é uma variável e como ela é usada em um programa.
Declaração de Variáveis em Programação
Para que uma variável exista em um programa, ela precisa ser declarada.
Eu sugiro que você execute o código Python mostrado nesse post no Jupyter Lab para treinar.
O Jupyter Lab é uma ferramenta ótima para começar a programar e deve fazer parte da sua lista de ferramentas como programador.
Se você ainda não tem o Jupyter Lab instalado, dá uma olhada nesse post onde eu explico o passo-a-passo para a instalação.
A declaração de variáveis tem uma sintaxe específica em cada linguagem de programação, mas é bem semelhante em todas as linguagens e geralmente obedece a seguinte ordem:
<tipo> <nome> = <valor>
Para ficar mais fácil de entender, veja nos exemplos a seguir como seria a declaração da mesma variável em algumas linguagens de programação.
Os nomes das variáveis estão do lado esquerdo e os valores que elas devem receber estão do lado direito. O sinal de igual faz a atribuição desse valor à variável com esse nome.
# Python:
b = 5
Code language: Python (python)
// Java:
int b = 5;
Code language: Java (java)
// Javascript:
let b = 5;
Code language: JavaScript (javascript)
// Typescript:
let b:number = 5
Code language: TypeScript (typescript)
Todos esses exemplos criam uma variável do tipo inteiro, de nome b
e com valor igual a 5.
A partir desse momento, a variável b
está pronta para ser usada pelo programa.
No entanto, após a declaração da variável, obviamente o seu conteúdo pode… variar!
# Python:
b = 5
b = b + 1
# O valor de b agora é 6!
Code language: Python (python)
Agora vamos ver os detalhes de cada característica de uma variável:
Tipos de Variáveis em Programação
O <tipo>
se refere ao tipo de dado do <valor>
da variável. Ele pode ser inteiro, string, booleano, objeto, entre outros.
No exemplo acima, a variável b
é do tipo inteiro. Já na declaração de variável x = True
, a variável x
é do tipo booleano (verdadeiro ou falso).
Se você reparou bem nos exemplos acima, nem todas as linguagens de programação permitem que você declare o tipo de uma variável.
Em Python, por exemplo, você só escreve b = 5
e o próprio compilador usa o valor (5) para identificar o tipo de dado (inteiro).
Nomes de Variáveis em Programação
Já o <nome>
da variável é obrigatório e é escolhido pelo programador quando escreve o código. Ele é conhecido como “identificador” e deve ser único.
Se você quiser aprender a escolher nomes para suas variáveis, dá uma olhada nesse post, onde eu explico em detalhes tudo sobre nomes de variáveis.
Quando o <nome>
da variável aparece do lado esquerdo da declaração, o <valor>
está sendo atribuído à variável.
Por exemplo, veja a declaração da variável x
:
# Python:
x = True
# x recebe o valor True
Code language: Python (python)
Quando o <nome>
da variável aparece do lado direito da declaração, o <valor>
daquela variável está sendo atribuído a outra variável.
Por exemplo, veja a declaração da variável y
, recebendo o valor da variável x
:
y = x
# y recebe o valor que está na variável identificada por x.
# Ou seja, y agora tem o valor True
print(y)
# Resultado: True
Code language: Python (python)
Simples, não é?
Talvez você esteja acostumado com o uso do sinal de igual “=” na matemática, onde x = 1
significa que foi encontrado o valor 1 para a variável x.
Esse conceito da matemática é diferente da atribuição usada em programação, que você acabou de ver.
Você já entendeu como funcionam o tipo, o nome e o valor da variável, mas…
E o endereço de memória?
Endereço de Memória de uma Variável
O endereço de memória não é um texto livre, como o nome da variável. Ele é representado por um número fixo, determinado pelo computador. É comum ver esse número escrito em notação hexadecimal (base 16).
Esse endereço não muda. O que varia é apenas o conteúdo armazenado naquele endereço, ou seja, o <valor>
da variável.
Não vou entrar em mais detalhes agora porque esse post não é sobre endereçamento de memória e porque você não precisa se preocupar com esse número representado em base 16. Mais à frente você vai entender o motivo.
Uma analogia que facilita a compreensão do endereço de memória de uma variável é pensar nos escaninhos de correspondência de um prédio de apartamentos.
Se todos os escaninhos representam a memória total do computador, cada escaninho é um endereço de memória disponível.
Nesse exemplo, o nome da variável seria a plaquinha de identificação de cada apartamento. Por exemplo, os nomes das variáveis seriam apto101
, apto102
, apto201
e assim por diante.
Da mesma forma que o carteiro sabe colocar a correspondência no escaninho certo olhando as plaquinhas, o programador sabe como usar a variável certa pelo seu nome no programa.
Perceba que a plaquinha no escaninho é só uma etiqueta. Se alguém trocar as plaquinhas de lugar, os “endereços físicos” (os escaninhos) continuam os mesmos.
Além disso, os escaninhos também não mudam de acordo com o tipo de correspondência que é colocada dentro deles. Pode ser uma carta, um telegrama, uma revista, um pacote pequeno…
Na analogia com os endereços de memória, o tipo de correspondência é o tipo da variável. Ele só tem relação com o tamanho do escaninho.
De que forma?
Bem, um item pequeno, como uma conta, ocupa pouco espaço no escaninho. Um item grande, como uma caixa de sapatos, ocupa muito espaço, ou talvez nem caiba no escaninho.
Por fim, qualquer item real colocado no escaninho representa o valor da variável nessa analogia. Por exemplo, se o “tipo da variável” for “conta”, o “valor da variável” pode ser “conta de energia do mês de dezembro”.
O valor sempre é atribuído a um apartamento específico, que é identificado pela plaquinha (o nome da variável). Lembra do exemplo b = 5
?
A única diferença entre o escaninho e o endereço de memória nessa analogia é que o escaninho pode receber diversos valores ao mesmo tempo, ou seja, diversas correspondências, inclusive de tipos diferentes.
Já o endereço de memória só pode receber um valor (de um tipo específico) de cada vez.
Então, o valor armazenado muda de tempos em tempos, quando a variável deixa de existir e o mesmo endereço de memória é reutilizado pelo programa para uma nova variável.
Isso seria como se o escaninho só pudesse guardar uma correspondênia de cada vez e fosse esvaziado quando chegasse uma nova.
Mas já pensou se as cartas de todos os apartamentos fossem colocadas em qualquer escaninho? Seria uma confusão…
Pois é, o mesmo acontece com as variáveis.
Uma vez declaradas as variáveis e atribuídos seus valores, não pode haver sobreposição desses valores nos endereços de memória, senão o programa não vai funcionar direito.
Agora que você entendeu a analogia com os escaninhos, vou dar um exemplo mais próximo da realidade.
Na verdade, os endereços de memória são espaços de 1 byte em sequência.
Como você viu, o tipo de dado determina quanto espaço o compilador vai usar na memória para aquela variável, ou seja, quanto de memória o compilador vai “alocar”.
Por exemplo, na linguagem Java o espaço ocupado na memória pelos tipos de dados primitivos é consistente em todas as plataformas (Windows, Linux, sistemas embarcados).
Nesse post eu trato do tipo mais simples de memória, a stack (pilha). Por isso o exemplo menciona os tipos de dados primitivos em Java.
Os demais tipos e estruturas de dados em Java são objetos. As variáveis do tipo objeto são alocadas em um outro espaço de memória, chamado heap.
Como esse é um post introdutório sobre variáveis, eu não vou entrar em detalhes de como funciona o heap e a alocação de objetos em memória.
Na linguagem Java, uma variável do tipo boolean ocupa 1 byte e uma variável do tipo inteiro ocupa 4 bytes.
Assim, o endereço de memória da variável é o primeiro endereço com tamanho suficiente para armazenar uma variável daquele tipo.
Para facilitar, veja na imagem a seguir uma representação conceitual dessa explicação:
Os índices que têm as declarações de variáveis ao lado são os endereços de memória dessas variáveis.
Veja que para alocar uma variável do tipo boolean é preciso apenas de 1 byte.
No entanto, para declarar uma variável do tipo inteiro, são necessários 4 bytes contíguos, como você viu na figura.
Quando o programa é executado, os nomes de variáveis somem e são substituídos pelos endereços de memória.
O compilador possibilita que essa substituição seja feita em tempo de execução (runtime).
Resumindo:
O programador cria uma variável definindo seu tipo, escolhendo seu nome e atribuindo seu valor. O compilador faz a correspondência desse nome para um endereço de memória e aloca a quantidade de bytes necessária para a variável.
Foi por isso que eu disse que o programador quase sempre pode ignorar o endereço de memória de uma variável em base 16 e usar apenas o nome criado durante o desenvolvimento do código.
Isso muda quando usamos ponteiros. Mas esse já é um assunto para outro post…
Qual é a Diferença entre Variável e Constante?
Bem, só pelos nomes já fica fácil de saber…
O valor das variáveis pode mudar durante a execução do programa, mas o valor das constantes não.
É só isso?
Na verdade, não…
Já que uma constante não varia, ela sempre é inicializada com um valor no mesmo momento em que é declarada.
Além disso, tem outra coisa que você precisa saber sobre constantes.
É que, em algumas linguagens, como Python, não é possível criar uma constante. Tudo é variável!
No máximo, algumas variáveis são declaradas usando uma convenção – um padrão de texto – para mostrar que são constantes.
Na maioria das linguagens e em Python também, essa convenção é declarar o identificador todo em letras maiúsculas.
Por exemplo:
NUM_MAX_ANDARES = 30 # Constante por convenção
PI = 3.1415926536 # Constante por convenção
PI = PI + 1
# Cuidado! Esse código é válido e PI agora tem o valor 4.1415926536!
Code language: Python (python)
Então, você já sabe…
Se você encontrar um identificador todo em letras maiúsculas no seu código Python, apenas use o seu valor. Não atribua nenhum valor a ele.
Já em outras linguagens, como Java, é possível declarar uma constante de verdade.
Nessa linguagem, isso é feito da mesma forma que se declara uma variável, mas adicionando a palavra final
antes da declaração.
Dessa forma, qualquer tentativa de alterar o valor da constante depois que ela tiver sido inicializada resulta em erro.
Veja esse exemplo de código Java:
int numAndares = 20;
numAndares++; //soma um andar
// numAndares é uma variável e seu valor pode mudar a qualquer momento.
final double PI = 3.1415926536;
PI++; // Erro! Não é possível alterar o valor da constante.
Code language: Java (java)
Mas não pense que isso faz uma linguagem ser melhor que a outra…
Quanto maior a quantidade de artifícios que a linguagem tiver para proteger o programador dele mesmo, maior será sua complexidade.
E porque a linguagem Python é mais simples, eu recomendo que você comece a programar por ela. Dá uma olhada nesse post onde eu falo sobre todos os motivos para escolher Python como sua primeira linguagem de programação.
O que são Variáveis Globais e Locais?
Para entender o que são variáveis locais e globais, você precisa entender o conceito de escopo de uma variável.
O escopo de uma variável é a parte do código do programa na qual a variável é válida e pode ser usada. Dizemos que a variável é “visível” naquele escopo. Em geral, o escopo é definido por um bloco de código ou uma função.
Isso é mais fácil de entender com um exemplo.
Por isso, veja o código Python a seguir, com a descrição do escopo de cada variável. Não se preocupe se você não entender o código todo ainda.
a = 2
b = 5
def somar(x, y): # Início da declaração da função “somar”
soma = x + y # A variável soma só é visível no escopo da função “somar”.
return soma # Fim da função
# A variável soma não é visível fora da função.
# Apenas o seu valor é retornado quando a função é chamada.
# As variáveis a e b são visíveis em qualquer escopo.
s = somar(a, b)
print(s)
# Resultado: 7
print(soma)
# Erro!
Code language: Python (python)
As variáveis locais são definidas dentro de uma função ou bloco de código limitado. Isso restringe a sua visibilidade a esse escopo.
Já as variáveis globais são definidas fora de qualquer bloco e são visíveis em qualquer parte do programa. Isso significa que essas variáveis não têm um escopo restrito.
No exemplo acima, a variável soma
é local e as variáveis a
e b
são globais.
É considerada boa prática limitar o escopo das variáveis ao mínimo possível, usando apenas variáveis locais.
Por quê?
O conteúdo de uma variável global pode ser alterado em qualquer parte do programa. Isso faz com que seu valor seja imprevisível durante a execução.
Para reforçar essa boa prática, veja o caso da Toyota, que pagou US$ 1,2 bilhão em processos judiciais por conta de um defeito em seus carros.
O defeito provocava uma aceleração súbita nos veículos, contra a vontade do motorista, o que teria causado diversos acidentes. Estima-se que 89 pessoas morreram em acidentes relacionados a esse problema!
Uma investigação foi conduzida por engenheiros de software da NASA em 2010. Eles relataram que o comportamento do software que controlava a aceleração dos carros era imprevisível em algumas situações, o que pode ter contribuído para causar os acidentes.
Entre outros problemas, o código-fonte desse software tinha mais de 11.000 variáveis globais.
De acordo com os especialistas, “o padrão acadêmico é ter zero variáveis globais”.
Isso ajuda a explicar porque você não deve usar variáveis globais. O resultado pode ser catastrófico.
A exceção a essa regra são as constantes, que podem ser globais, já que seu valor não pode ser alterado durante a execução do programa.
Conclusão
Nesse post você aprendeu o que são variáveis, como são declaradas, como são armazenadas na memória do computador, como são visíveis em um determinado escopo e qual é a diferença entre variáveis e constantes.
E aí, o que você achou?
Comenta aí se foi fácil de entender. Diga também como eu posso melhorar esse post!