Capítulo 1 paginas 1.2 ate 1.7
O aluno que chega a cursar a disciplina alvo deste livro, costuma apresentar um certo grau de conhecimento sobre programação em alto nível (C, C++, JAVA e/ou outras), ou está exatamente recebendo estas informações. O objetivo deste capítulo é mostrar o que está por trás deste mundo, o que faz com que o programa que foi desenvolvido seja executado em um computador, os papeis do Compilador, do Montador, do Carregador e do Sistema Operacional, SO. Inicialmente gostaríamos de tratar das múltiplas visões de um computador, ou seja, como nós enxergamos esta máquina que revolucionou nossas vidas. Fico me perguntando como podemos apreciar um Da Vinci de forma tão eclética. Seu mais famoso trabalho, a Mona Lisa, apresenta uma enorme variedade de interpretações. De fronte à galeria do Louvre que guarda a obra, muitos curiosos enxergam aquela mulher com um ar enigmático como uma obra prima, mas não compreendem a genialidade que existe por trás da tela. Assimetrias ao fundo, técnicas de sfumato e a identidade da egéria são apenas vistos por olhos mais curiosos e treinados. Mas voltemos às nossas máquinas computacionais. Uma criança (e não somente ela) entende um computador como um grande repositório de jogos onde ela pode se divertir. Um usuário compreende um computador como uma ferramenta que lhe ajuda a digitar textos e encontrar informações na Internet. Um analista de sistema vê o que outros não enxergam: o computador como o local onde se materializam seus devaneios (ou dos outros) e de onde ele tira o seu sustento. O convite neste livro é para irmos além. Abrirmos a máquina ainda é pouco. Vamos precisar radiografá-la, adentrar suas entranhas e descobrir um mundo onde tudo é minúsculo. O que fazer com isto? Por que uma abstração tão detalhada para um aluno de um curso com ênfase em software? Iremos perceber ao longo deste livro que o usuário de nossos projetos deseja, antes de tudo, um desempenho razoável da aplicação. Imagine chamar (iniciar) um processador de textos e esperar meia hora para que ele esteja pronto para uso! Buscar um arquivo e ter de esperar minutos para que ele esteja disponível. Isto está fora de nossa realidade atual. E o que faz com que nossos softwares sejam eficientes? É uma combinação de técnicas de software e de hardware. Usar estruturas de dados adequadas é tão importante como explorar bem o sistema de memórias. Além disto, algumas classes de software exigem um conhecimento profundo da arquitetura do sistema onde eles serão executados. Trata-se dos softwares básicos (System Software). Nesta classe de softwares estão incluídos montadores, ligadores, carregadores, compiladores e sistemas operacionais. Em breve apresentaremos uma visão geral de cada um deles. Voltando às nossas abstrações, vamos apresentar como hardware e software podem ser enxergados em camadas. Desta forma definiremos exatamente o escopo deste livro, sobre que camadas há informações no texto. Vamos começar com o Hardware. A Figura 1.1 mostra as principais camadas de abstração sobre as quais um projetista de hardware pode trabalhar. Na camada de DISPOSITIVOS, são estudados os materiais semi-condutores e suas dopagens com outros elementos para produzir um transistor, elemento básico de funcionamento de um processador. Na camada de CIRCUITO, os transistores são agrupados para formar um circuito. Na camada de PORTAS, uma operação lógica é materializada em um circuito particular. Na camada de MÓDULO, diversas portas são agrupadas para formar um módulo computacional. Finalmente, na camada de SISTEMA os módulos são interligados de tal forma a produzir um sistema, por exemplo, um processador. Para ajudar no processo de construção de um sistema eletrônico existem diversas ferramentas para auxílio a projetos, inclusive ferramentas que permitem a descrição no nível de sistema e que geram automaticamente os outros níveis da abstração. A propósito este processo de gerar níveis mais baixos de abstração do sistema é chamado de síntese. Neste livro abordaremos as camadas de SISTEMA e MÓDULO, com eventuais usos de portas lógicas, para construir um processador simples. De fato, com milhões de transistores presentes em um único chip, em nossos tempos, é uma tarefa árdua, para não dizer impossível, projetar um sistema apenas pensando nos transistores, ou mesmo portas.Os softwares estão organizados, em relação ao hardware, quanto a sua proximidade da máquina. Um hardware é controlado pelo Sistema Operacional – que presta serviços às aplicações. Quando um programa de usuário requer alguma informação do hardware, ele a solicita ao Sistema Operacional e aguarda até que o SO possa trazê-la. A Figura 1.2 mostra as camadas de software que compõem um sistema computacional. De fato, esta organização em camadas reflete como diversas classes de softwares agem com relação ao hardware. Um exemplo real é um programa processador de texto. Quando pressionamos alguma tecla no teclado, estamos de fato usando um módulo do hardware que avisa ao sistema operacional que o usuário digitou uma tecla. O SO, por sua vez, informa ao processador de texto que o usuário digitou um caractere. O processador de texto recebe este caractere e pede ao SO para mostrá-lo na tela. O SO envia para o monitor (hardware) o código do caractere a ser mostrado e o monitor o faz. Isto tudo ocorre de forma tão rápida que o usuário tem a sensação de que sua digitação provocou a imediata aparição do caractere na tela. Um software nada mais é que um conjunto de instruções, logicamente organizado, de tal forma que o hardware possa interpretar e seguir os comandos. O hardware, por sua vez, é uma máquina que faz exatamente o que está escrito em um software. Acontece que o hardware usa uma forma de representação de dados diferente do nosso alfabeto convencional. Um hardware tem um alfabeto muito simples, com apenas duas letras: 0 e 1. Assim como podemos escrever qualquer palavra combinando o nosso alfabeto de 23 ou 26 letras, o hardware também pode atribuir significado à combinações de zeros e uns. Cada letra do alfabeto eletrônico é conhecida como Dígito Binário, bit. Os bits, em termos de circuitos elétricos, são tensões diferentes com padrões predeterminados. Por exemplo, o bit 0 pode ser associado a 0 volts enquanto o bit 1 pode ser associado a 5 volts. Os comandos inteligíveis para uma máquina são palavras formadas por bits. Existem máquinas que aceitam palavras de tamanhos variados, enquanto outras, mais simples, só admitem um único tamanho de palavras. Agora, imaginemos a tarefa simples de criar um conjunto de palavras binárias de 32bits que formem um programa. Todos os bits têm significados e devem ser observados. O programa poderia ser algo como: 00100010001100111111111111111111 00100010010101000000000000000100 01110010001100010000000000000010