Käsustik

Käsustik (inglise keeles "instruction set") on arvuti protsessori masinakäskude täielik kogu ja ühtlasi arvuti arhitektuuri element, mis liidestab tarkvara (sealhulgas arvutiprogrammid) riistvaraga. Käsustik määrab ära, milliseid käske protsessor suudab mõista ja täita, mis defineerib seeläbi arvuti põhivõimekuse.
Iga käsu käitumine on protsessori tasemel täpselt defineeritud: see võib hõlmata näiteks aritmeetilist tehet, andmeedastust registrite ja mälu vahel, loogikatehet või haru ehk tingimuslikku hüpet. Need käsud on kodeeritud binaarselt ja neid nimetatakse ka masinkäskudeks. Programmeerijate jaoks on need tavaliselt nähtavad assemblerkeeles.
Käsustikud jagunevad arhitektuuriliselt laias laastus kaheks: CISC ("Complex Instruction Set Computing"), mis on eesti keeles kompleksne käsukomplektne arvuti, ja RISC ("Reduced Instruction Set Computing"), mis tähendab kärbitud käsustikuga arvutit. Esimene keskendub keerukamatele käskudele, mis võivad sooritada mitu sammu ühe käsuna, samas kui RISC lähtub lihtsamatest käskudest, optimeerides kiirust ja tõhusust. Viimasest on edasi arendatud ka RISC-V käsustik, mis on rohkem avatud ja modulaarne. See kogub populaarsust tänu oma paindlikkusele ja vaba litsentsi alusel kasutamise võimalusele.
Käsustiku mõistmine aitab paremini näha seoseid tarkvara ja riistvara vahel ning mõista, kuidas kompilaatorid, operatsioonisüsteemid ja protsessorid koos toimivad. See teadmine on aluseks arvutiteaduses ja inseneerias, eriti kui eesmärk on saavutada tarkvara ja riistvara optimeeritud koostöö.
Käsustiku ülesehitus.
Käsustik koosneb individuaalsetest käskudest ehk instruktsioonidest, millel on kindel ülesehitus ja tähendus. Iga käsk esindab protsessorile mõistetavat juhist, mis suunab teda sooritama kindlat toimingut - olgu selleks näiteks andmete liigutamine, arvutamine, mäluaadressile ligipääs või programmi juhtimisvoo muutmine. 
Instruktsiooni formaati võib üldjoontes jagada järgmisteks osadeks:
Näiteks lihtne käsk codice_1 võib RISC-tüüpi arhitektuuris tähendada: liida registri codice_2 ja codice_3 sisu ning salvesta tulemus registrisse codice_4. Siin on codice_5 käsukood ning codice_4, codice_2, codice_3 on operandid, mis viitavad registritele.
Instruktsioone liigitatakse sageli ka funktsionaalsuse alusel:
Instruktsiooni formaadi kuju ja pikkus võivad olla arhitektuuriti erinevad. Mõnes käsustikus on kõik käsud fikseeritus pikkusega (näiteks 32-bitised RISC-käsud), samas kui CISC-tüüpi arhitektuurides (näiteks x86) võivad käsud olla muutliku pikkusega.
Käsustiku disain mõjutab otseselt nii protsessori keerukust kui ka kompilaatorite ja tarkvara arendamise viisi. Hästi kujundatud käsustik on tasakaalus lihtsuse, kiiruse ja laiendatavuse vahel ,võimaldades tõhusat masinaressursside kasutust.
Käsustiku tüübid.
Käsustikud erinevad üksteisest ülesehituse, keerukuse ja põhimõtte poolest. Ajalooliselt on kujunenud kaks peamist lähenemisviisi: CISC ("Complex Instruction Set Computing") ja RISC ("Reduced Instruction Set Computing"). Viimastel aastatel on lisandunud ka RISC-V, avatud lähtekoodiga käsustik, mis kujundab uut standardit teadus- ja tööstusringkondades.
CISC ("Complex Instruction Set Computing").
CISC-arhitektuuride eesmärk on pakkuda võimalikult rikkaliku ja võimsat käskude komplekti, kus iga käsk võib teostada mitut madalama taseme toimingut. See vähendab masinakeele käskude arvu, mida tuleb mingi ülesande jaoks kasutada. CISC-käsud võivad olla muutliku pikkusega ja sisaldada keerukaid adresseerimismeetodeid, mis sobib hästi olukordadesse, kus mälumaht on piiratud. Tuntuimad CISC-arhitektuuriga käsustikud on x86, VAX ja Z80. Näiteks võib üks x86 käsu instruktsioon laadida andmed mälust, teha aritmeetilise operatsiooni ja salvestada tulemuse - kõik ühe käsuna.
RISC ("Reduced Instruction Set Computing").
RISC-arhitektuur lähtub lihtsuse ja efektiivsuse printsiibist. Käskude arv on piiratud, need on lühikesed ja fikseeritud pikkusega, mis võimaldab protsessoril neid kiiremini dekodeerida ja paralleelselt töödelda. Iga käsk täidab üldiselt ühe lihtsa operatsiooni, mis sobib hästi tänapäevaste mikrokontrollerite, mobiilseadmete ja püsivarade jaoks, kus on oluline energiatõhusus ja kiirus. Tuntuimad RISC-arhitektuuriga käsustikud on ARM, MIPS, SPARC ja PowerPC. RISC-käsustik on hästi sobitatav torustike ja superskalaarsete protsessorite jaoks tänu käsu ühtlasele struktuurile.
RISC-V.
RISC-V on kaasaegne, avatud standardil põhinev RISC-tüüpi käsustik, mida saab vabalt kasutada ja kohandada. Erinevalt x86 või ARM-ist ei ole sellel litsentsitasusid, mis teeb selle sobilikuks nii akadeemiliseks kasutuseks kui ka tööstuslikeks rakendusteks. RISC-V on modulaarne ehk põhikomplekti saab laiendada spetsialiseeritud laiendustega, näiteks ujukomaarvude tugi, vektorprotsessid, masinõppe kiirendid. RISC-V on oluline samm arvutiarhitektuuri demokratiseerimise suunas, pakkudes arendajatele rohkem kontrolli ja läbipaistvust.
Käsustiku roll tarkvaras ja kompilaatorites.
Käsustik ei ole oluline vaid riistvaradisainis - see mängib keskset rolli ka tarkvara arenduses ja kompilaatorite töös, olles ühenduslüli kõrgtaseme programmeerimiskeelte ning protsessori vahel.
Masin- ja assemblerkeel.
Programmid, mida arendajad kirjutavad (näiteks C, Python, Java), ei tööta otseselt protsessoril. Need tuleb esmalt tõlkida masinkeelde, mis koosneb käsustikus defineeritud binaarkäskudest. Sellele eelneb tavaliselt assemblerkeel, mis on inimesele loetavam esitus masinakäskudest (näiteks codice_1), mis on üks-ühele vastavuses vastava käsustiku koodidega. Assemblerkeel võimaldab programmeerijal kirjutada otseseid juhiseid protsessorile ning kasutada käsustikus määratud registristruktuuri, adresseerimismeetodeid ja käsuformaate. 
Kompilaatorid ja käsustik.
Kompilaatorid, näiteks GCC või LLVM, on tööriistad, mis tõlgivad kõrgtaseme koodi assemblerkeelde ja sealt edasi masinkeelde. Kompilaatori ülesanne on leida efektiivseim viis käsustiku kasutamiseks, arvestades arhitektuuri eripärasid, registrite arvu, käsuformaate ja optimeerimisvõimalusi. Kompliaatori tööd mõjutavad otseselt järgmised käsustiku omadused:
Käsustiku detailid määravad, kui optimeeritud saab kood olla. Näiteks RISC- võis CISC-käsustike puhul võib sama algoritmi masinkoodiline esitus olla väga erinev.
Käsustiku arendamine ja laiendamine.
Käsustik ei ole ajas muutumatu - see kujuneb ja täiustub vastavalt riistvara võimaluste, programmeerimispraktikate ning kasutusvajaduste muutumisele. Ajalooliselt on käsustike areng kajastanud kogu arvutite arengu suundumusi: alates lihtsatest ühefunktsioonilistest käskudest kuni keerukate, eriotstarbeliste laiendusteni.
Ajalooline kujunemine.
Esimesed käsustikud tekkisid 1940.-1950. aastatel koos esimestele digitaalarvutitele ehitatud protsessoritega, näiteks ENIAC ja UNIVAC. Käsud olid väga lihtsad: näiteks liida, lahuta, lae mälust, salvesta mällu. Iga käsk oli füüsiliselt trükitud kaart või juhtmega ühendus paneelil.
1960. aastatel tõi IBM System/360 perekond esile esimese suure ja laialdaselt kasutatud CISC-käsustiku eesmärgiga võimaldada ühe platvormi toetust erinevatele rakendustele, sealhulgas ärikasutusele ja teaduslikele arvutustele.
1970. aastate lõpus ja 1980. aastate alguses hakati tajuma, et üha keerulisemaks muutuvad käsustikud aeglustasid portsessorite dekodeerimist ja täitmist. See viis RISC-käsustike sünnini, näiteks Berkeley RISC ja IBM 801 projektides. Selle idee oli, et lihtsamaid ja ühtlasemaid käske saab täita kiiremini ja konveierdada efektiivsemalt.
1990. aastatel muutus oluliseks energiasäästlikkus, eriti mobiilarvutite ja kantavate seadmete tõttu. See tõstis esile ARM-käsustiku, mis on kompaktne, modulaarne ja väga hästi sobiv madala energiatarbega seadmetesse. Samal ajal püsis x86 arhitektuur (CISC-põhine) domineeriv lauaarvutites ja serverites, kuna säilitas tagasiühilduvuse varasemate seadmetega.
2000. aastate alguses muutus käsustiku areng tihedalt seotuks kolme peamise suunaga: paralleelsus, spetsialiseerumine ja energiatõhusus. Protsessorite taktsagedused ei saanud enam oluliselt kasvada soojuseralduse ja füüsikaliste piirangute pärast, mistõttu tootjad hakkasid otsima alternatiivseid viise jõudluse parandamiseks. Üheks lahenduseks oli vektorkäsustike ja SIMD-laienduste lisamine. Näiteks lisas Intel oma x86-käsustikule SSE ("Streaming SIMD Extensions"), hiljem AVX ("Advanced Vector Extensions") - need võimaldavad samaaegselt töödelda mitut andmeelementi ühe käsuga.
2010. aastatel kerkis esile RISC-V, avatud lähtekoodiga käsustik, mille eesmärk oli pakkuda moodulipõhist, lihtsat ja vabalt laiendatavat käsustiku nii teaduslikuks kasutuseks kui ka tööstuslikuks rakenduseks. RISC-V osutus populaarseks just tänu oma avatud olemusele, mis võimaldas ettevõtetel luua kohandatud protsessoreid ilma litsentsitasudeta, erinevalt x86-st või ARM-ist. Samaaegselt kasvas vajadus spetsialiseeritud käsustike järele, mis on suunatud konkreetsetele valdkondadele, nagu masinõpe, krüptograafia, andmeturve. Näiteks sisaldab Apple'i M-seeria protsessorite käsustik spetsiaalseid käske tehisnärvivõrgu arvutuste, pilditöötluse ja turvalise mäluhalduse jaoks.
Lisaks muutub käsustik üha tihedamalt seotud tarkvara ja virtualiseerimisega. Kaasaegsed käsustikud sisaldavad käskusid, mis toetavad konteinerite ja virtuaalmasinate haldust ja töökindlust pilvekeskkondades.