As primeiras máquinas eram extremamente simples, com relativamente
poucas instruções e poucos modos de endereçamento.
Tudo começou a mudar com o conceito de microprogramação
(devido a Wilkes) e a introdução do IBM 360, que é
microprogramado, possibilitando um conjunto complexo de
instruções do nível convencional, conhecidas como
instruções de máquina. Dentro de poucos anos, máquinas como
VAX tipicamente tem mais de 200 instruções e mais de uma
dúzia de modos de endereçamento, todos implementados por um
microprograma rodando num hardware simples.
Um outro fator que encorajou a evolução das máquinas CISC é
a baixa velocidade de acesso da memória principal RAM, em
relação a velocidade de um ROM dentro da CPU. Para ilustrar
isso, pense em aplicações COBOL que necessitam de aritmética
decimal. Como todas as máquinas internamente são binárias, a
aritmética decimal teria que ser simulada. Há duas maneiras
possíveis. A primeira é exigir que o programa COBOL chame
rotinas de biblioteca armazenadas na memória principal. A segunda
é colocar tais rotinas no microprograma (ROM dentro da CPU) e
acrescentar instruções do tipo ADD DECIMAL ao repertório de
instruções. Devido a baixa velocidade de acesso de memória
RAM, a tentação é colocar maior complexidade no
microprograma.
A situação começou a mudar com a introdução de
memória RAM rápidas, que não são mais cerca de 10 vezes mais
lentas que a ROM, como antigamente. A manutenção do
microprograma também tem gerado grandes dores de cabeça:
consertar um ``bug'' num microprograma gravado em ROM já entregue ao
mercado significa visitar todas as instalações de clientes para
trocar as ROMs defeituosas.
Um outro acontecimento marcante foi a descoberta de que realmente poucos tipos comandos são usados na maioria dos programas examinados em vários experimentos realizados. Knuth, Wortman, Tanenbaum e Patterson mediram programas escritos em várias linguagens e constataram os seguintes comandos mais usados:
Comando | Fortran | C | Pascal |
atribuicao := | 51% | 38% | 45% |
if | 10 | 43 | 29 |
call | 5 | 12 | 15 |
loop | 9 | 3 | 5 |
goto | 9 | 3 | 0 |
outros | 16 | 1 | 6 |
Em média, atribuição ``:='', ``if'' e ``call'' constituem 85% dos comandos usados. Mais interessante ainda é a constatação de que 80% das atribuições é do tipo
Numero de termos | % |
1 | 80 |
2 | 15 |
3 | 3 |
4 | 2 |
5 ou mais | 0 |
A distribuição de variáveis locais escalares em procedimentos
também é interessante: 22 % não tem nenhuma variável local e
80 % tem 4 ou menos variáveis locais, como mostra a figura
seguinte.
Numero de variaveis locais | % |
0 | 22 |
1 | 17 |
2 | 20 |
3 | 14 |
4 | 7 |
5 ou mais | 20 |
Quanto ao número de parâmetros de procedimentos, 84 % usam 3
parâmetros ou menos, conforme a tabela abaixo:
Numero parametros | % |
0 | 41 |
1 | 19 |
2 | 15 |
3 | 9 |
4 | 7 |
5 ou mais | 9 |
A conclusão é simples: na prática os programas realmente
escritos consistem de comandos de atribuição (com poucos
termos), if's e chamadas de procedimentos com poucos parâmetros e
variáveis locais. Essa constatação põe em dúvida a
introdução de maior complexidade no microcódigo. Um
microprograma complexo significa maior tempo para decodificar e
executar uma instrução, muitas das quais raramente são
usadas. O número grande de modos de endereçamento significa que
a análise de endereço tem que ser feita por um
microprocedimento. Assim, cada instrução de dois operandos, por
exemplo, teria que chamar tal microprocedimento duas vezes.
A consequência de tudo isso é a constatação de que o
computador pode ser mais rápido se jogarmos fora todo o
interpretador (microprograma) duma vez por todas.
Uma máquina RISC é, portanto, essencialmente um computador com um
pequeno repertório de instruções parecidas com
microinstruções verticais. Programas de usuários são
compilados em sequencias dessas instruções que são
armazenadas na memória principal RAM, buscadas e diretamente
executadas por hardware, sem nunhuma interpretação.
A primeira máquina RISC foi o minicomputador 801, construído
em 1975 por IBM. Em 1980, uma equipe liderada por dois professores de
Berkeley, Patterson e Séquin, projetou a pastilha RISC I e depois
RISC II. Em 1981, Hennessy, de Stanford, projetou a pastilha MIPS. A
Figura faz uma comparação dessas 3 máquinas RISC com
3 máquinas CISC.
Os três projetos RISC acima mencionados levaram a produtos comerciais: o 801 é o antecessor do IBM PC/RT (Risc Technology); o RISC I inspirou a arquitetura SPARC da Sun Microsystems; a pastilha MIPS levou a formação da empresa MIPS Computer Systems que produz pastilhas RISC da DEC e de alguns outros fabricantes.