Αρχιτεκτονική συνόλου εντολών

Το σύνολο εντολών (instruction set) ή αρχιτεκτονική συνόλου εντολών (instruction set architecture, ISA), είναι το τμήμα της αρχιτεκτονικής υπολογιστών που συνδέεται με τον προγραμματισμό και περιλαμβάνει τους τύπους δεδομένων της μηχανής, τις εντολές, τους καταχωρητές, τους τρόπους διευθυνσιοδότησης (addressing modes), την αρχιτεκτονική μνήμης, τον χειρισμό διακοπών και εξαιρέσεων, καθώς και την εξωτερική είσοδο/έξοδο (Input/output, I/O). Μια αρχιτεκτονική συνόλου εντολών περιλαμβάνει το σύνολο των μνημονικών εντολών (opcodes) της γλώσσας μηχανής, και τις εντολές που υλοποιούνται από τον ίδιο τον επεξεργαστή. 
Η αρχιτεκτονική συνόλου εντολών διαφέρει από τη μικροαρχιτεκτονική, η οποία είναι το σύνολο των τεχνικών σχεδίασης επεξεργαστών, που χρησιμοποιείται για την υλοποίηση του συνόλου εντολών. Υπολογιστές με διαφορετικές μικροαρχιτεκτονικές μπορούν να έχουν το ίδιο σύνολο εντολών. Για παράδειγμα, ο Pentium της Intel και ο Athlon της AMD υλοποιούν σχεδόν ίδιες εκδόσεις του συνόλου εντολών x86, αλλά έχουν σημαντικά διαφορετικές εσωτερικές σχεδιάσεις. Η αρχιτεκτονική συνόλου εντολών IA32 σχεδιάστηκε από την εταιρία Intel για του επεξεργαστές της ίδιας εταιρίας. Η ανταγωνιστική εταιρία AMD υλοποίησε επεξεργαστές διαφορετικής αρχιτεκτονικής από αυτούς της Intel αλλά χρησιμοποίησε το ίδιο ακριβώς σύνολο εντολών IA32 (αρχικά σχεδιασμένο μόνο για Intel). Το 2002 περίπου η AMD επέκτεινε το σύνολο εντολών Intel-IA32 στο νέο σύνολο x86-64 για να υποστηρίζονται συστήματα 64 bit τα οποία μπορούν να χρησιμοποιηθούν χώρους διεύθυνσης μνήμης μέχρι 256 terrabytes (2^{64} bytes). Η Intel με το IA32 απευθυνόταν σε μηχανήματα 32bit όπου μπορούσαν να χρησιμοποιούν χώρο διεύθυνσης μνήμης μέχρι 4 gbytes (2^{32} bytes).Η AMD εκτός από το σύνολο εντολών x86-64 την εποχή εκεί κατάφερε και έβγαλε στην αγορά επεξεργαστή γρηγορότερο από 1 GHz.  Η επέκταση της AMD στο νέο σύνολο x86-64 επέτρεψε να μπορούν να χρησιμοποιηθούν χώροι διεύθυνσης μνήμης μέχρι 256 terrabytes (2^{64} bytes). Το σύνολο εντολών x86-64 στην συνέχεια υιοθετήθηκε και από την Intel για την κατασκευή επεξεργαστών. Το σύνολο εντολών x86-64 ενσωματώνει λειτουργίες για δημιουργία βελτιωμένου κώδικα μηχανής. 
Κάποιες εικονικές μηχανής (virtual machines) που υποστηρίζουν κώδικα byte (bytecode), όπως αυτές της Smalltalk και της Java, καθώς και η εικονική μηχανή Common Language Runtime της Microsoft σαν αρχιτεκτονική συνόλου εντολών, την υλοποιούν μεταφράζοντας τον κώδικα byte από συχνά χρησιμοποιούμενα μονοπάτια κώδικα σε κώδικα μηχανής, και εκτελούν τα λιγότερο συχνά χρησιμοποιούμενα μονοπάτια με διερμηνεία. Για παράδειγμα, με αυτόν τον τρόπο, η Transmeta υλοποίησε το σύνολο εντολών x86 σε επεξεργαστές VLIW.

TIMI

