Remove ads
From Wikipedia, the free encyclopedia
Στον προγραμματισμό υπολογιστών, ένας τύπος δεδομένων (data type) είναι μία κατηγοριοποίηση που προσδιορίζει διαφορετικούς τύπους από δεδομένα, όπως κινητής υποδιαστολής (floating-point), ακεραίους (integer), ή τύπους δεδομένων αλήθειας (Boolean), η οποία καθορίζει τις πιθανές τιμές για αυτόν τον τύπο, τις λειτουργίες που μπορούν να επιτελεστούν σε τιμές αυτού του τύπου, την σημασία των δεδομένων και τον τρόπο που οι τιμές αυτού του τύπου μπορούν να αποθηκευτούν.[1][2] Οι τύποι δεδομένων χρησιμοποιούνται μέσα σε συστήματα τύπων (type systems), τα οποία προσφέρουν διάφορους τρόπους για τον ορισμό, την υλοποίηση και την χρήση τους. Διαφορετικά συστήματα τύπων εξασφαλίζουν διαφορετικούς βαθμούς ασφάλειας τύπων (type safety). Τυπικά, ένας τύπος μπορεί να οριστεί ως "οποιαδήποτε ιδιότητα ενός προγράμματος την οποία μπορούμε να προσδιορίσουμε πριν την εκτέλεση του προγράμματος".[3]
Σχεδόν όλες οι γλώσσες προγραμματισμού περιλαμβάνουν ρητά την έννοια του τύπου δεδομένων, παρόλο που διαφορετικές γλώσσες μπορεί να χρησιμοποιούν διαφορετική ορολογία. Οι συνήθεις τύποι δεδομένων είναι:
Για παράδειγμα, στην γλώσσα προγραμματισμού 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, η μηχανή και η γλώσσα μηχανής ως επί το πλείστον δεν χρειάζεται να διακρίνουν τους μη προσημασμένους από τους προσημασμένους τύπους δεδομένων.
Υπάρχει ένα συγκεκριμένο σύνολο εντολών αριθμητικών πράξεων, οι οποίες χρησιμοποιούν διαφορετική ερμηνεία των bit μίας λέξης σαν έναν αριθμό κινητής υποδιαστολής.
Οι τύποι δεδομένων μηχανής είναι αναγκαίο να εκτίθενται ή είναι διαθέσιμοι σε συστήματα ή χαμηλού επιπέδου γλώσσες προγραμματισμού ώστε να επιτρέπουν τον ευέλικτο έλεγχο του υλικού (hardware). Η γλώσσα προγραμματισμού C για παράδειγμα είναι εφοδιασμένη με τύπους δεδομένων διαφόρων μεγεθών, όπως ο short
και ο long
. Αν ένας αντίστοιχος εγγενής (native) τύπος δεν υπάρχει στην πλατφόρμα στόχο, ο μεταγλωττιστής θα τον "σπάσει" σε κώδικα που χρησιμοποιεί τύπους που υπάρχουν. Για παράδειγμα, αν ζητείται ένας ακέραιος των 32 bit σε μία πλατφόρμα των 16 bit, ο μεταγλωττιστής θα τον αντιμετωπίσει σιωπηρά ως έναν πίνακα από δύο ακεραίους των 16 bit.
Πολλές γλώσσες επιτρέπουν δυαδικά και δεκαεξαδικά λεκτικά (literals), για τον εύκολο χειρισμό δεδομένων μηχανής.
Σε υψηλότερου επιπέδου προγραμματισμό, οι τύποι δεδομένων μηχανής είναι συνήθως κρυμμένοι ή αφηρημένοι (abstracted) ως μία λεπτομέρεια της υλοποίησης που θα καθιστούσε τον κώδικα λιγότερο μεταφέρσιμο αν ήταν φανερή στον χρήστη. Για παράδειγμα, μπορεί να παρέχεται ένας γενικευμένος αριθμητικός τύπος αντί ενός τύπου συγκεκριμένου μεγέθους.
Ο τύπος δεδομένων αληθείας αναπαριστά τις τιμές: αληθές και ψευδές. Παρότι μόνο δύο τιμές είναι πιθανές, σπάνια αναπαρίστανται στους υπολογιστές με ένα μόνο δυαδικό ψηφίο για λόγους αποδοτικότητας. Πολλές γλώσσες προγραμματισμού δεν είναι εφοδιασμένες με ρητό τύπο αληθείας. Αντί αυτού ερμηνεύουν το 0 (για παράδειγμα) ως ψευδές και τις υπόλοιπες τιμές ως αληθείς.
Κάποια παραδείγματα αριθμητικών τύπων δεδομένων είναι:
unsigned
στην γλώσσα C και C++). Μπορεί επίσης να έχει έναν μικρό αριθμό από προκαθορισμένους υποτύπους (όπως ο short
και ο long
στην C/C++) ή να επιτρέπουν στους χρήστες να ορίσουν ελεύθερα υποτμήματα όπως το 1..12 (για παράδειγμα οι Pascal/Ada).Όπως:
Οι χαρακτήρες και οι συμβολοσειρές αποθηκεύουν ακολουθίες από ένα σύνολο χαρακτήρων (character sets) όπως ο κώδικας ASCII. Επειδή τα περισσότερα σύνολα χαρακτήρων περιλαμβάνουν και τα ψηφία, είναι δυνατό να έχουμε μία αριθμητική συμβολοσειρά, όπως η "1234"
. Ωστόσο πολλές γλώσσες θεωρούν ότι ανήκει σε διαφορετικό τύπο από τον αυτόν της αριθμητικής τιμής 1234
.
Οι τύποι των χαρακτήρων και των συμβολοσειρών μπορεί να έχουν διαφορετικούς υποτύπους σύμφωνα με το απαιτούμενο "μέγεθος" του χαρακτήρα. Ο αρχικός κώδικας ASCII μεγέθους 7-bit αποδείχθηκε ανεπαρκής και αντικαταστάθηκε από 8 και 16-bit σύνολα χαρακτήρων, τα οποία μπορούν να κωδικοποιήσουν ένα ευρύ φάσμα από μη λατινικά αλφάβητα (Εβραϊκά, Κινέζικα) και άλλα σύμβολα.
Οι συμβολοσειρές μπορεί να είναι σταθερού είτε επεκτατού μεγέθους, ακόμα και μέσα στην ίδια γλώσσα. Μπορεί να έχουν υποτύπους ανάλογα με το μέγιστο μέγεθός τους.
Σημείωση: οι συμβολοσειρές δεν είναι πρωταρχικοί τύποι σε όλες τις γλώσσες. Για παράδειγμα στην C αποτελούνται από πίνακες (arrays) χαρακτήρων.
Οι απαριθμήσεις. Αυτές έχουν τιμές που διαφέρουν μεταξύ τους, οι οποίες μπορούν να συγκριθούν και να ανατεθούν, αλλά δεν έχουν απαραίτητα κάποια συγκεκριμένη αναπαράσταση στην μνήμη του υπολογιστή. Οι μεταγλωττιστές και οι διερμηνευτές τις αναπαριστούν αυθαίρετα. Για παράδειγμα, τα τέσσερα χαρτιά σε μία τράπουλα θα μπορούσαν να είναι τέσσερις απαριθμητές με ονόματα ΣΠΑΘΙ, ΚΑΡΩ, ΜΠΑΣΤΟΥΝΙ, ΚΟΥΠΑ, που θα ανήκουν σε μία απαρίθμηση με όνομα τράπουλα. Αν η μεταβλητή V δηλωθεί να έχει τράπουλα για τύπο, μπορούμε να αναθέσουμε οποιαδήποτε από αυτές τις τιμές σε αυτή την μεταβλητή. Κάποιες υλοποιήσεις επιτρέπουν στον προγραμματιστή να αναθέσει ακέραιες τιμές στις τιμές απαρίθμησης, ή ακόμα και να τις αντιμετωπίζει ως τυπικά ισοδύναμες (type-equivalent) με τους ακεραίους.
Οι επαγόμενοι τύποι μπορούν να βασίζονται, ή να προέρχονται από τους βασικούς τύπους που εξηγήθηκαν παραπάνω.
Σε κάποια γλώσσα σαν την C, οι συναρτήσεις (functions) έχουν τύπο που προέρχεται από τον τύπο της τιμής επιστροφής (return value) τους.
Ο βασικότερος μη σύνθετος επαγόμενος τύπος είναι ο δείκτης, ένας τύπος δεδομένων του οποίου η τιμή αναφέρεται ευθέως σε (ή "δείχνει σε") μία άλλη τιμή η οποία είναι αποθηκευμένη κάπου αλλού στην μνήμη του υπολογιστή χρησιμοποιώντας την διεύθυνση μνήμης της. Είναι μία πρωταρχική μορφή αναφοράς. (Σε καθημερινή ορολογία, ένας αριθμός σελίδας σε ένα βιβλίο θα μπορούσε να θεωρηθεί ένα κομμάτι δεδομένων που αναφέρεται σε ένα άλλο). Οι δείκτες αποθηκεύονται συχνά σε μία μορφή παρόμοια με έναν ακέραιο. Ωστόσο, στην προσπάθειά μας να δούμε τα περιεχόμενα που δείχνει ένας δείκτης (dereference) του οποίου η τιμή δεν είναι κάποια έγκυρη διεύθυνση μνήμης το πρόγραμμα θα μπορούσε να τερματιστεί βίαια (crash). Για την βελτίωση αυτού του πιθανού προβλήματος, οι δείκτες θεωρούνται διαφορετικού τύπου από τον τύπο των δεδομένων που δείχνουν, ακόμα και αν η υποκείμενη αναπαράσταση είναι η ίδια.
Οι σύνθετοι τύποι παράγονται από περισσότερους από έναν πρωταρχικούς τύπους. Αυτό μπορεί να γίνει με πολλούς τρόπους. Οι διαφορετικοί τρόποι με τους οποίους μπορούμε να τους συνδυάσουμε ονομάζονται δομές δεδομένων. Η κατασκευή ενός σύνθετου τύπου από πρωταρχικούς τύπους οδηγεί στη δημιουργία ενός νέου τύπου, για παράδειγμα ο τύπος πίνακας-ακεραίων είναι διαφορετικός τύπος από τον τύπο ακέραιος.
Πολλοί άλλοι σύνθετοι τύποι είναι δυνατοί, αλλά τείνουν να είναι περαιτέρω παραλλαγές και συνθέσεις των παραπάνω.
Κάθε τύπος που δεν περιλαμβάνει κάποια υλοποίηση είναι ένας αφηρημένος τύπος δεδομένων. Για παράδειγμα, μία στοίβα (η οποία είναι ένας αφηρημένος τύπος δεδομένων) μπορεί να υλοποιηθεί με έναν πίνακα (ένα συνεχές κομμάτι μνήμης που περιέχει πολλαπλές τιμές), ή με μία συνδεδεμένη λίστα (ένα σύνολο από μη συνεχόμενα κομμάτια μνήμης που συνδέονται με δείκτες).
Οι αφηρημένοι τύποι δεδομένων μπορούν να χειριστούν από κώδικα που δεν γνωρίζει ή "ενδιαφέρεται" για τους τύπους που περιέχονται σε αυτούς. Ο προγραμματισμός που δεν γνωρίζει τους υποκείμενους συγκεκριμένους τύπους που θα χρησιμοποιηθούν ονομάζεται γενικευμένος προγραμματισμός. Οι πίνακες και οι εγγραφές μπορεί να περιέχουν επίσης υποκείμενους τύπους, αλλά θεωρούνται συγκεκριμένοι επειδή προσδιορίζουν το πως τα περιεχόμενα ή τα στοιχεία τους αποθηκεύονται στην μνήμη.
Παραδείγματα:
Για ευκολία, πολλές γλώσσες προγραμματισμού υψηλού επιπέδου είναι εφοδιασμένες με χρήσιμους στην πράξη τύπους, όπως για παράδειγμα χρονικές, ημερολογιακές και νομισματικές τιμές, ακόμα και στις περιπτώσεις που η γλώσσα επιτρέπει την κατασκευή τους από πρωταρχικούς τύπους.
Ένα σύστημα τύπων συσχετίζει τύπους με κάθε υπολογισμένη τιμή. Εξετάζοντας την ροή αυτών των τιμών, ένα σύστημα τύπων προσπαθεί να αποδείξει ότι δεν μπορούν να συμβούν σφάλματα τύπων. Το εν λόγω σύστημα τύπων καθορίζει τι αποτελεί ένα σφάλμα τύπου, αλλά τα συστήματα τύπων προσπαθούν γενικά να εγγυηθούν ότι λειτουργίες που αναμένουν ένα συγκεκριμένο είδος τιμών δεν χρησιμοποιούνται σε τιμές για τις οποίες αυτές δεν έχουν νόημα.
Ένας μεταγλωττιστής ενδέχεται να χρησιμοποιήσει τον στατικό τύπο μιας τιμής για να βελτιστοποιήσει την αποθήκευση που χρειάζεται και την επιλογή των αλγορίθμων για λειτουργίες πάνω στην τιμή. Σε πολλούς μεταγλωττιστές της γλώσσας προγραμματισμού C ο τύπος δεδομένων float, για παράδειγμα, αναπαρίσταται με 32 bit, σύμφωνα με το πρότυπο της IEEE για αριθμούς κινητής υποδιαστολής απλής ακρίβειας. Έτσι θα χρησιμοποιήσουν εντολές του μικροεπεξεργαστή ειδικές για αριθμούς κινητής υποδιαστολής πάνω σε αυτές τις τιμές (πρόσθεση κινητής υποδιαστολής, πολλαπλασιασμό, κτλ).
Το βάθος των περιορισμών των τύπων και ο τρόπος αποτίμησής τους επηρεάζουν την τυποποίηση (typing) της γλώσσας. Μία γλώσσα προγραμματισμού μπορεί να συσχετίσει περαιτέρω μία λειτουργία με διαφορετικούς συγκεκριμένους αλγορίθμους για κάθε τύπο στην περίπτωση του πολυμορφισμού υποτύπων. Θεωρία τύπων είναι η μελέτη των συστημάτων τύπων, μολονότι τα συγκεκριμένα (concrete) συστήματα τύπων γλωσσών προγραμματισμού προέρχονται από πρακτικά θέματα αρχιτεκτονικής υπολογιστών, υλοποίησης μεταγλωττιστών και σχεδιασμού γλωσσών.
Τα συστήματα τύπων μπορεί να είναι στατικά ή δυναμικά, αυστηρά ή ασθενή κτλ.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.