Τύπος δεδομένων

Στον προγραμματισμό υπολογιστών, ένας τύπος δεδομένων (data type) είναι μία κατηγοριοποίηση που προσδιορίζει διαφορετικούς τύπους από δεδομένα, όπως κινητής υποδιαστολής (floating-point), ακεραίους (integer), ή τύπους δεδομένων αλήθειας (Boolean), η οποία καθορίζει τις πιθανές τιμές για αυτόν τον τύπο, τις λειτουργίες που μπορούν να επιτελεστούν σε τιμές αυτού του τύπου, την σημασία των δεδομένων και τον τρόπο που οι τιμές αυτού του τύπου μπορούν να αποθηκευτούν. Οι τύποι δεδομένων χρησιμοποιούνται μέσα σε συστήματα τύπων (type systems), τα οποία προσφέρουν διάφορους τρόπους για τον ορισμό, την υλοποίηση και την χρήση τους. Διαφορετικά συστήματα τύπων εξασφαλίζουν διαφορετικούς βαθμούς ασφάλειας τύπων (type safety). Τυπικά, ένας τύπος μπορεί να οριστεί ως "οποιαδήποτε ιδιότητα ενός προγράμματος την οποία μπορούμε να προσδιορίσουμε πριν την εκτέλεση του προγράμματος".

 Σχεδόν όλες οι γλώσσες προγραμματισμού περιλαμβάνουν ρητά την έννοια του τύπου δεδομένων, παρόλο που διαφορετικές γλώσσες μπορεί να χρησιμοποιούν διαφορετική ορολογία. Οι συνήθεις τύποι δεδομένων είναι: ακέραιοι (integers), τύποι δεδομένων αληθείας (booleans), χαρακτήρες (characters), κινητής υποδιαστολής (floating-point numbers), αλφαριθμητικές συμβολοσειρές (strings).Για παράδειγμα, στην γλώσσα προγραμματισμού Java, ο τύπος "int" αναπαριστά το σύνολο των 32-bit ακεραίων του οποίου οι τιμές ανήκουν στο διάστημα από -2,147,483,648 έως 2,147,483,647, όπως και τις λειτουργίες που μπορούν να εφαρμοστούν πάνω σε ακέραιους, όπως η πρόσθεση, η αφαίρεση και ο πολλαπλασιασμός. Τα χρώματα αφετέρου αναπαρίστανται από τρία bytes που υποδηλώνουν την ποσότητα από κόκκινο, πράσινο και μπλε, και μία συμβολοσειρά που αναπαριστά το όνομα του χρώματος. Οι επιτρεπτές λειτουργίες περιλαμβάνουν πρόσθεση και αφαίρεση, αλλά όχι πολλαπλασιασμό. Οι περισσότερες γλώσσες προγραμματισμού επιτρέπουν επίσης στον προγραμματιστή να ορίσει επιπλέον τύπους δεδομένων, συνήθως συνδυάζοντας πολλαπλά στοιχεία από άλλους τύπους και ορίζοντας τις έγκυρες λειτουργίες του νέου τύπου δεδομένων. Για παράδειγμα, ένας προγραμματιστής μπορεί να δημιουργήσει έναν καινούργιο τύπο δεδομένων που θα ονομάζεται "μιγαδικός αριθμός", ο οποίος θα περιλάμβανε πραγματικά και φανταστικά μέρη. Ένας τύπος δεδομένων αναπαριστά επίσης έναν περιορισμό στην ερμηνεία των δεδομένων σε ένα σύστημα τύπων, περιγράφοντας την αναπαράσταση, την ερμηνεία και την δομή των τιμών ή αντικειμένων που αποθηκεύονται στην μνήμη του υπολογιστή. Το σύστημα τύπων χρησιμοποιεί την πληροφορία του τύπου δεδομένων για να ελέγξει την ορθότητα των προγραμμάτων τα οποία έχουν πρόσβαση ή χειρίζονται τα δεδομένα. Όλα τα δεδομένα στους υπολογιστές που βασίζονται σε ψηφιακά ηλεκτρονικά κυκλώματα αναπαρίστανται ως bit (εναλλακτικές 0 και 1) στο πιο χαμηλό επίπεδο. Η μικρότερη μονάδα δεδομένων που μπορεί να διευθυνσιοδοτηθεί είναι συνήθως μια ομάδα από bit που αποκαλούνται byte (συνήθως μία οκτάδα (octet), που είναι 8 bit). Η μονάδα που μπορεί να επεξεργαστεί από εντολές γλώσσας μηχανής ονομάζεται λέξη (word) (η οποία από το 2011 είναι τυπικά 32 ή 64 bit). Οι περισσότερες εντολές ερμηνεύουν την λέξη ως έναν δυαδικό αριθμό, έτσι ώστε ένας 32 bit αριθμός να μπορεί να αναπαραστήσει μη προσημασμένες ακέραιες τιμές από 0 έως 2 32 − 1 {\displaystyle 2^{32}-1} ή προσημασμένες ακέραιες τιμές από − 2 31 {\displaystyle -2^{31}} έως 2 31 − 1 {\displaystyle 2^{31}-1} . Λόγω του συμπληρώματος ως προς 2, η μηχανή και η γλώσσα μηχανής ως επί το πλείστον δεν χρειάζεται να διακρίνουν τους μη προσημασμένους από τους προσημασμένους τύπους δεδομένων. Υπάρχει ένα συγκεκριμένο σύνολο εντολών αριθμητικών πράξεων, οι οποίες χρησιμοποιούν διαφορετική ερμηνεία των bit μίας λέξης σαν έναν αριθμό κινητής υποδιαστολής. Οι τύποι δεδομένων μηχανής είναι αναγκαίο να εκτίθενται ή είναι διαθέσιμοι σε συστήματα ή χαμηλού επιπέδου γλώσσες προγραμματισμού ώστε να επιτρέπουν τον ευέλικτο έλεγχο του υλικού (hardware). Η γλώσσα προγραμματισμού C για παράδειγμα είναι εφοδιασμένη με τύπους δεδομένων διαφόρων μεγεθών, όπως ο short και ο long. Αν ένας αντίστοιχος εγγενής (native) τύπος δεν υπάρχει στην πλατφόρμα στόχο, ο μεταγλωττιστής θα τον "σπάσει" σε κώδικα που χρησιμοποιεί τύπους που υπάρχουν. Για παράδειγμα, αν ζητείται ένας ακέραιος των 32 bit σε μία πλατφόρμα των 16 bit, ο μεταγλωττιστής θα τον αντιμετωπίσει σιωπηρά ως έναν πίνακα από δύο ακεραίους των 16 bit. Πολλές γλώσσες επιτρέπουν δυαδικά και δεκαεξαδικά λεκτικά (literals), για τον εύκολο χειρισμό δεδομένων μηχανής. Σε υψηλότερου επιπέδου προγραμματισμό, οι τύποι δεδομένων μηχανής είναι συνήθως κρυμμένοι ή αφηρημένοι (abstracted) ως μία λεπτομέρεια της υλοποίησης που θα καθιστούσε τον κώδικα λιγότερο μεταφέρσιμο αν ήταν φανερή στον χρήστη. Για παράδειγμα, μπορεί να παρέχεται ένας γενικευμένος αριθμητικός τύπος αντί ενός τύπου συγκεκριμένου μεγέθους. Κύριο: Τύπος δεδομένων αλήθειαςΟ τύπος δεδομένων αληθείας αναπαριστά τις τιμές: αληθές και ψευδές. Παρότι μόνο δύο τιμές είναι πιθανές, σπάνια αναπαρίστανται στους υπολογιστές με ένα μόνο δυαδικό ψηφίο για λόγους αποδοτικότητας. Πολλές γλώσσες προγραμματισμού δεν είναι εφοδιασμένες με ρητό τύπο αληθείας. Αντί αυτού ερμηνεύουν το 0 (για παράδειγμα) ως ψευδές και τις υπόλοιπες τιμές ως αληθείς. Κάποια παραδείγματα αριθμητικών τύπων δεδομένων είναι: Ο ακέραιος (integer) τύπος δεδομένων, ή ολόκληρος αριθμός. Μπορεί να έχει υποτύπους ανάλογα με την ικανότητά τους να συμπεριλαμβάνουν αρνητικές τιμές (για παράδειγμα unsigned στην γλώσσα C και C++). Μπορεί επίσης να έχει έναν μικρό αριθμό από προκαθορισμένους υποτύπους (όπως ο short και ο long στην C/C++) ή να επιτρέπουν στους χρήστες να ορίσουν ελεύθερα υποτμήματα όπως το 1..12 (για παράδειγμα οι Pascal/Ada). Ο τύπος δεδομένων κινητής υποδιαστολής (floating point), ο οποίος αποκαλείται κάποιες φορές παραπλανητικά πραγματικός, περιέχει κλασματικές τιμές. Συνήθως έχουν προκαθορισμένα όρια στην μέγιστη τιμή τους και την ακρίβειά τους. Ο τύπος δεδομένων σταθερής υποδιαστολής (fixed point), που προσφέρεται για την αναπαράσταση νομισματικών τιμών. Συνήθως αναπαρίσταται εσωτερικά ως ακέραιος, γεγονός που οδηγεί σε προκαθορισμένες τιμές. Ο αριθμητικός τύπος μεγάλων αριθμών (Bignum) ή αριθμών μεταβλητής ακρίβειας (arbitrary precision) που δεν έχουν προκαθορισμένη ακρίβεια. Δεν είναι πρωταρχικοί τύποι και χρησιμοποιούνται με φειδώ για λόγους αποδοτικότητας. Όπως: Αλφαριθμητικός χαρακτήρας (alphanumeric character). Ένα γράμμα της αλφαβήτου, ένα ψηφίο, ένα κενό, ένα σημείο στίξης κτλ. Αλφαριθμητική συμβολοσειρά (string), δηλαδή μία ακολουθία χαρακτήρων. Χρησιμοποιούνται συνήθως για να αναπαραστήσουν λέξεις ή κείμενο.Οι χαρακτήρες και οι συμβολοσειρές αποθηκεύουν ακολουθίες από ένα σύνολο χαρακτήρων (character sets) όπως ο κώδικας ASCII. Επειδή τα περισσότερα σύνολα χαρακτήρων περιλαμβάνουν και τα ψηφία, είναι δυνατό να έχουμε μία αριθμητική συμβολοσειρά, όπως η "1234". Ωστόσο πολλές γλώσσες θεωρούν ότι ανήκει σε διαφορετικό τύπο από τον αυτόν της αριθμητικής τιμής 1234. Οι τύποι των χαρακτήρων και των συμβολοσειρών μπορεί να έχουν διαφορετικούς υποτύπους σύμφωνα με το απαιτούμενο "μέγεθος" του χαρακτήρα. Ο αρχικός κώδικας ASCII μεγέθους 7-bit αποδείχθηκε ανεπαρκής και αντικαταστάθηκε από 8 και 16-bit σύνολα χαρακτήρων, τα οποία μπορούν να κωδικοποιήσουν ένα ευρύ φάσμα από μη λατινικά αλφάβητα (Εβραϊκά, Κινέζικα) και άλλα σύμβολα. Οι συμβολοσειρές μπορεί να είναι σταθερού είτε επεκτατού μεγέθους, ακόμα και μέσα στην ίδια γλώσσα. Μπορεί να έχουν υποτύπους ανάλογα με το μέγιστο μέγεθός τους. Σημείωση: οι συμβολοσειρές δεν είναι πρωταρχικοί τύποι σε όλες τις γλώσσες. Για παράδειγμα στην C αποτελούνται από πίνακες (arrays) χαρακτήρων. Οι απαριθμήσεις. Αυτές έχουν τιμές που διαφέρουν μεταξύ τους, οι οποίες μπορούν να συγκριθούν και να ανατεθούν, αλλά δεν έχουν απαραίτητα κάποια συγκεκριμένη αναπαράσταση στην μνήμη του υπολογιστή. Οι μεταγλωττιστές και οι διερμηνευτές τις αναπαριστούν αυθαίρετα. Για παράδειγμα, τα τέσσερα χαρτιά σε μία τράπουλα θα μπορούσαν να είναι τέσσερις απαριθμητές με ονόματα ΣΠΑΘΙ, ΚΑΡΩ, ΜΠΑΣΤΟΥΝΙ, ΚΟΥΠΑ, που θα ανήκουν σε μία απαρίθμηση με όνομα τράπουλα. Αν η μεταβλητή V δηλωθεί να έχει τράπουλα για τύπο, μπορούμε να αναθέσουμε οποιαδήποτε από αυτές τις τιμές σε αυτή την μεταβλητή. Κάποιες υλοποιήσεις επιτρέπουν στον προγραμματιστή να αναθέσει ακέραιες τιμές στις τιμές απαρίθμησης, ή ακόμα και να τις αντιμετωπίζει ως τυπικά ισοδύναμες (type-equivalent) με τους ακεραίους. Οι επαγόμενοι τύποι μπορούν να βασίζονται, ή να προέρχονται από τους βασικούς τύπους που εξηγήθηκαν παραπάνω. Σε κάποια γλώσσα σαν την C, οι συναρτήσεις (functions) έχουν τύπο που προέρχεται από τον τύπο της τιμής επιστροφής (return value) τους. Δείκτες και Αναφορές Δείτε επίσης: Δείκτης (πληροφορική), Αναφορά (επιστήμη υπολογιστών)Ο βασικότερος μη σύνθετος επαγόμενος τύπος είναι ο δείκτης, ένας τύπος δεδομένων του οποίου η τιμή αναφέρεται ευθέως σε (ή "δείχνει σε") μία άλλη τιμή η οποία είναι αποθηκευμένη κάπου αλλού στην μνήμη του υπολογιστή χρησιμοποιώντας την διεύθυνση μνήμης της. Είναι μία πρωταρχική μορφή αναφοράς. (Σε καθημερινή ορολογία, ένας αριθμός σελίδας σε ένα βιβλίο θα μπορούσε να θεωρηθεί ένα κομμάτι δεδομένων που αναφέρεται σε ένα άλλο). Οι δείκτες αποθηκεύονται συχνά σε μία μορφή παρόμοια με έναν ακέραιο. Ωστόσο, στην προσπάθειά μας να δούμε τα περιεχόμενα που δείχνει ένας δείκτης (dereference) του οποίου η τιμή δεν είναι κάποια έγκυρη διεύθυνση μνήμης το πρόγραμμα θα μπορούσε να τερματιστεί βίαια (crash). Για την βελτίωση αυτού του πιθανού προβλήματος, οι δείκτες θεωρούνται διαφορετικού τύπου από τον τύπο των δεδομένων που δείχνουν, ακόμα και αν η υποκείμενη αναπαράσταση είναι η ίδια. Σύνθετοι τύποι Οι σύνθετοι τύποι παράγονται από περισσότερους από έναν πρωταρχικούς τύπους. Αυτό μπορεί να γίνει με πολλούς τρόπους. Οι διαφορετικοί τρόποι με τους οποίους μπορούμε να τους συνδυάσουμε ονομάζονται δομές δεδομένων. Η κατασκευή ενός σύνθετου τύπου από πρωταρχικούς τύπους οδηγεί στη δημιουργία ενός νέου τύπου, για παράδειγμα ο τύπος πίνακας-ακεραίων είναι διαφορετικός τύπος από τον τύπο ακέραιος. Ένας πίνακας (array) αποθηκεύει έναν αριθμό από στοιχεία ιδίου τύπου σε μία συγκεκριμένη σειρά. Προσπελαύνονται χρησιμοποιώντας έναν ακέραιο για να δείξουμε ποιο στοιχείο απαιτείται (παρόλο που τα στοιχεία μπορεί να είναι οποιουδήποτε σχεδόν τύπου). Οι πίνακες μπορεί να είναι σταθερού μεγέθους ή επεκτάσιμοι. Εγγραφή (επίσης γνωστή ως δυάδα (tuple) ή δομή (struct)). Οι εγγραφές είναι από τις απλούστερες δομές δεδομένων. Μία εγγραφή είναι μία τιμή που περιέχει άλλες τιμές, συνήθως με σταθερό πλήθος και σειρά και δεικτοδοτημένες με ονόματα. Τα στοιχεία μίας εγγραφής αποκαλούνται συνήθως πεδία ή μέλη. Ένωση. Μία δήλωση τύπου ένωσης καθορίζει ποιοι από ένα πλήθος πρωταρχικών τύπων θα αποθηκευτούν στα στιγμιότυπά του, για παράδειγμα "float ή long integer". Σε σύγκριση με μία εγγραφή, η οποία θα μπορούσε να περιέχει μία τιμή κινητής υποδιαστολής και έναν ακέραιο, η ένωση περιέχει μόνο μία από τις δύο τιμές κάθε φορά. Η ένωση με ετικέτα (γνωστή και ως παραλλαγή (variant), παραλλαγμένη εγγραφή (variant record), διακεκριμένη ένωση (discriminated union), ή διαχωρισμένη ένωση (disjoint union)) περιέχει ένα επιπλέον πεδίο το οποίο υποδεικνύει τον τρέχοντα τύπο, για περισσότερη ασφάλεια τύπων. Το σύνολο είναι ένας αφηρημένος τύπος δεδομένων που μπορεί να αποθηκεύει συγκεκριμένες τιμές, χωρίς κάποια συγκεκριμένη διάταξη και χωρίς επαναλαμβανόμενες τιμές. Οι τιμές δεν ανακτώνται από το σύνολο, αλλά ο προγραμματιστής μπορεί να ρωτήσει το κατά πόσο μία τιμή περιέχεται στο σύνολο, παίρνοντας ως απάντηση ένα λογικό "ναι" ή "όχι". Ένα αντικείμενο περιέχει έναν αριθμό από πεδία δεδομένων, όπως οι εγγραφές, και έναν αριθμό από κομμάτια κώδικα για να την προσπέλασή τους και την τροποποίησή τους. Οι δομές δεδομένων που δεν περιέχουν κώδικα, όπως οι παραπάνω, ονομάζονται απλές δομές δεδομένων (plain old data structures).Πολλοί άλλοι σύνθετοι τύποι είναι δυνατοί, αλλά τείνουν να είναι περαιτέρω παραλλαγές και συνθέσεις των παραπάνω. Κύριο: Αφηρημένος τύπος δεδομένωνΚάθε τύπος που δεν περιλαμβάνει κάποια υλοποίηση είναι ένας αφηρημένος τύπος δεδομένων. Για παράδειγμα, μία στοίβα (η οποία είναι ένας αφηρημένος τύπος δεδομένων) μπορεί να υλοποιηθεί με έναν πίνακα (ένα συνεχές κομμάτι μνήμης που περιέχει πολλαπλές τιμές), ή με μία συνδεδεμένη λίστα (ένα σύνολο από μη συνεχόμενα κομμάτια μνήμης που συνδέονται με δείκτες). Οι αφηρημένοι τύποι δεδομένων μπορούν να χειριστούν από κώδικα που δεν γνωρίζει ή "ενδιαφέρεται" για τους τύπους που περιέχονται σε αυτούς. Ο προγραμματισμός που δεν γνωρίζει τους υποκείμενους συγκεκριμένους τύπους που θα χρησιμοποιηθούν ονομάζεται γενικευμένος προγραμματισμός. Οι πίνακες και οι εγγραφές μπορεί να περιέχουν επίσης υποκείμενους τύπους, αλλά θεωρούνται συγκεκριμένοι επειδή προσδιορίζουν το πως τα περιεχόμενα ή τα στοιχεία τους αποθηκεύονται στην μνήμη. Παραδείγματα: Ένας έξυπνος δείκτης (smart pointer) είναι το αφηρημένο αντίστοιχο του δείκτη. Και οι δύο είναι ήδη αναφορών. Ένας πίνακας κατακερματισμού (hash table) ή λεξικό (dictionary) ή χάρτης/συσχετιστικός πίνακας (map/associative array) είναι μία πιο ευέλικτη παραλλαγή της εγγραφής, στην οποία ζευγάρια κλειδιού-τιμής μπορούν να εισαχθούν και να διαγραφούν ελεύθερα. Σε μία ουρά (queue) όποιος εισέλθει πρώτος εξέρχεται πρώτος. Παραλλαγές είναι η δύο-άκρων ουρά (deque) και η ουρά προτεραιότητας (priority queue). Ένα σύνολο (set) μπορεί να αποθηκεύει συγκεκριμένες τιμές, χωρίς κάποια συγκεκριμένη διάταξη και χωρίς επαναλαμβανόμενες τιμές. Σε μία στοίβα (stack) όποιος εισέλθει τελευταίος εξέρχεται πρώτος. Ένα δέντρο (tree) είναι μία ιεραρχική δενδρική δομή. Γράφος (graph). Για ευκολία, πολλές γλώσσες προγραμματισμού υψηλού επιπέδου είναι εφοδιασμένες με χρήσιμους στην πράξη τύπους, όπως για παράδειγμα χρονικές, ημερολογιακές και νομισματικές τιμές, ακόμα και στις περιπτώσεις που η γλώσσα επιτρέπει την κατασκευή τους από πρωταρχικούς τύπους. Ένα σύστημα τύπων συσχετίζει τύπους με κάθε υπολογισμένη τιμή. Εξετάζοντας την ροή αυτών των τιμών, ένα σύστημα τύπων προσπαθεί να αποδείξει ότι δεν μπορούν να συμβούν σφάλματα τύπων. Το εν λόγω σύστημα τύπων καθορίζει τι αποτελεί ένα σφάλμα τύπου, αλλά τα συστήματα τύπων προσπαθούν γενικά να εγγυηθούν ότι λειτουργίες που αναμένουν ένα συγκεκριμένο είδος τιμών δεν χρησιμοποιούνται σε τιμές για τις οποίες αυτές δεν έχουν νόημα. Ένας μεταγλωττιστής ενδέχεται να χρησιμοποιήσει τον στατικό τύπο μιας τιμής για να βελτιστοποιήσει την αποθήκευση που χρειάζεται και την επιλογή των αλγορίθμων για λειτουργίες πάνω στην τιμή. Σε πολλούς μεταγλωττιστές της γλώσσας προγραμματισμού C ο τύπος δεδομένων float, για παράδειγμα, αναπαρίσταται με 32 bit, σύμφωνα με το πρότυπο της IEEE για αριθμούς κινητής υποδιαστολής απλής ακρίβειας. Έτσι θα χρησιμοποιήσουν εντολές του μικροεπεξεργαστή ειδικές για αριθμούς κινητής υποδιαστολής πάνω σε αυτές τις τιμές (πρόσθεση κινητής υποδιαστολής, πολλαπλασιασμό, κτλ). Το βάθος των περιορισμών των τύπων και ο τρόπος αποτίμησής τους επηρεάζουν την τυποποίηση (typing) της γλώσσας. Μία γλώσσα προγραμματισμού μπορεί να συσχετίσει περαιτέρω μία λειτουργία με διαφορετικούς συγκεκριμένους αλγορίθμους για κάθε τύπο στην περίπτωση του πολυμορφισμού υποτύπων. Θεωρία τύπων είναι η μελέτη των συστημάτων τύπων, μολονότι τα συγκεκριμένα (concrete) συστήματα τύπων γλωσσών προγραμματισμού προέρχονται από πρακτικά θέματα αρχιτεκτονικής υπολογιστών, υλοποίησης μεταγλωττιστών και σχεδιασμού γλωσσών. Τα συστήματα τύπων μπορεί να είναι στατικά ή δυναμικά, αυστηρά ή ασθενή κτλ. Λεξικό δεδομένων Συναρτησιακός προγραμματισμός Είδος Θεωρία τύπων για μαθηματικά μοντέλα τύπων Σύστημα τύπων για διαφορετικές επιλογές στο σύστημα τύπων γλωσσών προγραμματισμού Luca Cardelli, Peter Wegner. On Understanding Types, Data Abstraction, and Polymorphism, [1] Αρχειοθετήθηκε 2006-06-19 στο Wayback Machine. from Computing Surveys, (December, 1985) Various Data Types in C