# Arquitetura de Computadores/Introdução
## Introdução à Arquitetura de Computadores

Hoje em dia, computadores estão por toda a parte. Uma pessoa comum utiliza-se deles diversas vezes ao dia, muitas vezes sem mesmo se dar conta disso. Pegue, por exemplo, um aparelho celular. Ele é um computador apesar de normalmente não pensarmos nele como um. Os aparelhos celulares de hoje em dia possuem muito mais capacidade do que os primeiros computadores. Carros também costumam ser equipados com computadores que entre outras coisas, podem controlar a emissão de gases poluentes, controlar o consumo de combustível e aumentar a segurança de passageiros. Ao usar muitos eletrodomésticos, também estamos usando computadores que costumam vir embarcados em alguns deles. Para sacar dinheiro no banco, utilizamos caixas eletrônicos, ou seja: computadores. Video-games e calculadoras também são exemplos de computadores dedicados à realização de uma determinada tarefa.
Computadores facilitam muito a nossa vida e são responsáveis por muitos aspectos de nossa sociedade. Eles nos ajudam em praticamente qualquer tarefa. Do projeto de um prédio até avançadas pesquisas científicas.
Neste wiki curso, você irá aprender os mistérios por trás do funcionamento destas fantásticas máquinas mostrando todos os segredos que se escondem por trás do gabinete de seu computador (e celular, e videogame, e calculadora...) e do funcionamento de um processador.

### Introdução aos Programas de Computador

Computadores funcionam através de impulsos elétricos. Uma corrente elétrica só pode possuir dois estados diferentes: ativada e desativada. Por causa disso, computadores só são capazes de entender os sinais "ativado" e "desativado" que daqui para a frente serão chamados respectivamente de "1" e "0".
Podemos considerar o "1" e o "0" como as duas únicas letras que um computador pode usar para se comunicar. Isso contrasta bastante com o alfabeto do português, onde contamos com 23 letras. Entretanto, da mesma forma que com 23 letras podemos escrever infinitas palavras, com apenas duas, também conseguimos. De agora em diante, passaremos a usar o termo "bit" ao invés de "letra" quando nos referirmos à "linguagem" falada por computadores.
Como computadores são máquinas, eles são incapazes de fazer qualquer coisa que não foram instruídos a fazer. Um programa de computador (também chamado de software ou logicial) nada mais é do que um texto que explica à um computador o que ele deve fazer. Por exemplo, os bits 10000110010100000 representam uma instrução para o computador. O que ele significa depende de cada modelo de computador, pois cada um fala a sua própria linguagem. Ele poderia significar, por exemplo, uma instrução que indica que dois números que estão na memória da máquina sejam somados.
Os primeiros programadores de computadores precisavam ficar se comunicando com computadores utilizando-se apenas esses sinais binários. Imagine o quão chato e trabalhoso era programar naquela época. Só para você ter uma idéia, abaixo mostraremos um trecho de programa que serve para trocar de lugar dois números de memória em um processador do tipo MIPS (ele está escrito em linguagem de máquina):
Precisamos de 235 caracteres para escrevermos uma instrução tão simples na linguagem nativa de um processador MIPS. Mas... será que escrevemos tudo certo? Será que não cometemos nenhum erro? Perceba que além de chata e cansativa, esta linguagem também é difícil de ser entendida. É muito fácil cometer erros escrevendo esse monte de "1" e "0", principalmente porque é difícil de entender o que estamos escrevendo.
Os primeiros programadores, bastante cansados por terem um emprego tão chato que era escrever "1" e "0" sem parar, começaram a ter ideias para facilitar o trabalho. Uma idéia muito boa que eles tiveram era substituir cada instrução por algo representado por letras e que fosse mais fácil de entender. Depois que eles tivessem escrito o programa com base em letras, existiria um programa chamado montador que seria responsável por traduzir as letras em sequências de 1s e 0s. O programa do exemplo anterior, escrito com letras, ficaria assim (ele está escrito em linguagem de montagem):
Apesar desta nova linguagem ainda parecer complicada, imediatamente é possível perceber que é mais fácil trabalhar com ela do que com linguagem de máquina. Nela, cada instrução ocupa apenas uma linha e o nome da instrução é sempre representado por um conjunto de letras. Dessa forma, é mais fácil de programar, pois caso cometamos algum erro, ele é muito mais fácil de detectar. Além disso, a instrução que em linguagem de máquina precisa de 235 caracteres para ser escrita, em linguagem de montagem pode ser escrita com pouco menos de 100 caracteres. É mais rápido programar assim!
A linguagem de montagem (ou assembly) passou por muitas melhorias com o tempo. Entretanto, ela ainda é demasiadamente complicada. Ainda dá trabalho para entender o que queremos dizer com aquelas 7 instruções ali em cima. Foi isso que levou os primeiros programadores a pensar: "Se nós conseguimos criar um programa que traduz instruções escritas em linguagem de montagem para linguagem de máquina, então é possível criar um programa que traduza algo escrito em uma linguagem mais próxima da linguagem humana para a linguagem de montagem...". E foi isso que eles fizeram.
Com o tempo, uma série de outras linguagens de alto nível foram criadas. O objetivo delas era fazer com que humanos pudessem escrever comandos para os computadores de uma forma mais confortável. Um programa chamado compilador firaria responsável por traduzir a linguagem de alto nível para a linguagem de montagem e um montador traduziria a linguagem de montagem para a linguagem de máquina. Abaixo você vê o mesmo trecho de programa mostrado acima escrito na linguagem C:
Dessa vez conseguimos nos expressar em apenas 65 caracteres. O programa escrito desta forma é ainda mais legível que o anterior.
Resumindo: computadores só são capazes de entender linguagem de máquina (1 e 0). Toda linguagem de máquina (cada modelo de máquina fala uma língua diferente) pode ser expressa em uma linguagem de montagem (assembly), que é mais fácil de ser entendida. Para que programas em assembly possam ser entendidos pelo computador, eles precisam ser traduzidos com a ajuda de programas chamados montadores. Normalmente, quando nós programamos, usamos uma linguagem menos rudimentar que o assembly. Usamos uma linguagem de alto nível (existem centenas delas). Tudo aquilo que é escrito em linguagens de alto nível precisa ser passado para um programa chamado compilador que traduz o que foi escrito para assembly (ou então traduz direto para linguagem de máquina).
As vantagens de alto nível são bastante usadas pelos seguintes motivos:
* São mais fáceis de serem aprendidas e usadas que o assembly ou linguagem de máquina.
* Criar programas em linguagens de alto nível é mais rápido, pois precisamos de menos caracteres e cometemos menos erros.
* Programas escritos em linguagens de alto nível podem ser entendidos por qualquer máquina, desde que passem por um compilador e montador desenvolvido para aquela máquina. Já programas escritos em assembly ou linguagem de máquina só funcionarão nas máquinas para as quais foram projetados. Não podem ser passados para máquinas de modelos diferentes.
Além de instruções escritas em alguma linguagem, programadores frequentemente usam algo chamado bibliotecas. As bibliotecas nada mais são do que instruções para as máquinas que são muito comuns em muitos tipos de programas. Graças à elas, todos os programas que precisam fazer alguma tarefa (como imprimir texto em uma folha de papel) não precisam especificar o que o computador deve fazer para realizar a impressão com sucesso. Basta indicar que deseja-se usar um conjunto de instruções de uma biblioteca que indica como fazer isso. Dessa forma, quando estamos programando, não precisamos escrever tudo aquilo que o computador precisa fazer para realizar uma tarefa. Nós podemos simplismente reaproveitar instruções usadas por outros programas.
Para gerenciar as bibliotecas usadas pelo computador e também permitir que mais de um programa utilize a máquina ao mesmo tempo, também foram criados programas chamados Sistemas Operacionais. A tarefa destes programas é justamente gerenciar recursos da máquina. Alguns exemplos de Sistemas Operacionais são o MS-DOS, FreeDOS, Windows, ReactOS, Unix, GNU/Linux, BSD, MacOS X e Solaris.