Η TIMI (Technology-Independent Machine Interface) ήταν μια ιδιαίτερη αρχιτεκτονική συνόλου εντολών που εμφανίστηκε στους IBM System/38 και IBM AS/400. Υλοποιήθηκε από λογισμικό χαμηλού επιπέδου που μετέφραζε τον κώδικα TIMI σε κώδικα μηχανής, παρέχοντας λειτουργίες που σήμερα θα αποδίδονταν σε μια «εικονική μηχανή» (virtual machine). Σχεδιάστηκε για να αυξήσει τον χρόνο ζωής της πλατφόρμας και των εφαρμογών της, επιτρέποντας τη μεταφορά ολόκληρης της πλατφόρμας σε πολύ διαφορετικό υλικό χωρίς να χρειάζεται μετατροπή στο λογισμικό εκτός από τον μεταφραστή από TIMI σε γλώσα μηχανής, και από τον κώδικα που υλοποιεί τις υπηρεσίες που χρησιμοποιούνται από τον κώδικα μηχανής που προκύπτει. Αυτό επέτρεψε στην IBM να μεταφέρει την πλατφόρμα AS/400 από μια παλιά αρχιτεκτονική CISC στην νεότερη αρχιτεκτονική POWER χωρίς να πρέπει να γράψει πάλι ή να μεταγλωττίσει μέρη του λειτουργικού συστήματος ή του λογισμικού, εκτός από τον κώδικα χαμηλού επιπέδου που αναφέρθηκε πριν.

Μέρη μιας εντολής

Στις παραδοσιακές αρχιτεκτονικές, μια εντολή περιλαμβάνει έναν κωδικό (opcode) που ορίζει τη λειτουργία που θα εκτελεστεί, όπως για παράδειγμα "πρόσθεσε περιεχόμενα της μνήμης στον καταχωρητή" και μηδέν ή παραπάνω τελεστέους (operand), που μπορεί να ορίζουν κάποιον καταχωρητή, θέσεις μνήμης, ή σταθερές. Οι τελεστέοι μπορεί να περιλαμβάνουν τρόπους σχηματισμού διευθύνσεων (addressing modes), οι οποίοι να καθορίζουν τη σημασία τους, ή να βρίσκονται σε σταθερά πεδία.
Στις αρχιτεκτονικές πολύ μεγάλης λέξης εντολής (very long instruction word, VLIW), στις οποίες ανήκουν πολλές αρχιτεκτονικές μικροκώδικα, πολλοί ταυτόχρονοι κωδικοί και τελεστέοι ορίζονται με μια μόνο εντολή.
Κάποια σπάνια σύνολα εντολών δεν έχουν πεδίο κωδικού (όπως οι Transport Triggered Architectures (TTA) ή η εικονική μηχανή της Forth), μόνο τελεστέους. Άλλα ασυνήθιστα σύνολα εντολών χωρίς τελεστέους ("0-operand") δεν έχουν πεδία για τον ορισμό των τελεστέων, όπως κάποιες μηχανές στοίβας, για παράδειγμα η NOSC .

Μήκος εντολής

Το μέγεθος ή μήκος μιας εντολής διαφέρει σημαντικά, από τέσσερα μπιτ σε κάποιους μικροελεγκτές σε εκατοντάδες μπιτ σε κάποια συστήματα VLIW. Οι επεξεργαστές που χρησιμοποιούνται στους προσωπικούς υπολογιστές, στους μεγάλους υπολογιστές (mainframes), και στους υπερυπολογιστές έχουν μεγέθη εντολής που κυμαίνονται από τα 8 μέχρι τα 64 bit (η πιο μεγάλη εντολή του x86 είναι 15 byte, δηλαδή 120 bit). Σε ένα σύνολο εντολών, διαφορετικές εντολές μπορεί να έχουν διαφορετικά μεγέθη. Σε κάποιες αρχιτεκτονικές, ειδικά στις RISC, οι εντολές έχουν σταθερό μήκος, συνήθως ίσο με το μέγεθος λέξης της αρχιτεκτονικής. Σε άλλες αρχιτεκτονικές, οι εντολές έχουν μεταβαλλόμενο μήκος, συνήθως ακέραια πολλαπλάσια του byte ή μισής λέξης (halfword).

Αναπαράσταση

