Resumo do 1.Cap - ORGANIZAÇÃO ESTRUTURADA DE COMPUTADORES Segundo Tanenbaum, um computador é uma máquina capaz de solucionar problemas através da execução de instruções que lhe são fornecidas. As instruções são normalmente passadas através de um programa, que nada mais é que uma sequência de instruções descrevendo como executar uma determinada tarefa. Os circuitos eletrônicos que compõem o computador são capazes de reconhecer e executar diretamente um conjunto limitado de simples. Estas instruções constituem uma linguagem (linguagem de máquina) através da qual se é possível "comunicar" com a máquina. A escolha deste conjunto de instruções primitivas é uma tarefa importante e delicada, envolvendo: o o o Simplicidade. Por uma questão de custo da máquina o conjunto de instruções deve ser tão simples quanto possível. Consistência: A simplicidade não deve interferir com a consistência do conjunto de instruções em relação ao uso prioritário da máquina. Desempenho: Mesmo para usos domésticos espera-se de toda máquina um desempenho mínimo. O conjunto de instruções deve contribuir com o desempenho. Normalmente as linguagens de máquina obtidas com a observância dos itens acima são de utilização tediosa e complexa. Em outras palavras máquinas com as quais só é possível "dialogar" através do uso das linguagens de máquina teriam pouco sucesso comercial. A solução para este problema envolve sempre a definição de outra linguagem de uso mais simples e agradável. Chame de L1 a linguagem de máquina com a qual é possível "dialogar" diretamente com o computador. A definição de uma linguagem mais simples L2 gera o seguinte problema. Como interagir com uma máquina que só aceita comandos na linguagem L1, utilizando comandos da linguagem L2? Basicamente dois métodos permitem a utilização de linguagens diferentes pelo usuário e a máquina: o o Tradução: Neste método, o programa escrito em linguagem L2 é inteiramente traduzido por um conjunto de instruções equivalentes na linguagem L1. O programa traduzido (linguagem L1) é então fornecido a máquina que o executa como se o programa em linguagem L2 não existisse. Interpretação: Com este método, um programa escrito em linguagem L1 recebe os programas escritos em linguagem L2 e, instrução por instrução, executa uma sequência de instruções L1 equivalentes à instrução L2 lida. A diferença básica dos dois métodos está no tempo de geração da sequência de instruções L1 equivalentes ao programa escrito em linguagem L2. Na tradução todo um programa L1 equivalente é gerado antes que qualquer execução seja iniciada. Na interpretação não há geração de programa equivalente em L1, cada instrução L2 é examinada e uma sequência de instruções L1 é executada. Estes dois métodos são largamente utilizados, inclusive em linguagens de alto nível. Temos, por exemplo, que a linguagem C e traduzida, pois um compilador gera um programa equivalente em uma linguagem de máquina específica antes que a execução seja iniciada. Por sua vez a linguagem HTML é traduzida, pois os comandos HTML são interpretados para a construção de uma imagem da página. Máquinas Virtuais Sabe-se então que as linguagens de máquina são definidas em observância a princípios de simplicidade, consistência e desempenho. A observância destes princípios pode, entretanto, conduzir a definição de máquinas cuja programação é complexa e tediosa. Definindo-se uma linguagem L2 de uso mais simples e agradável, podemos, em vez de pensar em termos de tradução e interpretação, pensar em termos da existência de uma máquina virtual cuja linguagem de maquina seja L2. Obviamente este computador não pode ser construído fisicamente, pois, certamente, seus circuitos eletrônicos não seriam simples e não apresentariam desempenho satisfatório. Também é possível que a linguagem L2 não possa ser muito diferente da linguagem L1, caso contrário à tradução ou interpretação não seriam praticáveis. Seguindo esta linha de raciocínio pode-se pensar em máquinas virtuais de vários níveis (1, 2, 3,..., n). Ressalte-se, porem, que apenas a máquina virtual de nível 1 existe fisicamente, todas as outras são resultadas de traduções ou interpretações, que culminam com a execução de programas na linguagem L1. Máquinas Multinível Contemporâneas Tanenbaum classifica as máquinas contemporâneas como sendo máquinas multinível. Na sua descrição seis níveis são apresentados: o o Nível de lógica digital (nível 0): Neste nível encontra-se a descrição da máquina como uma malha de portas lógicas interconectadas. Subconjuntos destas portas lógicas definem dispositivos lógicos com binacionais e sequenciais, que podem ser formalmente descritos através da álgebra booleana. Neste nível não existe o conceito de programa como uma sequência de instruções. Nível de Micro programação (nível 1): Neste nível encontram-se dispositivos e recursos, tais como, ULAs, registradores, decodificadores, multiplexadores, vias de dados, etc. Cada um destes dispositivos e recursos é capaz de executar um número limitado de operações, definidas por sinais de controle. O nível de micro programação já suporta o conceito de programa (micro programa) como uma sequência instruções a o o o o serem executadas. Pode-se dizer também que o nível de micro programação oferece uma visão detalhada do processador/microprocessador (microarquitetura ou caminho de dados). Nível de máquina convencional (nível 2): Neste nível existe o que normalmente conhecemos como linguagem de máquina. Ou seja, para cada microprocessador, este nível define uma ou mais máquinas virtuais, cuja linguagem é interpretada por um ou mais micro programas. Para se tiver uma ideia mais clara, quando um fabricante define a instrução de nível 2 ADD R, que adiciona o conteúdo do registrador R ao conteúdo de um acumulador (default), nada é especificado sobre a estrutura de hardware, ou a sequência de micro operações capaz de executa-la. O micro programa, por sua vez, é inteiramente baseado nesta informação. O nível de máquina convencional oferece uma visão do macro arquitetura da máquina (interação do processador/microprocessador com barramentos externos, unidades de memória, dispositivos de I/O, etc.). Nível de sistema operacional (nível 3): Este nível é a fronteira entre o hardware e o software. O sistema operacional, normalmente, assume as funções de gerenciar os recursos de hardware e oferecer uma interface simplificada. Os usuários deste nível podem ser programas do nível 4 ou usuários humanos. Nível de linguagem de montagem (nível 4): Este é o primeiro nível desenvolvido para usuários (programadores) comuns (aqueles que simplesmente traduzem a solução de problema em programas). O nível 4, ao contrário dos níveis 1, 2 e 3 oferecem linguagens orientadas à utilização humana, constituídas de palavras e mnemônicos, que permitem uma compreensão mais simbólica dos problemas tratados. Outra diferença básica entre os níveis 1, 2 e 3, de um lado, e os níveis 4 e 5, de outro, é que, estes últimos, são normalmente suportados por tradução, enquanto que os demais são normalmente suportados por interpretação. Nível de linguagem de programação (nível 5): Não há um nome de aceitação gera para este nível, pode ser chamado, come o faz Tanenbaum, de "nível de linguagem orientada para problemas", ou qualquer outro nome que indique que este é um nível de linguagem voltada para o usuário final. Neste nível a máquina virtual oferecida é suficientemente abstrata para que possa ser utilizadas por qualquer programador com conhecimentos razoáveis em algoritmos, estruturas e na linguagem disponível a este nível. Bons exemplos para este nível de máquina virtual são as ditas linguagens de alto nível. Para estas linguagens, tais como, C, C++, Java, pascal, FORTRAN, etc. A máquina virtual neste nível é, como dito anteriormente, suportadas por tradução, através dos compiladores destas linguagens. Embora a apresentação acima possa ser feita sem constrangimento, não há uma definição demasiadamente rígida sobre o que está presente em cada nível. Cabe aos projetistas decidirem o que colocar em cada nível. O estudo da evolução das arquiteturas de computadores, durante os últimos 60 anos, mostra que já ocorreram muitas mudanças nas preferências dos projetistas quanto ao melhor nível para disponibilizar certos recursos. Os lemas "toda complexidade é do software" e "toda complexidade é do hardware", usados separadamente em épocas distintas, reflete bem as variações das preferências dos projetistas. O importante desta questão é estudas as justificativas que norteiam cada projeto, baseados nos princípios da simplicidade, consistência, desempenho e acrescente-se relação custo/desempenho.