Καταχωρητής

Στη μηχανική υπολογιστών, ο καταχωρητής είναι τύπος μικρής αλλά πολύ γρήγορης μνήμης που βρίσκεται μέσα στο τσιπ του επεξεργαστή. Η μνήμη αυτή χρησιμοποιείται για την βελτίωση της ταχύτητας εκτέλεσης των διαφόρων προγραμμάτων, αφού σε αυτήν συνήθως αποθηκεύονται δεδομένα που χρησιμοποιούνται συνέχεια από τα προγράμματα. Στην περίπτωση αυτή ο καταχωρητής παρέχει πολύ γρήγορη πρόσβαση σε αυτά τα δεδομένα και έτσι το πρόγραμμα εκτελείται πιο γρήγορα. Οι περισσότεροι από τους σύγχρονους ηλεκτρονικούς υπολογιστές λειτουργούν σύμφωνα με την εξής λογική: μεταφέρουν δεδομένα από την κεντρική μνήμη στους καταχωρητές, κάνουν τις διάφορες πράξεις πάνω στα δεδομένα και στην συνέχεια μεταφέρουν το αποτέλεσμα από τους καταχωρητές πίσω στην κύρια μνήμη. Η τεχνική αυτή ονομάζεται load-store architecture.
Η ΚΜΕ περιέχει πολλούς καταχωρητές, από τους οποίους άλλοι είναι γενικής χρήσης, ενώ άλλοι επιτελούν μια συγκεκριμένη λειτουργία (καταχωρητές ειδικής χρήσης). Οι σημαντικότεροι από τους καταχωρητές ειδικής χρήσης είναι ο μετρητής προγράμματος (Program Counter, PC) και ο καταχωρητής εντολών (Instruction Register, IR). Ο μετρητής προγράμματος δείχνει την επόμενη εντολή που πρόκειται να εκτελεστεί, ενώ ο καταχωρητής εντολών περιέχει την εντολή που εκτελείται εκείνη τη στιγμή.
Η μνήμη ενός ηλεκτρονικού υπολογιστή μπορεί να διαταχθεί σε μορφή πυραμίδας. Τα κατώτερα στρώματα της πυραμίδας προσφέρουν μεγαλύτερη αλλά πιο αργή μνήμη. Αντιθέτως, τα ανώτερα στρώματα της πυραμίδας προσφέρουν μικρότερη μνήμη, η οποία είναι πολύ πιο γρήγορη, αλλά και ακριβότερη. Το κατώτατο στρώμα της πυραμίδας είναι οι μαγνητικές ταινίες και ανεβαίνοντας προς τα πάνω συναντά κανείς τους USB Flash δίσκους, τα CD-ROM ή DVD-ROM, τους σκληρούς δίσκους, την κύρια μνήμη RAM, την μνήμη L3 / L2 / L1 Cache του επεξεργαστή και τέλος τους καταχωρητές. Άρα λοιπόν οι καταχωρητές βρίσκονται στην κορυφή της πυραμίδας και προσφέρουν την πιο γρήγορη μνήμη που υπάρχει. Δυστυχώς όμως το μέγεθος της μνήμης αυτής είναι πολύ μικρό και περιορισμένο.

Η δήλωση register στη C

Οι προγραμματιστές μπορούν να επηρεάσουν σημαντικά την ταχύτητα εκτέλεσης του προγράμματός τους εάν επιλέξουν να τοποθετήσουν στους καταχωρητές τις μεταβλητές που χρησιμοποιούνται συχνά στο πρόγραμμα. Η επιλογή αυτή γίνεται για παράδειγμα στη C εάν πριν από το όνομα και τον τύπο της μεταβλητής χρησιμοποιηθεί η δεσμευμένη λέξη register. Σημεία του προγράμματος που μπορεί να επιτευχθεί σημαντική βελτίωση είναι βρόχοι for που χρειάζεται να εκτελεστούν πολλές φορές. Ως παράδειγμα παρατίθεται ο παρακάτω κώδικας σε C:
#include <stdio.h>
 
int main(){
    for (int i=0; i<5000; i++)
    {
        printf("%d\n", i);
    }
    return 0;}
Το παραπάνω πρόγραμμα τυπώνει τους αριθμούς από το 0 έως το 4999. Η ταχύτητα του προγράμματος μπορεί να βελτιωθεί λίγο εάν ο προγραμματιστής επιλέξει να αποθηκεύσει την μεταβλητή i σε έναν καταχωρητή. Η επιλογή αυτή είναι πολύ καλή, δεδομένου ότι η μεταβλητή i θα χρειαστεί να διαβαστεί και γραφεί 5000 φορές. Κατά συνέπεια ο παρακάτω κώδικας είναι μία βελτίωση του προηγούμενου.
#include <stdio.h>
 
int main(){
    for (register int i=0; i<5000; i++)
    {
        printf("%d\n", i);
    }
    return 0;}
Στην πράξη οι σύγχρονοι μεταγλωττιστές της C διαθέτουν εξελιγμένους αλγόριθμους δέσμευσης των καταχωρητών (register allocation) που συνήθως μπορούν να βρουν καλύτερα από τον προγραμματιστή ποιες μεταβλητές πρέπει να κρατιούνται σε καταχωρητές. Έτσι πολλοί μεταγλωττιστές της C είτε αγνοούν τη δήλωση register, είτε τη θεωρούν απλά κάποια επιπλέον πληροφορία που μπορεί να λάβει υπόψη του ο αλγόριθμος δέσμευσης καταχωρητών.