Οι εντολές που αποτελούν ένα πρόγραμμα σπάνια γράφονται με την εσωτερική, αριθμητική τους μορφή. Ο προγραμματιστής συνήθως τις γράφει χρησιμοποιώντας συμβολική γλώσσα (assembly) ή, συχνότερα, παράγονται αυτόματα από έναν μεταγλωττιστή.

Σχεδίαση

Η σχεδίαση ενός συνόλου εντολών είναι πολύπλοκο θέμα. Στην ιστορία των μικροεπεξεργαστών συναντώνται δύο προσεγγίσεις. Η πρώτη ήταν η CISC (Complex Instruction Set Computer), η οποία είχε πολλές διαφορετικές εντολές. Κατά τη δεκαετία του 1970 όμως, εταιρείες όπως η IBM βρήκαν μετά από έρευνα ότι πολλές εντολές του συνόλου εντολών μπορούσαν να παραλειφθούν. Το αποτέλεσμα ήταν η αρχιτεκτονική RISC (Reduced Instruction Set Computer), η οποία χρησιμοποιεί μικρότερο σύνολο εντολών. Ένα απλούστερο σύνολο εντολών μπορεί να προσφέρει υψηλότερες ταχύτητες, μικρότερο μέγεθος μικροεπεξεργαστή και μειωμένη κατανάλωση ενέργειας. Ένα πιο πολύπλοκο σύνολο εντολών όμως μπορεί να εκτελεί αποδοτικά συχνές λειτουργίες, να εκμεταλλεύεται καλύτερα την μνήμη και την κρυφή μνήμη (cache) ή να απλοποιεί τον προγραμματισμό.
Κάποιοι σχεδιαστές συνόλων εντολών διατηρούν κάποιους κωδικούς εντολών για κλήσεις συστήματος ή διακοπές λογισμικού. Για παράδειγμα ο MOS Technology 6502 χρησιμοποιεί την 00H, ο Zilog Z80 χρησιμοποιεί τους οκτώ κωδικούς C7,CF,D7,DF,E7,EF,F7,FFH ενώ ο Motorola 68000 χρησιμοποιεί κωδικούς στο εύρος A000..AFFFH (ο δείκτης H σημαίνει δεκαεξαδικό σύστημα).
Οι εικονικές μηχανές μπορούν να υλοποιηθούν γρήγορα και εύκολα αν ένα σύνολο εντολών ικανοποιεί τις απαιτήσεις εικονικοποίησης των Πόπεκ και Γκόλντμπεργκ (Popek and Goldberg virtualization requirements).
Σε συστήματα με πολλούς επεξεργαστές οι αλγόριθμοι συγχρονισμού χωρίς αναμονή (non-blocking synchronization) είναι πιο εύκολο νε υλοποιηθούν αν το σύνολο εντολών υποστηρίζει κάποια λειτουργία του τύπου «φόρτωσε και αύξησε κατά ένα» ("fetch-and-increment") ή «φόρτωσε συνδεδεμένο/αποθήκευσε συνθήκη» ("load linked/store conditional", "LL/SC") ή «σύγκρινε και αντάλλαξε ατομικά» ("atomic compare and swap").

Πυκνότητα κώδικα

