You are on page 1of 5

Variveis e Memria

Reviso
Estudamos, na Introduo, que programas de computador implementam algoritmos, os
quais manipulam um conjunto de dados para produzir um resultado. O algoritmo formado
por uma seqncia de instrues que so executadas na ordem especificada, salvo por
instrues de desvio. Para executar cada instruo, exceto instrues de desvio, o algoritmo
consulta dados armazenados na memria, realiza algum processamento sobre alguns dados
e, por fim, armazena novamente o resultado na memria. No caso de instrues de desvio,
o algoritmo consulta dados armazenados na memria e determina qual deve ser a nova
instruo a executar.
Este funcionamento dos programas motiva o estudo da memria do computador, na qual
realizado o armazenamento dos dados manipulados pelo algoritmo.

Conceitos
A memria pode ser entendida como uma seqncia de clulas nas quais se pode armazenar
um valor correspondente a um dado. Para fins didticos, consideramos memrias com um
nmero ilimitado de clulas. Na prtica, os computadores atuais costumam apresentar
algumas centenas de milhes de clulas, ou mesmo bilhes de clulas.
Como as clulas esto organizadas seqencialmente, atribui-se elas um nmero
correspondente a sua posio na seqncia, contando a partir do zero. Este nmero
denomina-se endereo da clula. A manipulao dos endereos de memria ser estudada
mais para o final do curso.
Cada clula de memria caracterizada pelo seu endereo e seu
contedo.
Uma clula de memria armazena um nico valor (contedo), que representado por uma
seqncia de bits. Um bit nada mais que um dos valores 0 ou 1. A uma seqncia de 8
bits d-se o nome de byte. Usualmente, cada clula da memria formada por um byte, ou
8 bits. Significa dizer que um byte a menor quantidade de bits que podem ser endereados
individualmente na memria do computador. Assim, um computador com M posies de
memria vai dispor de M clulas, de 8 bits cada uma, onde poder armazenar valores de
dados. Numa nica operao de leitura ou escrita, o computador poder enderear cada
uma dessas M clulas individualmente, mas no poder enderear, ou acessar, apenas
partes de uma delas em operaes de leitura e escrita.
Um byte pode representar um nmero, um caractere (letra), ou outro objeto, como veremos
oportunamente. Eventualmente, quando for necessrio armazenar um valor relativamente
grande, por exemplo, um nmero com muitos dgitos, poder surgir a necessidade de se
utilizar mais de uma clula consecutiva da memria para armazenar o dado.
O armazenamento nas clulas voltil (no permanente). Se ocorrer alguma falha no
computador ou cessar a alimentao eltrica, o seu contedo perdido.

16/3/2010 08:34 Copyright@2005-2009 Arnaldo V. Moura, Daniel F. Ferber 1


Operaes sobre a memria
A memria permite dois tipos de operaes: leitura e escrita. Sempre precisamos indicar o
endereo da clula sobre qual desejamos realizar a operao.
A primeira delas, a leitura, localiza a clula correspondente ao endereo desejado e
consulta o valor armazenado nesta clula. Aps a leitura, a clula continua com o valor
original que estava armazenado antes de se executar esta operao. Note que a leitura
retorna o contedo de uma cela de memria. Se o dado estiver contido em mais de uma
clula, ento todas as clulas onde est armazenado o dado devem ser consultadas para que
se possa recuperar o valor correto do dado.
A escrita trabalha com um endereo e um valor. De forma semelhante leitura, a escrita
localiza a clula no endereo desejado, e em seguida substitui o contedo da mesma pelo
novo valor. Durante este processo, o contedo anterior da clula perdido de forma
irreversvel. De forma semelhante leitura, se o dado ocupar mais de uma clula, ento
todas as celas associadas a ele devem ser adequadamente escritas para que o novo valor do
dado seja corretamente armazenado na memria.
Processamento de um programa
Essencialmente, para executar um algoritmo, o computador repete o seguinte ciclo:
1) Decodifica a instruo a ser executada.
2) Obtm um ou mais valores da memria, utilizando operaes de leitura.
3) Realiza algum tipo de processamento sobre os dados consultados na memria.
Como conseqncia, gerado um novo valor.
4) Efetua uma escrita para armazenar o resultado em uma clula da memria.
Quando se tratar de uma operao de desvio, mais raras, no passo 3 o computador
determina qual a prxima instruo a ser executada e passa a execut-la, iniciando
novamente no passo 1. Se no for uma instruo de desvio, o computador simplesmente
repete a partir do passo 1 com a prxima instruo na seqncia dada.

Um programa nada mais faz que manipular valores que esto


armazenados nas clulas da memria. O efeito final do programa
dado pelo contedo final das clulas de memria que ele manipula.

