Webinar: Por que dominar sistema operacional Linux deveria ser a sua prioridade?
Arquiteturas RISC CISC: Comparação entre as Arquiteturas
1. Arquitetura de processadores RISC e CISC
Jaquiel de Souza Paim1
Resumo Este documento pretende fazer uma Estas três tecnologias são as precursoras na construção de
ilustração, tanto técnica, quanto histórica em torno máquinas mais rápidas.
das arquiteturas de processadores RISC (Reduced
Instruction Set Computer) e CISC (Complex A. Memória e armazenamento
Instruction Set Computer), onde serão abordadas
algumas peculiaridades de cada arquitetura. Além Na década de 70, as memórias eram caras e lentas até a
destas peculiaridades, é possível fazer uma breve chegada da memória RAM, que trouxe um pouco mais de
comparação entre cada arquitetura, demonstrando velocidade às máquinas. A memória secundária por sua vez,
as vantagens e desvantagens de cada uma, não também era cara e lenta.
deixando de ressaltar ainda a questão Durante este período, utilizar um volume muito grande
mercadológica, tendo em vista que as questões em de código na memória, desde o armazenamento secundário,
torno das mesmas não estão restritas tão somente à repercutia diretamente no seu desempenho. Para o código ser
arquitetura empregada nos processadores RISC e considerado “bom”, deveria ser compacto, ocupando um
CISC. pequeno espaço de memória, sendo que obtendo pouca
memória, obtinha-se também um baixo custo no total e em
Palavras-chave CISC, RISC, Arquiteturas. todo o sistema.
B. Compiladores
I. INTRODUÇÃO
Ao abordar as arquiteturas RISC e CISC, não se deve Os compiladores neste período, exerciam um trabalho
considerar unicamente a tecnologia em si, mas acima de tudo relativamente simples, de traduzir o código de uma
considerar que as tais, são estratégias adotadas por projetistas linguagem de alto nível para uma de baixo nível.
para atingir um determinado número de objetivos definidos Exemplificadamente de C, ou Pascal ou alguma outra para a
em relação a um conjunto de problemas, ou seja, filosofias de linguagem assembly. O assembly era posteriormente
projeto, ou maneiras de pensar acerca de um determinado convertido em código de máquina, em um processo que
conjunto de problemas e suas soluções. consumia bastante tempo, ainda que a tradução fosse correta,
Em resumo, a filosofia CISC, se baseia na ideia de do contrário poderia se estimar uma demanda de tempo mais
produzir chips capazes de executar um grande número de elevada. A solução para obter um código compacto e
instruções, facilitando o trabalho dos desenvolvedores e dos otimizado era programar em assembly.
compiladores. Em contrapartida, a filosofia RISC, se baseia
no uso de instruções simples, que são executadas C. VLSI
rapidamente pelo processador e podem ser combinadas para
desempenhar as funções de instruções mais complexas. A Em se tratando de VLSI, a tecnologia permitia
partir dessa premissa, foi que projetistas promoveram a densidades de transístores que seriam muito baixas se
evolução de um conjunto de condições tecnológicas comparadas com hoje. Não existia a possibilidade de colocar
existentes em um determinado momento, ou época, pois foi muitas funcionalidades em um único chip. Devido à
com base nas limitações existentes acerca destas condições, necessidade de recursos (transístores), as máquinas CISC
que eles puderam compreender algumas necessidades. tinham suas unidades funcionais espalhadas por vários chips,
Considerando estas limitações, e as necessidades em o que afetava o desempenho do mesmo, devido ao alto tempo
consequência dela, tanto a arquitetura CISC, quanto a RISC de espera entre a transferência de dados e entre cada um
foram abordagens que os projetistas propuseram como mais deles. Logo, uma implementação em um único chip, seria o
eficientes à suas épocas. ideal. Já no início dos anos 80, nos primórdios do
E para entendermos a evolução destas duas arquiteturas, desenvolvimento da arquitetura RISC, um milhão de
precisamos entender também acerca de transistores em um único chip era considerado bastante.
memória/armazenamento e compiladores em meados dos
anos 70 e início dos anos 80, além de VLSI.
1
Acadêmico de Análise e Desenvolvimento de Sistemas, jaquiel.paim@gmail.com
2. II. CISC linguagem de alto nível fosse traduzida em, exatamente, uma
instrução assembly, então:
A arquitetura CISC (Complex Instruction Set Computer,
em uma tradução literal, “Computador com um Conjunto
• Os compiladores seriam mais fáceis de escrever. Isto
Reduzido de Instruções”) tem conjuntos de instruções
pouparia tempo e esforço para os programadores, reduzindo,
grandes, de tamanhos variáveis e com formatos complexos.
assim, os custos de desenvolvimento de software;
Processadores CISC são capazes de executar várias centenas
de instruções complexas diferentes, sendo extremamente
• O código seria mais compacto, o que permitiria poupar
versátil. Estes processadores possuem uma micro
memória, reduzindo o custo global do hardware do sistema;
programação, ou seja, um conjunto de códigos e de
instruções que são gravados no processador, permitindo-lhe
• Seria mais fácil fazer a detecção e correção de erros o
receber as instruções dos programas e executá-las. A
que, de novo, permitiria baixar os custos de desenvolvimento
possibilidade de o processador executar instruções complexas
de software e de manutenção.
facilita a programação de alto nível, diminuindo o código e
consequentemente o espaço utilizado em memória pelos
Ao reduzir o tamanho dos programas conseguiam-se dois
programas. Em contrapartida, temos um menor desempenho
propósitos: por um lado era necessária uma menor quantidade
devido ao processador ter de executar instruções maiores e
de memória para armazenar o código; e por outro o tempo de
mais complexas. O projeto e a construção de processadores
execução era, também diminuído, pois havia menos linhas de
CISC tem um custo elevado, por conta de sua alta
código para executar.
complexidade e maior número de componentes internos do
Além de implementar todo o tipo de instruções que
chip.
faziam um variado número de tarefas como copiar strings ou
Uma instrução em um programa de alto nível é
converter valores para BCD entre muitas outras, havia outra
implementada por diversas instruções de processador, a mais
tática que os projetistas utilizavam para reduzir o tamanho do
baixo nível. Por exemplo, uma instrução de um programa que
código e a sua complexidade: os modos de endereçamento
imprime um conjunto de caracteres na tela é realizado em
complexos.
nível de processador por um conjunto de instruções.
Uma vez carregados nos registos, os operandos poderiam
Os microprocessadores são, em sua maioria, chips CISC.
ser multiplicados pela unidade de execução (ALU –
Um processador CISC suporta um conjunto maior de
Aritmetric Logic Unit). Utilizaríamos as seguintes linhas de
instruções, sendo cada instrução mais especializada; graças a
código para multiplicar o conteúdo das posições de memória
isso, ele pode executar, de modo direto, a maioria das
[2:3] e [5:2] e armazenar o resultado na posição [2:3]:
operações programadas pelos programas de alto nível.
Devido a isto, o número de instruções de processador para
MOV [A, 2:3]
implementar uma instrução de mais alto nível são menores.
Mas quanto maior a quantidade de instruções que um
MOV [B, 5:2]
processador suporta, mais lenta é a execução de cada uma
delas.
MUL [A, B]
Aqui está uma listagem das principais razões para se
MOV [2:3, A]
utilizar este tipo de arquitetura [1]:
Este exemplo de código explicita os passos que têm de ser
• Reduzir as dificuldades de escrita de compiladores;
dados pelo processador para multiplicar os conteúdos de duas
posições de memória. Carregar os dois registos com o
• Reduzir o custo global do sistema;
conteúdo da memória principal, multiplicar os dois números e
guardar o resultado de novo na memória principal. Se
• Reduzir os custos de desenvolvimento de software;
quiséssemos tornar o assembly menos complicado e mais
compacto, poderíamos modificar a arquitetura, de maneira a
• Reduzir drasticamente o software do sistema;
realizar a operação descrita com uma instrução apenas.
Para atingir esse objetivo, a instrução MUL teria que ser
• Reduzir a diferença semântica entre linguagens de
alterada de forma a aceitar como parâmetros duas posições de
programação e máquina;
memória:
• Fazer com que os programas escritos em linguagens
MUL [2:3, 5:2]
de alto nível fossem mais eficientemente;
Evoluir de quatro instruções para apenas uma é um
• Melhorar a compactação do código;
grande ganho de desempenho. Apesar de a “nova arquitetura”
ainda ter que carregar o conteúdo das duas posições de
• Facilitar a detecção e correção de erros.
memória para os registos, multiplicá-los e voltar a armazenar
na memória o resultado – não há como contornar isso – todas
Se uma instrução complexa escrita em uma
essas operações de baixo nível são feitas em hardware e são
3. invisíveis para o programador. Este é um exemplo de investigadores questionassem se a implementação de todas
endereçamento complexo. Uma instrução assembly, na estas instruções complexas e elaboradas em micro-código
realidade leva a cabo uma série complexa de operações. Uma seria, realmente, o melhor caminho para fazer uso dos
vez mais, isto é um exemplo da filosofia CISC de transferir a limitados recursos (transístores) existentes[2].
complexidade do software para o hardware.
III. RISC
A. Micro Programação
Para driblar o baixo desempenho dos processadores
Outra das características das máquinas CISC era a CISC, foi então criada à arquitetura RISC (Reduced
utilização de micro-código. A micro programação era mesmo Instruction Set Computing, ou Computador com um
uma das características primordiais que permitia aos Conjunto Reduzido de Instruções), que, ao contrário da
projetistas a implementação de instruções complexas em arquitetura CISC, suporta algumas poucas instruções simples.
hardware [2]. Para melhor compreender o que é a micro- Em consequência disso, processadores dessa arquitetura tem
programação, vamos considerar, a execução direta. Usando construção mais simples e possuem menos componentes em
execução direta, a máquina carrega a instrução da memória, seu chip, diminuindo seu custo final. Além de baixo custo,
descodifica-a e envia-a para a unidade de execução. Esta também há maior desempenho, pois por haver menos
unidade de execução “pega” na instrução à sua entrada e circuitos internos nestes processadores, encontram-se
ativa alguns circuitos que levam a cabo a tarefa. Se, por menores temperaturas durante seu funcionamento,
exemplo, a máquina carrega a instrução ADD com possibilitando produzir processadores com clocks
operadores em vírgula flutuante e a fornece à unidade de ainda maiores. Em 1997, por exemplo, já haviam
execução, existe, em algum lugar, um circuito que a carrega e processadores RISC, como os Alpha, operando a 600 Mhz.
direciona as unidades de execução para garantir que todas as Contudo, devido a processadores desta arquitetura
operações de deslocamento, adição e normalização são trabalharem com menos instruções, a programação de alto
executadas corretamente. A execução direta é, na realidade, o nível para os mesmos é mais trabalhosa, pois para se usar
que se poderia esperar que acontecesse dentro de um alguma função complexa encontrada em processadores CISC,
computador se não o houvesse conhecimento do micro- deve-se juntar mais de uma instrução simples.
código. Um processador RISC reconhece um número limitado de
Com a micro programação, é quase como termos um instruções, que, em contrapartida, são otimizadas para que
mini-processador dentro do processador. A unidade de sejam executadas com mais rapidez. Portanto, a arquitetura
execução é um processador de microcódigo que executa RISC reduz o conjunto de instruções ao mínimo, e as
micro-instruções. Os projetistas usam estas micro-instruções instruções não implementadas diretamente são realizadas por
para escrever micro-programas que são armazenados numa uma combinação de instruções. Mas em compensação, um
memória de controle especial. programa é implementado por um número maior de
Quando uma instrução normal de um programa é instruções.
carregada da memória, descodificada e entregue ao Muitas das implementações da arquitetura CISC eram
processador de micro-código, este último executa a sub- tão complexas que eram distribuídas por vários chips. Esta
rotina de micro-código adequada. Esta sub-rotina “diz” às situação não era a ideal. Era necessário uma solução num
várias unidades funcionais o que fazer e como fazer. único chip, uma solução que fizesse melhor uso dos escassos
recurso disponibilizados (transístores). No entanto, para que
No início, o micro-código era lento. Mas ainda assim, a todo um processador coubesse num só chip, algumas das suas
ROM utilizada para a memória de controle era cerca de 10 funcionalidades teriam que ser deixadas de fora. Nesse
vezes mais rápida que a memória magnética da altura, por intuito, realizaram-se estudos destinados a descobrir que tipos
isso o processador de micro-código ainda conseguia estar de situações ocorrem mais frequentemente na execução de
suficientemente “avançado” para oferecer um desempenho aplicações. A ideia era descobrir em que tipo de tarefas o
razoável [2]. processador passava mais tempo e otimizar essas mesmas
tarefas.
Contudo, à medida que os micro programas cresceram Se tivessem que ser feitos compromissos, estes deviam
para fazer frente ao crescente número de instruções, alguns ser feitos em favor da velocidade de execução das tarefas nas
problemas começaram a surgir. Para manter um bom quais o processador passa mais tempo trabalhando, ainda que
desempenho, o micro-código tinha que ser altamente isso pudesse atrasar outras tarefas não tão frequentes. Esta
otimizado, eficiente e bastante compacto para que os custos abordagem quantitativa, de fazer de forma mais rápida as
de memória não começassem a crescer desmesuradamente. tarefas mais comuns, provocou a inversão da filosofia
Como os micro programas eram tão grandes, tornou-se difícil iniciada pelos CISC e a complexidade teve que ser retirada
testá-los , detectar e corrigir erros. Como resultado, o micro- do hardware e ser passada para o software.
código incluído nas máquinas que vinham para o mercado Os entusiastas da arquitetura diziam que o suporte para as
tinha, por vezes, erros e tinha que ser corrigido inúmeras linguagens de alto nível poderia ser mais eficiente se fosse
vezes no terreno. Foram estas dificuldades de implementação implementada em software, gastar recursos (transístores)
do micro-código que levaram a que os preciosos para suportar as linguagens de alto nível em
4. hardware era um desperdício. Esses recursos poderiam ser armazenar as funcionalidades necessárias, mas sim, o que
utilizados em outras tecnologias para melhorar o fazer com todos os transístores disponibilizados.
desempenho. E quando eles tiveram que decidir quais as
funcionalidades que teriam que ser retiradas, o suporte para o A. Conjunto de Instruções
micro-código foi o primeiro, e com ele também um grupo de
instruções complexas que, supostamente, tornava o trabalho Uma instrução é um comando codificado em 0’s e 1’s
dos compiladores e dos programadores mais fácil. que leva o processador a fazer algo. Quando um programador
Não só o número de instruções foi reduzido, mas escreve um programa em C, por exemplo, o compilador
também o tamanho das mesmas. Foi decidido que todas as traduz cada linha de código C em uma ou mais instruções do
instruções RISC deveriam, sempre que possível, demorar processador. Para que os programadores possam “ver” estas
apenas um ciclo de clock ao terminar a sua execução. A desta instruções não tendo que lidar com 0’s e 1’s, as instruções
decisão foi baseada em algumas observações feitas pelos são representadas por mnemônicas – por exemplo MOV, que
investigadores. Tudo o que poderia ser feito usando as copia um valor de uma localização para outra ou ADD, que
instruções de micro-código, também poderia ser feito com adiciona dois valores. A seguinte linha de código adiciona
pequenas e rápidas instruções de assembly. A memória que dois valores (b e c) e coloca o resultado em a:
estava a ser usada para armazenar o micro-código, poderia
simplesmente ser usada para armazenar o assembler, assim a A=B+C
necessidade de micro-código seria pura e simplesmente
eliminada. É por esta razão que muitas das instruções de uma Um compilador de C poderia traduzir isto na seguinte
máquina RISC correspondem à micro-instruções numa sequência de instruções:
máquina CISC [2].
Na arquitetura RISC, a função do compilador é muito MOV AX, B
mais proeminente. O sucesso deste tipo de arquitetura
depende fortemente da “inteligência” e nível de otimização ADD AX, C
dos compiladores que se “aproveitam” da maior
responsabilidade que lhes é concedida para poderem debitar MOV A, AX
código mais otimizado. O ato de transferir o fardo da
otimização do código do hardware para o compilador foi um A primeira instrução copia o conteúdo da localização de
dos mais importantes avanços da arquitetura RISC. Como o memória que contém o valor B para o registo AX do
hardware passou a ser mais simples, isto significava que o processador (um registo é uma localização de armazenamento
software tinha que absorver alguma da complexidade dentro do processador que pode conter uma certa quantidade
examinando agressivamente o código e fazendo um uso de dados, normalmente 16 ou 32 bits. Sendo uma parte
prudente do pequeno conjunto de instruções e grande número integrante do processador, os acessos aos registos são
de registos típicos desta arquitetura. Assim, as máquinas muitíssimo mais rápidos que os acessos à memória). A
RISC dedicavam os seus limitados recursos (transístores) a segunda instrução adiciona o valor c ao conteúdo de AX e a
providenciar um ambiente em que o código poderia ser terceira copia o resultado, que está em AX, para a localização
executado tão depressa quanto o possível, confiando no onde a variável A está armazenada. Qualquer programa, por
compilador para fazer o código compacto e otimizado. mais complexo que seja, é traduzido, em última análise, em
séries de instruções.
Os programas modernos contêm, frequentemente,
IV. CISC x RISC centenas de milhares de linhas de código. Os sistemas
operacionais são ainda mais complexos. O Microsoft
É inevitável não exercer uma breve comparação entre Windows 95, por exemplo contém cerca de 10 milhões de
estas duas arquiteturas, diante de todas as questões que foram linhas de código, a maior parte escrita em C, e o Windows
levantadas acerca de cada uma delas. NT tem mais de 5 milhões de linhas de código escritas em C
Qualquer pessoa que tenha instalado recentemente um e C++. Imagine traduzir 1 milhão de linhas de código C num
programa da Microsoft sabe que muitas das companhias que conjunto de instruções, de uma a vinte ou trinta instruções
desenvolvem software já não têm em consideração as por linha de código. Desta maneira fica mais fácil perceber o
limitações de memória. Assim, as preocupações com o porquê de o software de hoje em dia ser tão complicado – e
tamanho do código que deram origem ao vasto conjunto de tão difícil de corrigir.
instruções da arquitetura CISC já não existem mais. O objetivo original dos projetistas de chips RISC era
O desenvolvimento dos compiladores também sofreu um limitar o número de instruções suportadas pelo chip de modo
avanço nos últimos anos. A nova geração de arquiteturas a que fosse possível alocar um número suficiente de
(como o IA-64 ou Merced da Intel) depende apenas do transístores a cada uma delas, para que a sua execução
compilador para ordenar as instruções tendo em vista a precisasse apenas de um ciclo de clock para se completar.
máxima taxa de instruções executadas. Em vez de disponibilizar uma instrução MUL, por
O número de transístores que “cabem” numa placa de exemplo, o projetista faria com que a instrução ADD
silício é extremamente elevado e com tendência a crescer executasse em 1 ciclo de clock. Então o compilador
ainda mais. O problema agora já não é a falta de espaço para
5. poderia fazer a multiplicação de A e B somando a ele próprio PCs orbitavam não apenas em torno do OS X e dos softwares
B vezes ou vice versa. Um CPU CISC poderia multiplicar 10 para a plataforma, mas também nas diferenças entre as duas
e 5 da seguinte forma: famílias de processadores.
MOV AX, 10
V. ARQUITETURA HÍBRIDA
MOV BX, 5
Devido a cada uma das duas arquiteturas terem suas
MUL BX peculiaridades. Os fabricantes de processadores decidiram
unir ambas em uma só, formando uma arquitetura híbrida.
enquanto um CPU RISC faria o mesmo de outro modo: Num processador RISC, há um (ou mais) circuitos CISC, e
vice-versa. Desta forma, o processador trabalha mais rápido
MOV AX, 0 em instruções que requer maior demanda (RISC), devido à
maioria das instruções executadas serem de pouca
MOV BX, 10 complexidade e, quando necessário, haverá a disponibilidade
de se executar instruções complexas, encontradas em
MOV CX, 5 processadores CISC. Atualmente, grande parte dos
processadores adota este conceito.
begin:
ADD AX, BX
VI. CONCLUSÃO
loop begin; loop CX vezes Pudemos perceber, analisando algumas características de
cada arquitetura, que a princípio, ambas surgiram como
é claro que este é apenas um exemplo ilustrativo, pois os esforços para não apenas revolucionar, uma arquitetura
chips RISC atuais têm, de fato, instruções de multiplicação. existente, como também obter maior e melhor desempenho
de tarefas ou rotinas de processamento de dados, que até dado
momento eram consideradas ineficientes.
B. Características comerciais É válido ressaltar também, que foram filosofias (ou linhas
de desenvolvimento) diferentes para solucionar um mesmo
Durante grande parte da história dos computadores problema. E ambas também desempenharam um marco
pessoais, o modelo predominante dos microprocessadores histórico de disputa não apenas filosófico e tecnológico, de
tem sido da Intel Corporation. O primeiro processador no diferentes ideias e métodos, mas de disputa mercadológica.
IBM PC foi o Intel 8088. As gerações seguintes de Porém, em contrapartida a tudo isso, é notório que tanto
processadores Intel foram da família 80X86 – 8086, 80286, uma arquitetura, quanto outra, apresentam vantagens e
80386, 80486. Todos eram versões elaboradas do 8088 desvantagens, e atualmente pode-se tirar proveito do
original, mas com desempenho melhorado de duas maneiras aprendizado adquirido ao longo destes anos, e unir o melhor
– operando mais rapidamente ou manejando mais dados das duas opções, em busca de melhores resultados.
simultaneamente. O 8088, por exemplo, operava a 4,7 Mhz –
ou 4,7 milhões de oscilações por segundo – e alguns chips
80486 vão tão rápido quanto 133 MHz. O 8088 conseguia REFERÊNCIAS
manejar 8 bits de dados por vez, enquanto o 80486 maneja 32
bits internamente. Os processadores Intel até o 80486 eram [1] David R. Ditzel, David A. Patterson, “Retrospective on HLLCA. 25 years
of the international symposia on Computer architecture (selected
baseados na filosofia CISC. papers)”, 1998.
Projetos RISC são encontrados em processadores mais
novos, entre eles o DEC Alpha, o RISC 6000 da IBM, o [2] David A. Patterson, “Reduced Instruction Set Computers”, Commun.
processador Power PC e, embora a Intel não chame os ACM 28, Jan. 1985.
processadores Pentium de chips RISC, eles têm muito em
SILVA, Luís Filipe; ANTUNES, Vítor José Marques.Comparação entre
comum com o padrão RISC de executar códigos. A Apple as arquitecturas de processadores RISC e CISC. Porto, 9 p. Trabalho não
desenvolveu, sob a arquitetura RISC, em parceria com a publicado.
Motorola e a IBM, o chip PowerPC, com mais poder de
processamento que o chip Pentium. Ele equipa a linha de Guia do Hardware. Disponível em:
<http://www.hardware.com.br>
microprocessadores MakPower (nos modelos 6100, 7100,
8100).
Muito se discutiu sobre as vantagens e desvantagens dos Clube do Hardware. Disponível em:
processadores PowerPC em relação aos chips x86. O <http://www.clubedohardware.com.br>
principal reduto dos chips PowerPC eram os Macs (com todo
o misticismo envolvido), enquanto os PCs eram o território
dos chips x86. Com isso, as discussões em torno dos Macs e