Como funciona um computador


Há vários sítios na Internet que descrevem como funciona um computador,
como por exemplo: http://computer.howstuffworks.com/pc.htm.

Resumo:

Basicamente, um computador pode ser constituído por 3 elementos básicos:

1 - Microprocessador
Há vários fabricantes e modelos, como o Pentium da Intel, o Athlon da AMD e o PowerPC da IBM. Cada microprocessador possui um conjunto de instruções, que são executadas a uma determinada freqüência. As freqüências comuns atualmente giram entre 1 e 3 GHz (giga hertz).

2 - Memória
A memória pode ser classificada em 2 grupos, as memórias voláteis e não voláteis (ou permanentes). As memórias voláteis (memórias do tipo RAM - Random Access Memory) precisam de energia para manter seu conteúdo (ou seja, só funcionam quando o computador está ligado). Quando desligamos o computador, as informações importantes são armazenadas nos dispositivos de memória não voláteis (como o disco rígido ou HD - Hard Drive). Os dispositivos de memória volátil são mais caros e de menor capacidade, porém são muito mais rápidos, tornando possível ao computador realizar o processamento de forma mais eficiente.

3 - Dispositivos de Entrada e Saída
Tornam a interação com o usuário (e/ou outras máquinas) possível, como por exemplo: teclado, mouse, monitor, modem, impressora, etc.

Esses componentes se comunicam através de um barramento ou via de comunicação. O processador executa uma instrução por vez. Um programa é uma seqüência de instruções, armazenado na memória.

Em geral, o conjunto de instruções que o microprocessador é capaz de executar é bastante limitado, e podem ser agrupados em:

Instruções lógicas e aritméticas: permitem a execução de cálculos através de operadores como adição, multiplicação, etc.

Instruções de controle: permitem controlar o fluxo de execução. Nós vamos trabalhar em C, que é uma linguagem de alto nível, que permite instruções como while e if-else.

Instruções de movimentação de dados: permitem que as informações (programas e dados) armazenados na memória possam mudar de lugar, entre a memória e o processador ou de um lugar da memória para outro, ou ainda que lugares da memória sejam carregados com valores. Na linguagem C, seria o equivalente ao comando de atribuição.

Nas aulas seguintes, vamos introduzir alguns dos comandos básicos do C. Aprender a programar é aprender a utilizar esses comandos e criar uma estrutura de dados (na forma de variáveis) que possam resolver os problemas propostos. A linguagem C é uma linguagem de alto nível, que não pode ser executada diretamente pelos microprocessadores. É necessário converter o programa em linguagem de alto nível (conhecido como programa fonte) para um programa em linguagem de máquina (ou linguagem de baixo nível), que possa ser executado pelo computador. Essa conversão é realizada por um programa chamado de compilador.

Nesse curso vamos usar o Dev-C++, que é mais que um compilador. Ele é um ambiente de programação (IDE = Integrated Development Environment), que oferece ferramentas de edição de texto, compilação, depuração, e outros recursos que vão lhe ser úteis ao longo do curso. Caso você possua um computador, sugerimos que você instale em sua máquina a versão mais recente do Dev-C++, seguindo as instruções contidas em http://www.ime.usp.br/~mac2166/devcpp, e fazendo também a aula dirigida.

Arquitetura

A maioria dos computadores segue a arquitetura de von Neumann, que descreve um computador como um conjunto de três partes principais: a unidade central de processamento ou UCP (que por sua vez é composta pela unidade lógico-aritmética (ULA) e pela unidade de controle (UC)), a memória e os dispositivos de entrada e saída (E/S). Todas as partes se encontram conectadas por um conjuntos de cabos, o barramento.

Conceitualmente, a memória do computador pode ser vista como uma lista de células. Cada célula tem um "endereço" numerado que pode armazenar uma quantidade fixa e pequena de informação. Essa informação pode ser ou uma instrução, que diz ao computador o que fazer, ou dados, a informação que o computador deve processar utilizando as instruções.
Os dispositivos de E/S definem como o computador recebe informação do mundo exterior e como ele devolve informação para o mundo exterior. Teclados, mouses, scanners, microfones e câmeras são dispositivos comuns de entrada enquanto monitores e impressoras são dispositivos comuns de saída. Discos rígidos e placas de rede, que permitem conexões entre computadores, podem atuar como dispositivos tanto de entrada quanto de saída.

IBM PowerPC 601

A ULA é capaz de desempenhar dois tipos de operações: operações aritméticas, como somas e subtrações, e comparações, como "igual a" ou "mair que". A UC "orquestra" todo o resto. Seu trabalho é ler instruções e dados da memória ou dos dispositivos de entrada, decodificar as instruções, alimentar a ULA com as entradas corretas de acordo com as instruções e enviar os resultados de volta à memória ou aos dispositivos de saída. Um componente chave dos sistema de controle é um contador de programa que mantém o endereço da instrução corrente e que, tipicamente, é incrementado cada vez que uma instrução é executada, a não ser que a própria instrução corrente indique onde se encontra a próxima instrução, permitindo assim que um conjuntos de instruções seja repetido várias vezes. Desde a década de 1980, a ULA e a UC são inseridas em um único circuito integrado: o microprocessador.

O funcionamento do computador se resume ao seguinte: a cada ciclo, o computador carrega instruções e dados da memória, instruções são executadas, seus resultados armazenados e a instrução seguinte é carregada.

Algoritmos e programas de computador

Como instruções e dados podem ser utilizados para produzir algo útil? Imagine uma cozinha, contendo armários com diversos ingredientes, utensílios de cozinha, um forno e... um padeiro. O padeiro segue uma receita para obter, a partir dos ingredientes e com o auxílio do forno e dos utensílios, um bolo. Cada receita produz um tipo de bolo diferente, ou seja, mudando a receita, muda-se o bolo.