Exemplo
Vamos relembrar o algoritmo de Euclides 1) Leia um nmero e escreva na clula 1
que calcula o MDC (mximo divisor 2) Leia um nmero e escreva na clula 2
comum), apresentado na Introduo. Veja 3) Divida o valor da clula 1 pelo valor da
ao lado. No incio, temos dois nmeros, clula 2. Guarde o quociente na clula
que so dados como entrada para o 3 e o resto na clula 4.
algoritmo. Portanto, estes dois nmeros 4) Se o valor da clula 4 for 0 (zero),
devem ser armazenados cada um em uma ento mostre o valor da clula 2 e
clula de memria. Assumiremos que o PARE.
primeiro nmero ser armazenado na 5) Escreva na clula 1 o valor da clula 2.
clula de endereo 1 e o segundo nmero 6) Escreva na clula 2 o valor da clula 4.
7) Retorne ao passo 3.
Algoritmo 1 - MDC usando endereos de clulas
16/3/2010 08:34 Copyright@2005-2009 Arnaldo V. Moura, Daniel F. Ferber
de memria 2
na clula de endereo 2. A Figura 1 mostra como os valores so armazenados nas clulas de
memria.
No terceiro passo, calculamos o quociente e o resto da diviso do primeiro nmero, i.e., do
valor armazenado no endereo 1, pelo segundo numero, i.e., pelo valor armazenado no
endereo 2. Como no desejamos perder o valor destes dois
Memria: nmeros, precisamos escrever o quociente e o resto obtidos em
novas clulas de memria. No exemplo, guardamos o quociente e
7
o resto, respectivamente, nas clulas de endereo 3 e 4.
6
5
Finalmente, antes do algoritmo continuar a execuo, note que a
prxima operao de diviso espera que os nmeros estejam nas
4 Resto
clulas de endereo 1 e 2. Por este motivo, precisamos copiar,
3 Quociente
respectivamente, o quociente (que est na clula de endereo 3)
2 Nmero 2
para a clula de endereo 1 e o resto (que est na clula de
1 Nmero 1
endereo 4) para a clula de endereo 2.
0
Desafio: possvel reescrever este algoritmo de forma a utilizar
Figura 1 - Contedo menos clulas de memria durante o processamento? Quais
das clulas de memria seriam as vantagens e desvantagens de reduzir o nmero de
clulas utilizadas por um algoritmo?

Discusso sobre clulas de memria


A princpio, qualquer algoritmo poderia ser descrito utilizando-se apenas operaes sobre
clulas da memria. Para isso, basta associar cada um dos valores manipulados pelo
algoritmo a uma clula de memria. Cada instruo do algoritmo acompanhada pelos
endereos das clulas onde esto localizados os dados, conforme foi exemplificado no
Algoritmo 1.
Esta forma complicada introduz um nvel desnecessrio de complexidade referente
tecnologia de armazenamento de dados no computador, mas no enriquece a descrio do
algoritmo. Em particular, essa descrio s vai funcionar quando esse algoritmo, ao
executar, puder dispor exatamente das clulas de memria cujos endereos referencia em
seu cdigo. E, se na prxima execuo desse algoritmo essas clulas no estiverem todas
disponveis, i.e., estiverem sendo utilizadas por algum outro programa? Durante o
desenvolvimento de um programa, praticamente impossvel prever quais posies de
memria estaro disponveis no incio da execuo do programa. Alm disso, existem
outros programas em execuo simultnea, e eles poderiam potencialmente acessar as
mesmas clulas de memria que queremos tambm usar, gerando conflitos.
O uso de endereos fixos de memria tambm torna-se impraticvel para algoritmos mais
longos, pois ser muito difcil para o programador associar manualmente cada dado a uma
clula de memria. Muito menos ainda para uma equipe de programadores. Erros comuns
ocorrem quando um programador acidentalmente confunde o significado de duas clulas de
memria. Alm disso, introduzir modificaes em um algoritmo ou realizar alguma
manuteno no cdigo torna-se uma tarefa muito penosa.
Ademais, nem todos os dados podem ser acomodados em uma nica clula de memria.
Por exemplo, nmeros muito grandes podem exigir duas ou mais clulas. Neste caso, o
programador precisa lidar manualmente com estas situaes excepcionais.

16/3/2010 08:34 Copyright@2005-2009 Arnaldo V. Moura, Daniel F. Ferber 3


Por este motivo, as linguagens de programao criaram o conceito de variveis para
abstrair a complexidade do endereamento das clulas de memria. Lembre-se que a
motivao de utilizar linguagens de programao foi encontrar uma forma simples de
representar algoritmos e que no dependa do funcionamento particular e especfico de cada
computador.

