Architetture dei processori/Set di istruzioni

Una prima classificazione dei microprocessori si può fare a seconda dei tipo di istruzioni implementate, queste possono essere CISC o RISC.

 
Motorola 68000 uno dei meglio riusciti processori CISC

Un'architettura CISC (Complex Instruction Set Computer) è dotata di un set di istruzioni che consentono di eseguire operazioni anche complesse. I primi microprocessori erano di questa tipologia e fino agli anni 80 questo è stato il paradigma imperante. I microprocessori con questa architettura erano pensati per essere programmati in assembler e quindi il progettista metteva a disposizione del programmatore istruzioni anche molto complesse che sfruttavano le peculiarità della macchina in modo da generare programmi veloci e che occupassero poca memoria. Queste istruzioni potevano nascondere alcune caratteristiche del processore per rendere la programmazione assembler più semplice. Per esempio potevano contenere istruzioni che formalmente modificavano i dati in memoria senza passare dai registri. In realtà queste istruzioni caricavano il dato in un registro nascosto, modificavano il dato e poi lo risalvavano in memoria. In sostanza creavano un illusoreo teatro per il programmatore.

I processori CISC spesso sono dotati di un set di istruzioni definito con codici di lunghezza variabile e sono dotati di un numero ridotto di registri dato. I codici di lunghezza variabile permettono di sfruttare al pieno la memoria disponibile mentre i pochi registri interni derivano dai pochi transistor integrabili negli anni 80 e dal fatto che avendo istruzioni interne molto complesse spesso non sono necessari molti registri per eseguire i programmi.

 
Processore MIPS prodotto da Toshiba basato su architettura RISC

I microprocessori RISC (Reduced Instruction Set Computer) invece sono basati sulla presenza di un numero ridotto di istruzioni rispetto a un microprocessore CISC e di un ridotto numero di modi di indirizzamento. Questo permetteva di realizzare architetture semplici e con pochi transistor, i transistor rimanenti potevano essere utilizzati per realizzare molti registri o per implementare strutture come le pipeline (vedi oltre). Nei microprocessori RISC quasi tutte (se non tutte) le istruzioni erano eseguite in numero costante di cicli di clock (usualmente 1 o 2). Questo a differenza dei microprocessori CISC dove alcune operazioni erano eseguite in modo rapido (1 o 2 cicli di clock) mentre altre richiedevano decine di cicli di clock (usualmente le divisioni).

I processori RISC non erano nati per essere programmati in assembler dato che non implementavano semplificazioni per il programmatore che invece i processori CISC avevano. Questa tipologia di processori era nata per essere programmata con linguaggi ad alto livello che poi opportuni compilatori avrebbero tradotto in linguaggio macchina. I processori RISC normalmente hanno un set di istruzioni di lunghezza fissa per facilitare il caricamento di pezzi di codice ad alta velocità in modo semplice e sono quasi sempre dotati di molti registri (spesso centinaia) dato che per eseguire un programma spesso sono necessarie molte operazioni elementari e quindi molti registri ove salvare i dati intermedi.

 
NexGen Nx586 il primo processore CRISC compatibile con l'architettura X86

Negli ultimi anni tutti i microprocessori sono di tipologia RISC internamente. Anche i microprocessori che in teoria sono CISC (architettura X86 per esempio) in realtà traducono le istruzioni internamente in istruzioni RISC. In questi casi a volte si parla di architettura CRISC (o Post-RISC) per sottolineare l'architettura ibrida. I processori RISC si sono diffusi sul mercato dato che oramai solo una ridottissima cerchia di programmatori utilizza l'assembler dato che i linguaggi ad alto livello permettono di scrivere programmi in minor tempo. Le istruzioni complesse dei CISC e i particolari modi di indirizzamento e i vari ammennicoli che venivano inseriti per i programmatori assembler rendono invece i programmi compilati più lenti e in generale deprimono le prestazioni anche perché rendono molto più difficile implementare tecnologie come le pipeline che velocizzano di molto il processore. In generale i processori CISC risultano meno performanti a parità di transistor utilizzati di un equivalente RISC.

Questa architettura quindi cerca di sfruttare le prestazioni dei processori RISC pur mantenendo la compatibilità con i passati programmi scritti con set di istruzioni CISC. Questo approccio ha lo svantaggio di rendere il processore molto più complesso di un equivalente processore RISC e meno performante. Difatti i compilatori per architetture CISC compilano il codice tenendo conto di alcune considerazioni tecniche che con questi processori non sono vere. Inoltre questi processori per effettuare la conversione da CISC a RISC implementano alcune tecniche (come la ridenominazione dei registri) che incrementano la complessità dei processori e comunque non forniscono le prestazioni di un RISC nativo. Questa architettura quindi va intesa come un trucco utilizzato per aumentare le prestazioni senza compromettere la compatibilità con il passato e non come una scelta tecnica primaria. Se non si hanno problemi di compatibilità soluzioni RISC o VLIW sono sempre migliori.