No computador-cozinha, os ingredientes constituem a entrada, o bolo a saída desejada, enquanto que a receita constitui um algoritmo. Este conjunto forma o software. Já os utensílios, o forno e o próprio padeiro constituem as ferramentas necessárias no processo: o hardware.

Uma mesma receita pode ser escrita de várias formas diferentes. O algoritmo é uma entidade abstrata que define uma idéia. Sua realização, na forma de uma receita escrita, constitui um programa de computador: um conjunto de instruções que, seguidas corretamente e ordenadamente, produzem o resultado desejado a partir das informações fornecidas.

Você já viu alguns algoritmos reais antes de chegar na universidade. Dois deles são o algoritmo da divisão, apresentado às crianças no ensino básico e o Algoritmo de Euclides, utilizado para obter o máximo divisor comum (MDC) de dois números inteiros:

MDC de a e b
1 se b = 0, então o MDC de a e b é a
2 caso contrário, o MDC de a e b é igual o MDC de b e o resto da divisão
de a por b

Repetimos o passo número dois até obtermos um b = 0. Incrivelmente, obtemos um b = 0 sempre. Ainda mais incrível: o algoritmo sempre chega ao resultado correto! Este é um dos principais objetivos deste curso: ensinar a desenvolver soluções para problemas através de programas, que recebem dados de entrada e produzem a saída desejada.

Linguagens de programação e código de máquina

Um dos problemas ao se programar computadores é que eles não são tão espertos quanto o nosso padeiro ou mesmo o aluno do ensino básico. Computadores são incapazes de obedecer instruções em português ou inglês, ou qualquer linguagem natural. Ao programar computadores, utilizamos linguagens de programação pois elas

1. fornecem ao programa de computador uma sintaxe precisa;
2. fornecem ao programa de computador uma semântica precisa e
3. podem ser representadas em linguagem de máquina: um conjunto de bits (0 e 1s) que representam dados e instruções, produzindo o comportamento desejado dentro da arquitetura do computador.

Suponha que um programador deseje somar todos os número de 1 até n. Em uma linguagem hipotética, isto poderia ser feito na forma do seguinte programa:

1 parcial inicia com 0
2 para i de 1 até n faça
3    parcial recebe parcial + i
4 devolva parcial

as palavras em negrito são parte da sintaxe desta linguagem hipotética. A sintaxe só permite o uso de combinações especiais de certos símbolos e palavras-chave.

Em bom português, o programa acima pode dizer a uma pessoa como somar todos os números de 1 até n. Mas, na linguagem hipotética, será que "para i de 1 até n" tem o significado que esperamos? Ou será que ela está dizendo ao computador "apague todas as células de memória de 1 até n" ou "conte n segundos e desligue a máquina"? Além da sintaxe, uma linguagem de programação também fornece uma semântica: um significado para cada construção. A semântica razoável aqui seria "para todos os números inteiros 1, 2, 3,..., n-1, n, nesta ordem, faça (...)". Uma linguagem de programação define sintaxe e semântica para suas palavras-chave (que o programador pode aprender a partir de manuais e/ou especificações).

Antes de utilizar o programa, precisamos traduzi-lo para uma forma que o computador possa executar. Para isso utilizamos um programa especial, chamado compilador, para ler nosso programa, definido em uma certa linguagem de programação e que gera um novo programa em uma linguagem especial, chamada assembler, que é associada ao processador da máquina que irá executar as operações. Por fim, um segundo procedimento, a montagem, codifica o programa em assembler na forma binária, composta apenas de 0s e 1s: o pequeno e minimalista alfabeto entendido pelos computadores.

Por exemplo, o seguinte fragmento de programa, na linguagem hipotética:

2 para i de 1 até n faça
3     (comandos, operações,...)

se tornaria, no assembler hipotético de um processador hipotético:

     MVC 0, i    (insira a constante 0 no local i)
LOOP CMP n, i (compare os valores encontrados em n e i)
JEQ REST (se n e i são iguais, pule para a instrução com o rótulo "REST")
ADC 1, i (adicione 1 ao valor localizado em i)

(comandos, operações,...)

JMP LOOP (pule para a instrução com o rótulo "LOOP")
REST (resto do programa)

que finalmente seria codificado na forma de uma longa (e ilegível!) fila de 0s e 1s:

000101010101010101001010101010101111110000111101111...

Assim, a seqüência de passos de uma idéia (algoritmo) até um código executável por um computador é:

Algoritmo programação Programa em linguagem X compilação
Programa em assembler (da arquitetura desejada) montagem Programa em linguagem de máquina (0s e 1s - na arquitetura desejada)

Em MAC2166, a linguagem de programação adotada será a linguagem C, criada por Brian Kernighan e Dennis Ritchie. Ao longo do curso, você aprenderá a sintaxe e a semântica de C, tornando-se capaz de transformar algoritmos em programas de computador. O compilador utilizado, o Dev-C++ (ou gcc caso você esteja utilizando Linux), realiza a compilação e a montagem. Podemos assim nos concentrar nos algoritmos e em sua realização em C e deixar de lado o assembler e demais detalhes da arquitetura.

Existem, no entanto, outras linguagens de computador que foram ou ainda são utilizadas: a linguagem de Visual Basic, por exemplo, é base de muitas execuções de módulos nas versões do Microsoft Access. A linguagem Basic, também muito conhecida, já foi utilizada em grandes programas, e foi, ao longo do tempo, sendo gradativamente substituída por linguagens mais simples e de maior compreensão.

Links externos

Referências


Eloiza Sonoda