Variveis
A varivel uma abstrao da noo de clula de memria.
Imagine agora que o programador, ao invs de utilizar os endereos fsicos da memria
para identificar as clulas que usa, tenha sua disposio rtulos smblicos com nomes
intuitivos. Ao invs de utilizar o endereo (posio da clula na memria), o valor em
questo identificado atravs desse rtulo (ou nome) simblico, escolhido com auxlio do
bom senso do programador. Sempre que for necessrio referir-se a algum dado, o
programador utiliza o rtulo associado varivel correspondente.
O compilador fica responsvel por criar, automaticamente, uma tabela cuja coluna 1
contm todos os rtulos usados no programa. Alm disso, nas demais colunas, o
compilador indica em que posies do programa cada rtulo usado. Esta tabela permite
com que o computador --- mais precisamente, o sistema operacional que controla o
computador --- logo antes de executar o programa escolha livremente quais clulas fsicas
da memria esto livres e podem, portanto, ser associadas a cada um dos nomes simblicos
que esto na coluna 1 da tabela. Uma clula est livre se no foi bloqueada para uso de
nenhum outro programa, nesse instante. Tendo associado clulas livres a cada rtulo usado
pelo programa, e bloqueado estas clulas, o computador simplesmente percorre as demais
colunas da tabela e substitui os rtulos simblicos usados pelo programador por esses
endereos fsicos de memria. claro que essas clulas escolhias devem ser bloqueadas
para uso apenas do nosso programa por todo o temo que perdure sua execuo. Quando
nosso programa terminar, as clulas associadas aos nomes simblicos que usou so
liberadas pelo computador, e ficam livres para serem utilizadas por outros programas.
Todo esse trabalho de associao e bloqueio de clulas de memria logo antes da execuo
do programa, e desbloqueio ao seu trmino, feito automaticamente e deforma transparente
pelo compilador em conjunto com o sistema operacional (num processo conhecido como
carga do programa). O programador fica completamente livre desses detalhes, pois usa
apenas os rtulos simblicos ao escrever seu cdigo na linguagem de programao.
Uma clula de memria, quando identificada por um rtulo, ser denominada uma
varivel. Ao invs de pensar na memria como uma seqncia longa de clulas, o podemos
entender a memria como um repositrio que contm o conjunto das variveis associadas
ao nosso programa.

Cada varivel caracterizada pelo seu rtulo e seu contedo.

Exemplo
Vamos rever o algoritmo de Euclides que calcula o MDC (mximo divisor comum),
apresentado na Introduo, desta vez utilizando variveis. Ele comea lendo dois nmeros,

16/3/2010 08:34 Copyright@2005-2009 Arnaldo V. Moura, Daniel F. Ferber 4


que so dados como entrada para o algoritmo. Portanto, estes dois nmeros devem ser
armazenados em duas variveis, que decidimos chamar de A e B. No mais necessrio
nos preocuparmos com a posio exata que esses dados vo ocupar na memria. A Figura 2
mostra a representao abstrata da memria.
No terceiro passo, o
algoritmo calcula o quociente 1) Leia um nmero e armazene na varivel A.
e o resto da diviso dos dois 2) Leia um nmero e armazene na varivel B.
nmeros (identificados pelas 3) Divida o valor da varivel A pelo valor da varivel
variveis A e B). Como no B. Guarde o quociente na varivel Q e o resto na
desejamos perder o valor varivel R.
destes dois nmeros, 4) Se o valor da varivel R for 0 (zero), ento mostre o
precisamos escrever o valor da varivel B e PARE.
quociente e o resto em novas 5) Copie o contedo da varivel B para a varivel A.
variveis, que foram 6) Copie o contedo da varivel R para a varivel B.
chamadas, respectivamente, 7) Retorne ao passo 3.
de Q e R. Finalmente, antes Algoritmo 2 - MDC usando variveis
do algoritmo repetir o ciclo,
note que a prxima diviso espera que os dois nmeros sobre os quais vai novamente
operar estejam nas variveis A e B. Por este motivo, precisamos
copiar, respectivamente, o quociente (que est na varivel Q)
A para a varivel A e o resto (que est na varivel R) para a
R varivel B.
Desafio: possvel reescrever este algoritmo de forma a utilizar
B menos variveis. Como? Quais seriam as vantagens e
Q
desvantagens de reduzir o nmero de variveis? Compare a
Repositrio importncia e a dificuldade da reduo do nmero de clulas de
Figura 2 - Variveis na
memria com a reduo do nmero de variveis.
memria

16/3/2010 08:34 Copyright@2005-2009 Arnaldo V. Moura, Daniel F. Ferber 5