Complex instruction set computer

**Complex instruction set computer** (**CISC**, uttalt "*sisk*") er en instruksjonssettarkitektur (ISA) hvor hver instruksjon kan utføre flere lavnivåoperasjoner, som for eksempel lese fra minnet, en aritmetisk operasjon og skriving til minnet, alt i én instruksjon. Begrepet har senere blitt benyttet i kontrast til «Reduced instruction set computer» (RISC).

Eksempler på CISC-prosessorfamilier er System/360, PDP-11, VAX, 68000 og x86.

## Historisk designkontekst
### Fordeler
Før RISC-filosofien ble fremtredende, forsøkte mange datamaskinarkitekter å bygge bro over det såkalte semantiske gapet. Det vil si å utforme instruksjonssett som direkte støttet høynivå programmeringskonstrukter - slik som prosedyreoppkall, løkkekontroll og komplekse adresseringmodeller -, som tillater at datastruktur og tabelltilgang kan slås sammen til én instruksjon.  Den kompakte karakteren til et slikt instruksjonssett resulterer i mindre programkode og færre (tidkrevende) hovedminne-aksesseringer, som tidlig fra 1960-tallet resulterte i en stor besparelse av lagringskapasitet og raskere utføring. Det betydde også god programmeringsproduktivitet selv i lavnivå programmering assemblerspråk. På denne tiden var ikke høynivå programspråk alltid tilgjengelig.

### Ytelse
På 1970-tallet erfarte man at maskinspråkkodete programmer kunne bli svært kompliserte, og man mente at man ved å innføre nye instruksjoner skulle oppnå forbedret ytelse. Man føyet til instruksjoner som aldri var ment å bli brukt i assemblerspråk, men som passet godt for kompilerte høynivåspråk. Kompilatorer ble oppdatert for å dra nytte av disse utvidete instruksjonene. Fordelene ved semantisk rike instruksjoner med kompakte koding, sees også i moderne prosessorer, spesielt i høy-ytelsessegmentet der bufferminnet er en sentral komponent. Dette er fordi disse raske, men komplekse og dyre minnekretsene har begrensninger i størrelse, noe som gjør kompakt kode gunstig. Selvfølgelig er den grunnleggende årsaken at  minnebrikkene (dvs. dynamisk RAM i dag) fremdeles er langsommere enn minnet i en (høy ytelses) CPU-kjerne.

### Potensielle problemer
Selv om mange implementeringer av CISC oppnådde målet om høyere gjennomstrømning til en lavere kostnad, ble ikke alltid dette resultatet. For eksempel viste det seg at «low-end» versjoner av komplekse arkitekturer (dvs. med mindre maskinvare) kunne resultere i at det var mulig å forbedre ytelsen ved *ikke* å bruke komplekse instruksjoner (for eksempel et prosedyrekall eller skrive-instruksjon), men i stedet benytte en sekvens av enklere instrukser. En årsak til dette var at konstruktørene noen ganger konstruerte  instruksjoner som ikke var mulig å utføre effektivt på den tilgjengelige grunnleggende maskinvaren. 

Selv i en balansert høy-ytelsesdesign, svært kodet og (relativt) høytnivå instruksjoner kan være komplisert å dekode og kjøre effektivt innenfor et begrenset transistor budsjett. Slike arkitekturer krever derfor mye av arbeidet på den delen av prosessoren designer i tilfeller der det enklere, men (vanligvis) langsommere, løsning basert på dekode tabeller og/eller mikrokode sekvensering er ikke passende. På den tiden hvor transistorene var en begrenset ressurs, dette tillot også mindre plass på prosessoren for å optimalisere ytelsen på andre måter, noe som ga rom for ideer for å gå tilbake til enklere prosessordesign for å gjøre det mulig å klare seg uten ROMer (eller til og med PLAer) for sekvensering og/eller dekoding. Dette førte til de første RISC-*merkede* prosessorer på midten av 1970-tallet (IBM 801 – IBMs Watson Research Center).

#### På 2000-tallet
Transistorer for logikk, PLAer og mikrokode er ikke lenger knappe ressurser (med mulig unntak av høyhastighets bufferminne). Sammen med bedre verktøy og ny teknologi, har dette ført til nye implementeringer av høyt kodet og variabel lengde design uten «load-store» begrensninger (dvs. ikke RISC). Dette styrer re-implementeringer av eldre arkitekturer som allestedsnærværende x86 (se nedenfor) samt ny design for mikrokontrollere for innebygde systemer og liknende bruksområder.

#### CISC og RISC
Begrepene CISC og RISC blitt mindre meningsfylt med den fortsatte utviklingen av både CISC og RISC design og implementeringer. Den første høyt (eller tett) «pipelined» x86-implementeringer, den 486 design fra Intel, AMD, Cyrix og IBM, støttet alle instruksjon som deres forgjengere gjorde, men oppnådde *maksimal effektivitet* bare på en ganske enkel x86 undergruppe som lignet bare litt mer enn et typisk RISC instruksjonssett (dvs. uten typisk RISC *[[RISC|«load-store»]]* begrensninger). Pentiumgenerasjon var en superskalærversjon av disse prinsippene, men moderne x86-prosessorer også (vanligvis) dekoder og delte instruksjoner til dynamiske sekvenser av interne bufrete mikrooperasjoner, som ikke bare bidrar til å utføre en større del av instruksjonene i en «pipelined» (overlappende) måte, men også muliggjort mer avanserte utvinning av parallellitet ut av kodestrømmen, for enda høyere ytelse.

## Se også
*CPU
*RISC
*ZISC
*VLIW
*CPU design
*Datamaskinarkitektur

## Eksterne lenker
* Sammenligning av RISC og CISC  (engelsk)