### Introdução ao Hardware

Abaixo mostraremos alguns dos dispositivos mais comuns que são usados por computadores para receber dados de usuários (dispositivos de entrada) e passar dados para o usuário (dispositivos de saída).

#### O Mouse/Rato

O mouse (rato, em português europeu) é um dispositivo que funciona como um apontador para o que é mostrado no monitor de um usuário.
Ele foi concebido por Doug Engelbart nos anos 60. Segundo Doug, ele estava assistindo uma palestra tão chata sobre computadores que começou a sonhar acordado. Foi então que imaginou a implementação do mouse. O seu primeiro protótipo foi construído em 1967. Em 1973, a Apple passou a incluir um mouse em seus computadores Macintosh e durante os anos 80, ele já foi completamente popularizado.
Mouses mecânicos funcionam com a ajuda de uma esfera capaz de girar livremente. Ao girar, ela movimenta dois discos cujos movimentos são detectados por um circuito que passa a informação para um computador. Mouses óticos funcionam emitindo um feixe de luz e detectando a reflexão deste feixe. Com isso, eles podem detectar os movimentos em uma superfície não-transparente. Mouses inerciais funcionam através de um acelerômetro interno que capta os movimentos. Mouses em 3D que permitem que o usuário movam o apontador na tela apontando pelo ar funcionam através de detectores de ultra-som. Atualmente, os mouses mais comuns são os mecânicos e os óticos.

#### O Monitor

O monitor consiste em uma tela (ecrã em português europeu) capaz de exibir desenhos, textos e diversas informações deste tipo ao usuário.
O modelo mais primitivo de monitor é representado por uma matriz de bits com m linhas e n colunas. Um monitor desse tipo só é capaz de exibir as cores branco (que pode ser representado por 0) e preto (que pode ser representado por 1). Para monitores capazes de exibir mais cores, cada elemento da matriz deve armazenar vários bits, sendo cada combinação de bits uma cor diferente.
Os monitores mais comuns são os CRT e os LCDs. Os CRT (tubos de raios catódicos) funcionam graças à um feixe de elétrons disparado por um canhão que percorre toda a tela, uma linha de cada vez. O feixe de elétrons é responsável por fazer desenhos na tela e costuma imprimir de 30 à 70 novos quadros por segundo. Monitores de LCD (tela de cristal líquido) costumam ser bem mais finos e são usados em computadores portáteis. Eles funcionam graças à uma película bastante fina de cristal líquido cujas moléculas adquirem uma ordenação diferente ao serem percorridas por corrente elétrica.