Η μνήμη ήταν ακριβή στις πρώτους υπολογιστές με αποτέλεσμα τα προγράμματα να έπρεπε να είναι όσο πιο μικρά γινόταν ώστε να χωρούν στην περιορισμένη μνήμη και το συνολικό μέγεθος των εντολών που χρειάζονταν για μια λειτουργία, η πυκνότητα κώδικα (code density), ήταν βασικό χαρακτηριστικό κάθε συνόλου εντολών. Οι υπολογιστές με υψηλή πυκνότητα κώδικα είχαν (και ακόμα έχουν) εντολές για την είσοδο σε διαδικασία (procedure entry), επιστροφή με παραμέτρους (parameterized return), δομές επανάληψης (loops) κλπ. (και για αυτό ονομάστηκαν εκ των υστέρων υπολογιστές σύνθετου συνόλου εντολών ή CISC). Συνήθως όμως οι εντολές "CISC" απλά συνδύαζαν μια βασική αριθμητική ή λογική λειτουργία με την προσπέλαση ενός ή περισσότερων τελεστέων στη μνήμη (χρησιμοποιώντας διάφορους τρόπους σχηματισμού διευθύνσεων: άμεσο, έμμεσο, με δείκτη, κλπ.). Κάποιες αρχιτεκτονικές μπορεί να επιτρέπουν δύο ή τρεις τελεστέους (μαζί με το αποτέλεσμα) από τη μνήμη ή μπορούν να εκτελούν λειτουργίες όπως η αυτόματη αύξηση δεικτών στη μνήμη κατά ένα. Τα σύνολα εντολών που υλοποιούνται σε λογισμικό μπορεί να έχουν ακόμα πιο σύνθετες και ισχυρές εντολές.
Οι υπολογιστές περιορισμένου συνόλου εντολών (RISC), αρχικά υλοποιήθηκαν σε μεγάλη κλίμακα στη διάρκεια μιας περιόδου που τα υποσυστήματα μνήμης μεγάλωναν με γρήγορους ρυθμούς και θυσιάζουν την πυκνότητα κώδικα με σκοπό την απλοποίηση των κυκλωμάτων τους, ώστε να μπορούν να έχουν μεγαλύτερη συχνότητα και περισσότερους καταχωρητές και άρα να είναι πιο γρήγοροι. Οι εντολές RISC συχνά εκτελούν μόνο μια λειτουργία, όπως η πρόσθεση καταχωρητών ή η φόρτωση δεδομένων από μια θέση μνήμης σε έναν καταχωρητή ενώ συνήθως χρησιμοποιούν σταθερό μέγεθος εντολής, σε αντίθεση με ένα τυπικό σύνολο εντολών CISC που μπορεί να έχει εντολές μικρότερες από αυτό το σταθερό μήκος. Ο χειρισμός εντολών σταθερού μήκους είναι πιο εύκολος σε σχέση με τις εντολές μεταβλητού μήκους για διάφορους λόγους (για παράδειγμα δεν χρειάζεται να ελεγχθεί αν η εντολή χωράει σε μια γραμμή της κρυφής μνήμης ή αν ευθυγραμμίζεται με το όριο μια σελίδας εικονικής μνήμης), με αποτέλεσμα να είναι πιο εύκολο να βελτιστοποιηθεί για μεγαλύτερη ταχύτητα εκτέλεσης. Όμως, επειδή οι υπολογιστές RISC συνήθως χρειάζονται περισσότερες και μεγαλύτερες εντολές για να υλοποιήσουν μια λειτουργία, κάνουν λιγότερο καλή χρήση της διαμεταγωγής του διαύλου και των κρυφών μνημών.
Οι υπολογιστές μικρού συνόλου εντολών (MISC) είναι μηχανές στοίβας (stack machines), όπου υπάρχουν λίγες εντολές (16-64), με αποτέλεσμα πολλές εντολές να μπορούν να χωρέσουν σε μια λέξη μηχανής. Αυτοί οι επεξεργαστές χρειάζονται λιγότερο πυρίτιο για την υλοποίησή τους και για αυτό μπορούν να υλοποιηθούν σε μορφή FPGA ή πολυπύρηνων (multi-core) επεξεργαστών. Η πυκνότητα κώδικα μοιάζει με αυτήν των RISC και η αυξημένη πυκνότητα εντολών εξισορροπείται από το γεγονός ότι χρειάζονται περισσότερες εντολές για μια λειτουργία.
Έχει γίνει επίσης έρευνα πάνω στην συμπίεση εκτελέσιμων (executable compression) για τη βελτίωση της πυκνότητας κώδικας. Η μαθηματική θεωρία της πολυπλοκότητα Κολμογκόροβ (Kolmogorov complexity) περιγράφει τα ανοιχτά προβλήματα και τους περιορισμούς αυτής της προσέγγισης.

Κατάλογος αρχιτεκτονικών συνόλου εντολών

Ο κατάλογος που ακολουθεί δεν είναι πλήρης, καθώς εξακολουθεί η ανάπτυξη των παλιών αρχιτεκτονικών και δημιουργούνται νέες αρχιτεκτονικές. Πολλοί μικροεπεξεργαστές και μικροελεγκτές που είναι διαθέσιμοι στην αγορά υλοποιούν αρχιτεκτονικές συνόλου εντολών. Σε κάποιες εφαρμογές είναι συχνές και οι εξειδικευμένες αρχιτεκτονικές συνόλου εντολών, όπως στα ASIC, στα FPGA και στο πεδίο του reconfigurable computing.