Um computador simplificado: a metáfora do escaninho
1. O Funcionamento do Computador
O funcionamento de um computador
pode ser esquematizado conforme o diagrama da figura abaixo:
Figura 1: Tráfego dos dados num CPU
No bloco 'Entrada' o usuário entra com as informações, sejam elas números, letras ou palavras, na forma de dados, geralmente por meio de um teclado. O computador processa então esses dados, utilizando:
o bloco 'CPU' (Unidade Central de Processamento) que é chamado de "cérebro" do computador;
e os blocos 'Memória Auxiliar' e 'Memória Permanente'.
O resultado do processamento vai então para o bloco 'Saída', por meio de um monitor de vídeo, ou talvez de uma impressora. Embora este esquema sirva para mostrar de maneira simplificada o funcionamento do computador, o diagrama não nos permite enxergar nem como um programa é carregado no computador, nem como a CPU trabalha com as instruções fornecidas pelo programa, utilizando cada um dos blocos do diagrama acima.
2. Computador Simplificado
Um computador envolve um grande número de elementos, cada um envolvendo um grande número de conceitos. Para introduzir alguns destes elementos e alguns dos conceitos definimos um 'computador simplificado'.
O nosso computador simplificado utiliza elementos do dia-a-dia como metáfora para os elementos efetivos do computador. Consideremos então:
uma pessoa cujo trabalho consiste em pegar instruções que estão guardados numa série de compartimentos contíguos; vamos considerar estes compartimentos como;
um conjunto de escaninhos, tal qual os móveis que são usados para armazenar a correspondência de funcionários numa universidade, ilustrado mais abaixo na Figura 2; esta pessoa pode utilizar ainda;
uma calculadora para realizar somas, subtrações, etc;
uma máquina de escrever para imprimir valores;
cartões, com os quais a pessoa pode receber valores.
Existem duas maneiras de fornecer os valores para esta pessoa: ou pelos cartões, os quais contém um valor por cartão, ou então pelo escaninho, que além de uma instrução pode conter um valor (uma constante);
Num escaninho a pessoa pode ler um valor ou uma instrução. A pessoa também pode escrever um valor num escaninho. A escrita ou colocação de instruções nos escaninhos só pode ser feita uma única vez, a cada vez que a pessoa iniciar o trabalho.
A pessoa, quando inicia seu trabalho, deve obedecer as seguintes ordens, as quais chamaremos de procedimento de trabalho da pessoa e devem ser executadas rigorosamente passo-a-passo:
Passo 0: Escreva num bloco de papel
a identificação do 1o escaninho
(E0);
Passo 1: Pegue a instrução que está no escaninho indicado pelo bloco;
Passo 2: Escreva no bloco de papel a identificação do escaninho seguinte;
Passo 3: Faça o que manda a instrução;
Passo 4: Volte para o Passo 1.
E0
|
E1 |
E2 |
E3 |
E4 |
E5
|
E6 |
E7 |
E8 |
E9 |
E10
|
E11 |
E12 |
E13 |
E14 |
E15
|
E16 |
E17 |
E18 |
E19 |
Figura 2: Um "móvel" com 19 escaninhos do 'Computador Simplificado'
O computador, como já mencionado, tem um componente denominado Unidade Central de Processamento (CPU), que trabalha de forma similar à pessoa descrita acima. Outra denominação para esta pessoa seria 'processador'.
Um componente chamado memória principal (ver Figura 1) funciona de forma similar ao nosso conjunto de escaninhos. Cada posição especificada Ei representa uma posição no escaninho, e 'i' o número desta posição, dispostos de forma sequencial (ver Figura 2). Existem diversos tipo de memória para um computador.
A memória RAM (Random Access Memory), ou seja, memória de acesso aleatório. Esta memória é volátil, isto quer dizer que as instruções e dados armazenados só permanecem nela enquanto o computador estiver ligado. Caso o computador seja desligado eles se perdem. Se o móvel de escaninhos fosse uma memória RAM, isto significaria que tudo o que estivesse armazenado nos escaninhos se perderia.
Já a memória ROM (Read Only Memory),
isto é, memória "só para ler", seria equivalente a um
conjunto de escaninhos em que só podemos ler o que está armazenado
neles, sem jamais poder escrever instruções ou colocar dados
neles.
3. Programando no Computador Simplificado
As instruções disponíveis no nosso computador simplificado poderiam ser, entre outras, as seguintes:
Leia um cartão e guarde em Ei - o conteúdo da posição especificada (Ei) deve passar a ser o mesmo valor do cartão que estiver disponível; o cartão deve ser então descartado;
Copie Ei em Ej - o conteúdo da posição Ej deve passar a ser o mesmo da posição Ei;
Some (subtraia, multiplique, etc) Ei e Ej e guarde em Ek - o conteúdo da posição Ek deve passar a ser o resultado da soma (subtração, etc) do conteúdo das posições Ei e Ej;
Vá para Ei - a pessoa deve escrever Ei no bloco de notas;
Se Ei (maior, menor, maior ou igual,...) Ej, vá para Ek - se o conteúdo da posição Ei é maior (menor, etc) que o da posição Ej, então escrever no bloco Ek, caso contrário deixe o bloco como está;
Imprima Ei - datilografe o conteúdo da posição Ei;
Pare - pare de executar o procedimento que especifica um ciclo envolvendo os passos (1), (2), (3) e (4), do procedimento de trabalho da pessoa, como explicado acima.
Se considerarmos, para simplificar, apenas as 4 operações matemáticas e as comparações 'maior que', 'menor que' e 'igual a', teremos para o nosso computador simplificado um conjunto de 12 instruções disponíveis.
Com elas já podemos então criar pequenos programas, cada qual deve antes ser carregado na memória RAM do computador para que a CPU possa executá-lo, ou seja, as instruções devem ser carregadas nos escaninhos antes da pessoa iniciar o seu procedimento de trabalho (os 5 passos do trabalho da pessoa, mostrados mais acima).
As 12 instruções podem ainda ser resumidas através de mnemônicos, que, com cerca de algumas poucas letras, expressam resumidamente o que cada uma das instruções realiza. Este conjunto básico de instruções é chamado de Assembly (Montagem) e compõem a chamada linguagem de montagem do computador. No computador simplificado teríamos então a seguinte tabela de instruções, formando a nossa linguagem de montagem simplificada:
|
Mnemômico |
Instrução |
1 |
LG Ei |
Leia um cartão e guarde seu valor em Ei |
2 |
COP Ei Ej |
Copie Ei em Ej |
3 |
SOM Ei Ej Ek |
Some Ei e Ej e guarde em Ek |
4 |
SUB Ei Ej Ek |
Subtraia Ei por Ej e guarde em Ek |
5 |
MUL Ei Ej Ek |
Multiplique Ei e Ej e guarde em Ek |
6 |
DIV Ei Ej Ek |
Divida Ei por Ej e guarde em Ek |
7 |
VÁ Ei |
Vá para Ei |
8 |
SE Ei > Ej Ek |
Se Ei maior que Ej, vá para Ek |
9 |
SE Ei < Ej Ek |
Se Ei menor que Ej, vá para Ek |
10 |
SE Ei = Ej Ek |
Se Ei igual Ej, vá para Ek |
11 |
IMP Ei |
Imprima Ei |
12 |
PARE |
Pare a execução das instruções |
4. Exemplo de um Programa
Vejamos então o exemplo de um pequeno programa em linguagem 'assembly', que soma dois números e imprime seu resultado (com a máquina de escrever), por meio da seguinte seqüência de instruções:
Exemplo 1:
LG E14 - leia um cartão e guarde em E14
LG E12 - leia um cartão e guarde em E12
SOM E14 E12 E12 - some E14 com E12 e guarde em E12
IMP E12 - imprima E12
PARE - interrompa o programa
Para que a pessoa possa executar
o seu procedimento de trabalho, as instruções devem
antes ser carregadas nos encaninhos, ou seja, para que a CPU do computador
possa executar o programa, este deve ser carregado na memória RAM do
computador. A Figura 3, abaixo, mostra o móvel de escaninhos carregado
com as instruções do programa.
E0 LG E14
|
E1 LG E12 |
E2 SOM E14 E12 E12 |
E3 IMP E12 |
E4 PARE |
E5 ?
|
E6 ? |
E7 ? |
E8 ? |
E9 ? |
E10 ?
|
E11 ? |
E12 ? |
E13 ? |
E14 ? |
Figura 2: O móvel de escaninhos carregado com instruções
O trabalho da pessoa se processa então conforme descrito abaixo (ver o procedimento de trabalho da pessoa):
Passo 0: a pessoa escreve num bloco de papel a identificação do primeiro escaninho (E0). Com esta indicação a pessoa pode então executar o Passo 1.
Passo 1: do escaninho indicado no bloco de notas, E0, a pessoa pega a instrução, que é LG E14 (Leia um cartão e guarde seu valor em E14).
Passo 2: ela escreve no bloco de papel a indicação do escaninho seguinte, E1.
Passo 3: ela executa o que manda a instrução (LG E14); como resultado o valor do cartão lido é guardado no escaninho E14.
Passo 4: a pessoa volta para o Passo 1.
Passo 1: ela pega a instrução do escaninho apontado no bloco de papel, E1. Neste escaninho a instrução armazenada é LG E12 (Leia um cartão e guarde seu valor em E12).
Passo 2: a pessoa escreve E2 no bloco de papel (E2 é o escaninho seguinte).
Passo 3: ela executa o que manda a instrução (LG E12); como resultado o valor do cartão lido é guardado no escaninho E12.
Passo 4: a pessoa volta para o Passo 1.
Passo 1: ela pega então a instrução do escaninho apontado no bloco de papel, E2. A instrução guardada em E2 é SOM E14 E12 E12 (Some o valor de E14 com o de E12, e armazene o resultado em E12).
Passo 2: a pessoa escreve E3 no bloco de papel (escaninho seguinte ao E2).
Passo 3: ela executa a instrução, sendo a soma resultante guardada em E12 (é evidente que o valor anterior se perde, já que o escaninho pode armazenar somente um valor, ou uma instrução).
Passo 4: a pessoa volta para o Passo 1.
Passo 1: ela pega a instrução IMP E12 (imprime o valor na máquina de escrever), que está guardada em E3, indicado no bloco de papel.
Passo 2: a pessoa escreve E4 no bloco de papel (escaninho seguinte ao E3).
Passo 3: ela executa a instrução: imprime o valor de E12 usando sua máquina de escrever.
Passo 4: a pessoa volta para o Passo 1.
Passo 1: ela pega a instrução do escaninho apontado pelo bloco de papel (E4), ou seja, a instrução PARE.
Passo 2: ela anota E5 no bloco de papel (escaninho seguinte ao E4).
Passo 3: ela finalmente executa a última instrução: interrompe a execução do programa.
O aluno poderá logo perceber que o Passo 4 não precisa ser mostrado na seqüência de execução da pessoa, exibida acima, já que a partir do Passo 3 a pessoa sempre seguirá para o Passo 1.
Já o Passo 0 é realizado uma única vez somente, para iniciar o programa, isto é, o usuário ao mandar "rodar" um programa (clicando no ícone do programa, por exemplo) está, metaforicamente falando, fornecendo para a pessoa (a CPU) a identificação do escaninho E0, onde se encontra armazenado o início do programa, ou seja, a 1a instrução do programa.
Um processador possui alguns componentes denominados
registradores. Os registradores são também similares aos escaninhos.
O processador pode escrever ou ler valores associados aos registradores.
O "bloco de papel" mencionado acima, que contém o endereço do
escaninho cujo conteúdo corresponde à próxima instrução
a ser executada, corresponde, de novo como metáfora, a um registrador
denominado "Contador de Programa".
Questões para pensar:
O que deve ser feito se a instrução a ser executada é a instrução "Leia cartão e guarde em Ei" e não existe um cartão disponível?
Explique a principal diferença entre utilizar uma constante como sendo um valor em um escaninho e uma constante como sendo um valor escrito em um cartão (responda em termos do tempo da vida de um programa). Observe que as instruções acima não permitem expressar diretamente um valor constante, ou seja *não* existe uma instrução do tipo "Copie 5 em Ej"; em tempo de carga do programa teremos que colocar o valor 5 em Ei e utilizar "Copie Ei em Ej".
Considerando um processador genérico, qual é a influência do número de bits do bloco de papel (o contador de programa) no tamanho dos programas que podem ser executados?
Exercícios com a linguagem de montagem simplificada:
Faça um programa que lê dois números e imprime a média deles;
Faça um programa que lê dois números e imprime o menor deles;
Faça um programa que lê três números e imprime a média deles;
Faça um programa que lê um número e verifica se ele é maior que zero. Caso não seja o programa pára. Caso seja, o programa deve:
imprimir o número, e depois subtrai-lo de 1;
imprimir o número subtraído, e depois subtrai-lo de 1 de novo;
repetir b) até que o número não seja mais maior que zero.