(Translated by https://www.hiragana.jp/)
Σύστημα τύπων - Βικιπαίδεια

Σしぐまτたうηいーたνにゅー επιστήμη υπολογιστών, ως σύστημα τύπων (type system) μπορεί νにゅーαあるふぁ οριστεί ένα διαχειρίσιμο συντακτικό πλαίσιο γがんまιいおたαあるふぁ τたうηいーたνにゅー κατάταξη φράσεων ανάλογα μみゅーεいぷしろん τις τιμές πぱいοおみくろんυうぷしろん υπολογίζουν.[1] Ένα σύστημα τύπων αποδίδει τύπους (types) σしぐまεいぷしろん κάθε υπολογισμένη τιμή. Εξετάζοντας τたうηいーた ροή αυτών τたうωおめがνにゅー τιμών, ένα σύστημα τύπων πρέπει νにゅーαあるふぁ αποδείξει ότι δでるたεいぷしろんνにゅー πρόκειται νにゅーαあるふぁ συμβούν σφάλματα τύπων (type errors). Αあるふぁνにゅー κかっぱαあるふぁιいおた κάθε διαφορετικό σύστημα τύπων ορίζει τたうιいおた αποτελεί σφάλμα τύπου, γενικά ένα σύστημα τύπων προσπαθεί νにゅーαあるふぁ εξασφαλίσει ότι λειτουργίες πぱいοおみくろんυうぷしろん δέχονται τιμές συγκεκριμένου είδους δでるたεいぷしろん χρησιμοποιούνται μみゅーεいぷしろん τιμές πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー πρέπει.

Ένας μεταγλωττιστής μπορεί νにゅーαあるふぁ χρησιμοποιήσει τたうοおみくろん στατικό τύπο μιας τιμής γがんまιいおたαあるふぁ νにゅーαあるふぁ βελτιστοποιήσει τたうοおみくろんνにゅー τρόπο μみゅーεいぷしろん τたうοおみくろんνにゅー οποίο αυτή θしーたαあるふぁ αποθηκευθεί κかっぱαあるふぁιいおた τたうιいおた αλγόριθμοι μπορούν νにゅーαあるふぁ χρησιμοποιηθούν σしぐまεいぷしろん αυτή. Γがんまιいおたαあるふぁ παράδειγμα, σしぐまεいぷしろん πολλούς μεταγλωττιστές της C, οおみくろん τύπος δεδομένων "αριθμός κινητής υποδιαστολής" ("float") αναπαρίσταται από 32 bits, σύμφωνα μみゅーεいぷしろん τたうοおみくろん πρότυπο κινητής υποδιαστολής απλής ακρίβειας κατά IEEE. Σしぐまεいぷしろん αυτήν τたうηいーたνにゅー περίπτωση ηいーた C χρησιμοποιεί λειτουργίες ειδικά γがんまιいおたαあるふぁ αριθμούς κινητής υποδιαστολής σしぐまεいぷしろん αυτές τις τιμές (πρόσθεση αριθμών κινητής υποδιαστολής, πολλαπλασιασμός, κかっぱλらむだπぱい).

Τたうοおみくろん πόσο λεπτομερείς είναι οおみくろんιいおた περιορισμοί τたうωおめがνにゅー τύπων κかっぱαあるふぁιいおた οおみくろん τρόπος μみゅーεいぷしろん τたうοおみくろんνにゅー οποίο αποτιμώνται επηρεάζει τたうηいーたνにゅー τυποποίηση (typing) μιας γλώσσας. Μみゅーιいおたαあるふぁ γλώσσα προγραμματισμού μπορεί επιπλέον νにゅーαあるふぁ αντιστοιχίζει λειτουργίες διαφορετικές υλοποιήσεις αλγορίθμων σしぐまεいぷしろん διαφορετικούς τύπους σしぐまτたうηいーたνにゅー περίπτωση τたうοおみくろんυうぷしろん πολυμορφισμού τύπων (type polymorphism). Θεωρία τύπων (type theory) είναι ηいーた μελέτη τたうωおめがνにゅー συστημάτων τύπων, αあるふぁνにゅー κかっぱαあるふぁιいおた σημαντικό μέρος τたうωおめがνにゅー συστημάτων τύπων πぱいοおみくろんυうぷしろん χρησιμοποιούνται σしぐまτたうηいーたνにゅー πράξη προέρχονται από έρευνα σしぐまτたうηいーたνにゅー αρχιτεκτονική υπολογιστών, τたうηいーたνにゅー υλοποίηση μεταγλωττιστών κかっぱαあるふぁιいおた τたうηいーた σχεδίαση γλωσσών.

Βασικές έννοιες

Επεξεργασία

Ηいーた αντιστοίχιση τύπων σしぐまεいぷしろん δεδομένα (τυποποίηση) δίνει σημασία σしぐまεいぷしろん ακολουθίες από bits. Οおみくろんιいおた τύποι συνήθως αντιστοιχίζονται σしぐまεいぷしろん τιμές σしぐまτたうηいーた μνήμη ή σしぐまεいぷしろん αντικείμενα όπως οおみくろんιいおた μεταβλητές. Επειδή κάθε τιμή αποτελείται από μみゅーιいおたαあるふぁ ακολουθία bits σしぐまεいぷしろん έναν υπολογιστή, τたうοおみくろん υλικό δでるたεいぷしろん μπορεί νにゅーαあるふぁ ξεχωρίσει μεταξύ διευθύνσεων μνήμης, εντολών, χαρακτήρων, ακεραίων κかっぱαあるふぁιいおた αριθμών κινητής υποδιαστολής. Αあるふぁνにゅー σしぐまεいぷしろん μみゅーιいおたαあるふぁ ακολουθία από bits όμως αποδοθεί κάποιος τύπος, τότε αυτό αποτελεί πληροφορία προς τたうαあるふぁ προγράμματα κかっぱαあるふぁιいおた τους προγραμματιστές γがんまιいおたαあるふぁ τたうοおみくろん τたうιいおた σημαίνει αυτή ηいーた ακολουθία.

Σημαντικές λειτουργίες τたうωおめがνにゅー συστημάτων τύπων περιλαμβάνουν:

  • ΑσφάλειαΗいーた χρήση τたうωおめがνにゅー τύπων μπορεί νにゅーαあるふぁ επιτρέψει σしぐまεいぷしろん ένα μεταγλωττιστή νにゅーαあるふぁ εντοπίσει ακατάλληλο κώδικα. Γがんまιいおたαあるふぁ παράδειγμα, ηいーた έκφραση 3 / "Hello, World" μπορεί νにゅーαあるふぁ θεωρηθεί μみゅーηいーた έγκυρη γιατί οおみくろんιいおた κανόνες της αριθμητικής δでるたεいぷしろんνにゅー ορίζουν πώς διαιρείται ένας ακέραιος μみゅーεいぷしろん μみゅーιいおたαあるふぁ συμβολοσειρά. Όπως αναπτύσσεται παρακάτω, ηいーた ισχυρή τυποποίηση (strong typing) προσφέρει μεγαλύτερη ασφάλεια αλλά συνήθως όχι πλήρως (δείτε ασφάλεια τύπων γがんまιいおたαあるふぁ περισσότερες πληροφορίες).
  • ΒελτιστοποίησηΟおみくろん στατικός έλεγχος τύπων μπορεί νにゅーαあるふぁ παρέχει χρήσιμες πληροφορίες σしぐまτたうοおみくろん χρόνο μεταγλώττισης. Γがんまιいおたαあるふぁ παράδειγμα, αあるふぁνにゅー ένας τύπος απαιτεί μみゅーιいおたαあるふぁ τιμή νにゅーαあるふぁ στοιχίζεται σしぐまεいぷしろん διευθύνσεις μνήμης πぱいοおみくろんυうぷしろん είναι πολλαπλάσια τたうωおめがνにゅー 4 bytes, οおみくろん μεταγλωττιστής θしーたαあるふぁ πρέπει νにゅーαあるふぁ μπορεί νにゅーαあるふぁ κάνει χρήση πぱいιいおたοおみくろん αποδοτικών εντολών.
  • ΤεκμηρίωσηΣしぐまτたうαあるふぁ πぱいιいおたοおみくろん εκφραστικά συστήματα τύπων, οおみくろんιいおた τύποι μπορούν νにゅーαあるふぁ είναι χρήσιμοι σしぐまαあるふぁνにゅー μみゅーιいおたαあるふぁ μορφή τεκμηρίωσης, μιας κかっぱαあるふぁιいおた φανερώνουν τις προθέσεις τたうοおみくろんυうぷしろん προγραμματιστή. Γがんまιいおたαあるふぁ παράδειγμα, οおみくろんιいおた ημερομηνίες (timestamps) μπορούν νにゅーαあるふぁ αναπαρασταθούν σしぐまαあるふぁνにゅー ακέραιοι — αあるふぁνにゅー όμως οおみくろん προγραμματιστής δηλώσει ότι μみゅーιいおたαあるふぁ συνάρτηση επιστρέφει ημερομηνία αντί απλά ακέραιο, αυτό αποτελεί μέρος της τεκμηρίωσης της συνάρτησης.
  • Αφαίρεση (abstraction) ή modularityΟおみくろんιいおた τύποι επιτρέπουν στους προγραμματιστές νにゅーαあるふぁ σκέφτονται τたうαあるふぁ προγράμματά τους σしぐまεいぷしろん ένα ανώτερο επίπεδο από τたうαあるふぁ bits ή τたうαあるふぁ bytes, χωρίς νにゅーαあるふぁ χρειάζεται νにゅーαあるふぁ ασχοληθούν μみゅーεいぷしろん τたうηいーたνにゅー υλοποίηση σしぐまεいぷしろん χαμηλό επίπεδο. Γがんまιいおたαあるふぁ παράδειγμα, μみゅーιいおたαあるふぁ συμβολοσειρά μπορεί νにゅーαあるふぁ θεωρηθεί σしぐまαあるふぁνにゅー μみゅーιいおたαあるふぁ συλλογή από χαρακτήρες, αντί ενός απλού πίνακα από bytes. Οおみくろんιいおた τύποι μπορούν επίσης νにゅーαあるふぁ εκφράσουν τたうηいーた διαπροσωπεία (interface) ανάμεσα σしぐまεいぷしろん δύο υποσυστήματα. Αυτό βοηθά σしぐまτたうοおみくろんνにゅー εντοπισμό τたうωおめがνにゅー ορισμών πぱいοおみくろんυうぷしろん χρειάζονται γがんまιいおたαあるふぁ νにゅーαあるふぁ επικοινωνήσουν δύο υποσυστήματα κかっぱαあるふぁιいおた αποκλείει σφάλματα σしぐまτたうοおみくろんνにゅー τρόπο πぱいοおみくろんυうぷしろん γίνεται ηいーた επικοινωνία τους.

Ηいーた ασφάλεια τύπων προσφέρει ορθότητα προγράμματος αλλά όχι πλήρως (αλλιώς οおみくろん έλεγχος τύπων γίνεται μみゅーηいーた υπολογίσιμο πρόβλημα). Ανάλογα μみゅーεいぷしろん τたうοおみくろん σύστημα τύπων, ένα πρόγραμμα μπορεί νにゅーαあるふぁ δίνει λάθος αποτέλεσμα ενώ έχει τους σωστούς τύπους κかっぱαあるふぁιいおた δでるたεいぷしろんνにゅー προκαλεί σφάλματα μεταγλώττισης. Γがんまιいおたαあるふぁ παράδειγμα ηいーた διαίρεση μみゅーεいぷしろん τたうοおみくろん μηδέν δでるたεいぷしろんνにゅー εντοπίζεται από τたうοおみくろんνにゅー ελεγκτή τύπων στις περισσότερες γλώσσες προγραμματισμού αλλά αποτελεί σφάλμα χρόνου εκτέλεσης (runtime error). Ηいーた απόδειξη της έλλειψης σφαλμάτων διασφαλίζεται συχνά από ένα σύνολο τυπικών μεθόδων (formal methods), γνωστές συνολικά μみゅーεいぷしろん τたうοおみくろんνにゅー όρο ανάλυση προγράμματος, καθώς κかっぱαあるふぁιいおた από τις δοκιμές λογισμικού (software testing), μみゅーιいおたαあるふぁ συχνά χρησιμοποιούμενη εμπειρική μέθοδο γがんまιいおたαあるふぁ τたうοおみくろんνにゅー εντοπισμό λαθών πぱいοおみくろんυうぷしろん δでるたεいぷしろん μπορεί νにゅーαあるふぁ βべーたρろーεいぷしろんιいおた οおみくろん ελεγκτής τύπων.

Ένα πρόγραμμα συνήθως αντιστοιχίζει σしぐまεいぷしろん κάθε τιμή κάποιον τύπο (κかっぱαあるふぁιいおた ένας τύπος μπορείς νにゅーαあるふぁ έχει έναν ή περισσότερους υποτύπους, subtypes). Επίσης, τたうαあるふぁ αντικείμενα, οおみくろんιいおた μονάδες (modules), τたうαあるふぁ κανάλια επικοινωνίας (communication channels), οおみくろんιいおた εξαρτήσεις (dependencies), ακόμα κかっぱαあるふぁιいおた οおみくろんιいおた ίδιοι οおみくろんιいおた τύποι μπορούν νにゅーαあるふぁ έχουν κάποιον τύπο. Ανάλογα μみゅーεいぷしろん τたうηいーたνにゅー υλοποίηση υπάρχουν κかっぱαあるふぁιいおた οおみくろんιいおた εξής χαρακτηρισμοί (πぱいοおみくろんυうぷしろん όμως τεχνικά αποτελούν διαφορετικές ιδέες):

  • τύπος δεδομένων (data type) – οおみくろん τύπος μιας τιμής
  • κλάση (class) – οおみくろん τύπος ενός αντικειμένου
  • kindοおみくろん τύπος ενός τύπου

Ένα σύστημα τύπων (type system), κάποιας γλώσσας προγραμματισμού, ελέγχει τたうοおみくろんνにゅー τρόπο μみゅーεいぷしろん τたうοおみくろんνにゅー οποίο μπορούν νにゅーαあるふぁ συμπεριφέρονται τたうαあるふぁ τυποποιημένα προγράμματα κかっぱαあるふぁιいおた θεωρεί μみゅーηいーた έγκυρη τたうηいーた συμπεριφορά έξω από αυτούς τους κανόνες. Ένα effect system συνήθως παρέχει λεπτομερέστερο έλεγχο από ένα σύστημα τύπων.

Τυπικά ηいーた θεωρία τύπων μελετά τたうαあるふぁ συστήματα τύπων. Πολυπλοκότερα συστήματα τύπων (όπως οおみくろんιいおた εξαρτώμενοι τύποι, dependent types) επιτρέπουν τたうηいーたνにゅー επαλήθευση λεπτομερών προδιαγραφών προγραμμάτων από έναν ελεγκτή τύπων αλλά αυτό έχει τたうοおみくろん μειονέκτημα ότι ηいーた εξαγωγή τύπων κかっぱαあるふぁιいおた άλλες ιδιότητες γενικά γίνονται μみゅーηいーた-υπολογίσιμες, ενώ οおみくろん έλεγχος τύπων εξαρτάται από αποδείξεις πぱいοおみくろんυうぷしろん δίνονται από τたうοおみくろん χρήστη. Αποτελεί σημαντική πρόκληση ηいーた εύρεση ενός αρκετά εκφραστικού συστήματος τύπων πぱいοおみくろんυうぷしろん νにゅーαあるふぁ ικανοποιεί προγραμματιστικές πρακτικές μみゅーεいぷしろん τυπικά ασφαλή τρόπο.[2]

Έλεγχος τύπων

Επεξεργασία

Ηいーた επαλήθευση κかっぱαあるふぁιいおた ηいーた εφαρμογή τたうωおめがνにゅー περιορισμών τたうωおめがνにゅー τύπων - έλεγχος τύπων (type checking) – μπορεί νにゅーαあるふぁ συμβεί είτε σしぐまτたうοおみくろん χρόνο μεταγλώττισης (στατικός έλεγχος), είτε σしぐまτたうοおみくろん χρόνο εκτέλεσης (δυναμικός έλεγχος). Αあるふぁνにゅー οおみくろん ορισμός μιας γλώσσας απαιτεί ισχυρούς κανόνες τύπων (συνήθως επιτρέποντας μόνο αυτόματες μετατροπές τύπων πぱいοおみくろんυうぷしろん δでるたεいぷしろん χάνουν πληροφορία), αυτή μπορεί νにゅーαあるふぁ ονομαστεί ισχυρά τυποποιήσιμη (strongly typed), σしぐまεいぷしろん αντίθετη περίπτωση, ασθενώς τυποποιήσιμη (weakly typed). Οおみくろんιいおた όροι αυτοί δでるたεいぷしろん χρησιμοποιούνται μみゅーεいぷしろん αυστηρό τρόπο.

Στατικοί τύποι

Επεξεργασία

Μみゅーιいおたαあるふぁ γλώσσα προγραμματισμού λέγεται ότι χρησιμοποιεί στατικούς τύπους όταν οおみくろん έλεγχος τύπων γίνεται κατά τたうηいーた διάρκεια τたうοおみくろんυうぷしろん χρόνου μεταγλώττισης αντί τたうοおみくろんυうぷしろん χρόνου εκτέλεσης. Οおみくろんιいおた γλώσσες μみゅーεいぷしろん στατικούς τύπους περιλαμβάνουν τたうηいーたνにゅー Ada, τたうηいーたνにゅー ActionScript 3, τたうηいーた C, τたうηいーた C++, τたうηいーた C#, τたうηいーたνにゅー Eiffel, τたうηいーたνにゅー F#, τたうηいーた Go, τたうηいーた JADE, τたうηいーた Java, τたうηいーた Fortran, τたうηいーた Haskell, τたうηいーたνにゅー ML, τたうηいーたνにゅー Objective-C, τたうηいーたνにゅー Pascal, τたうηいーたνにゅー Perl (πぱいοおみくろんυうぷしろん διακρίνει μεταξύ βαθμωτών τιμών (scalars), πινάκων, πινάκων κατακερματισμού κかっぱαあるふぁιいおた υπορουτινών) κかっぱαあるふぁιいおた τたうηいーた Scala. Επειδή οおみくろん στατικός έλεγχος είναι μみゅーιいおたαあるふぁ περιορισμένη μορφή επαλήθευσης προγράμματος (program verification) (βべーたλらむだ. ασφάλεια τύπων), επιτρέπει σしぐまεいぷしろん πολλά σφάλματα τύπων νにゅーαあるふぁ εντοπίζονται νωρίς κατά τたうηいーた διάρκεια τたうοおみくろんυうぷしろん κύκλου της ανάπτυξης τたうοおみくろんυうぷしろん λογισμικού. Οおみくろんιいおた στατικοί ελεγκτές τύπων εκτιμούν μόνο τたうηいーたνにゅー πληροφορία πぱいοおみくろんυうぷしろん μπορούν νにゅーαあるふぁ προσδιορίσουν σしぐまτたうοおみくろん χρόνο μεταγλώττισης αλλά μπορούν νにゅーαあるふぁ επαληθεύσουν ότι οおみくろんιいおた συνθήκες πぱいοおみくろんυうぷしろん ελέγχονται ισχύουν γがんまιいおたαあるふぁ όλες τις πιθανές εκτελέσεις τたうοおみくろんυうぷしろん προγράμματος, μみゅーεいぷしろん αποτέλεσμα νにゅーαあるふぁ μみゅーηいーた χρειάζεται νにゅーαあるふぁ επαναλαμβάνεται οおみくろん έλεγχος τύπων κάθε φορά πぱいοおみくろんυうぷしろん εκτελείται τたうοおみくろん πρόγραμμα. Ηいーた εκτέλεση τたうοおみくろんυうぷしろん προγράμματος μπορεί επίσης νにゅーαあるふぁ γίνει πぱいιいおたοおみくろん αποδοτική (σしぐまεいぷしろん ταχύτητα ή σしぐまεいぷしろん κατανάλωση μνήμης) όταν λείπει οおみくろん έλεγχος τύπων σしぐまτたうοおみくろん χρόνο εκτέλεσης κかっぱαあるふぁιいおた υπάρχουν βελτιστοποιήσεις.

Επειδή αναλύουν πληροφορία σしぐまτたうοおみくろん χρόνο μεταγλώττισης, κかっぱαあるふぁιいおた άρα δでるたεいぷしろんνにゅー έχουν διαθέσιμη πληροφορία τύπων τたうοおみくろんυうぷしろん χρόνου εκτέλεσης, οおみくろんιいおた στατικοί ελεγκτές τύπων είναι συντηρητικοί. Μπορεί νにゅーαあるふぁ απορρίψουν κάποια προγράμματα πぱいοおみくろんυうぷしろん έχουν καλή συμπεριφορά σしぐまτたうοおみくろん χρόνο εκτέλεσης, αλλά δでるたεいぷしろん φαίνεται στατικά ότι έχουν σωστούς τύπους. Γがんまιいおたαあるふぁ παράδειγμα, ακόμα κかっぱαあるふぁιいおた αあるふぁνにゅー ηいーた έκφραση <πολύπλοκη συνθήκη> πάντα αποτιμάται σしぐまεいぷしろん αληθές σしぐまτたうοおみくろん χρόνο εκτέλεσης, ένα πρόγραμμα πぱいοおみくろんυうぷしろん περιέχει τたうοおみくろんνにゅー κώδικα

αあるふぁνにゅー <πολύπλοκη συνθήκη> τότε 42 αλλιώς <σφάλμα τύπου>

θしーたαあるふぁ απορριφθεί ως πρόγραμμα μみゅーεいぷしろん λάθος τύπους, γιατί μみゅーιいおたαあるふぁ στατική ανάλυση δでるたεいぷしろん μπορεί νにゅーαあるふぁ βべーたρろーεいぷしろんιいおた ότι οおみくろん κώδικας σしぐまτたうοおみくろん σκέλος αλλιώς δでるたεいぷしろん θしーたαあるふぁ εκτελεστεί ποτέ.[1] Ηいーた συντηρητική συμπεριφορά τたうωおめがνにゅー στατικών ελεγκτών τύπων αποτελεί πλεονέκτημα όταν ηいーた <πολύπλοκη συνθήκη> αποτιμάται σしぐまεいぷしろん ψευδές σπάνια: ένας στατικός ελεγκτής τύπων μπορεί νにゅーαあるふぁ εντοπίσει σφάλματα τύπων σしぐまεいぷしろん σπάνια χρησιμοποιούμενα μονοπάτια μέσα σしぐまτたうοおみくろんνにゅー κώδικα. Χωρίς τたうοおみくろん στατικό έλεγχο τύπων, ακόμα κかっぱαあるふぁιいおた δοκιμές κάλυψης κώδικα (code coverage) μみゅーεいぷしろん 100% κάλυψη, μπορεί νにゅーαあるふぁ μみゅーηいーた βべーたρろーοおみくろんυうぷしろんνにゅー αυτά τたうαあるふぁ σφάλματα. Οおみくろんιいおた δοκιμές μπορεί νにゅーαあるふぁ μみゅーηいーた τたうαあるふぁ εντοπίσουν γιατί πρέπει νにゅーαあるふぁ ληφθεί υπόψη οおみくろん συνδυασμός όλων τたうωおめがνにゅー σημείων πぱいοおみくろんυうぷしろん δημιουργούνται τιμές κかっぱαあるふぁιいおた όλων τたうωおめがνにゅー σημείων πぱいοおみくろんυうぷしろん μみゅーιいおたαあるふぁ τιμή χρησιμοποιείται.

Οおみくろんιいおた γλώσσες προγραμματισμού μみゅーεいぷしろん στατικούς τύπους πぱいοおみくろんυうぷしろん χρησιμοποιούνται συχνότερα, δでるたεいぷしろんνにゅー είναι επισήμως ασφαλείς ως προς τους τύπους τους (type safe). Περιέχουν "παραθυράκια" ("loopholes") σしぐまτたうοおみくろんνにゅー ορισμό τους, ώστε οおみくろん προγραμματιστής νにゅーαあるふぁ μπορεί νにゅーαあるふぁ γράφει κώδικα πぱいοおみくろんυうぷしろん νにゅーαあるふぁ αποφεύγει τたうηいーたνにゅー επαλήθευση τたうοおみくろんυうぷしろん στατικού ελεγκτη τύπων, γがんまιいおたαあるふぁ νにゅーαあるふぁ λύσει κάποια προβλήματα. Γがんまιいおたαあるふぁ παράδειγμα, οおみくろんιいおた περισσότερες γλώσσες τύπου C έχουν τέτοιες εντολές ("type punning"), ενώ ηいーた Haskell έχει χαρακτηριστικά όπως ηいーた συνάρτηση unsafePerformIO: αυτές οおみくろんιいおた λειτουργίες μπορεί νにゅーαあるふぁ μみゅーηいーたνにゅー είναι ασφαλείς σしぐまτたうοおみくろん χρόνο εκτέλεσης, επειδή δημιουργούν ανεπιθύμητη συμπεριφορά λόγω εσφαλμένων τύπων τたうωおめがνにゅー τιμών όταν εκτελείται τたうοおみくろん πρόγραμμα.

Δυναμικοί τύποι

Επεξεργασία

Μみゅーιいおたαあるふぁ γλώσσα προγραμματισμού λέγεται ότι έχει δυναμικούς τύπους όταν τたうοおみくろん μεγαλύτερο μέρος τたうοおみくろんυうぷしろん ελέγχου τύπων της εκτελείται σしぐまτたうοおみくろん χρόνο εκτέλεσης αντί τたうοおみくろんυうぷしろん χρόνου μεταγλώττισης. Στους δυναμικούς τύπους, οおみくろんιいおた τιμές έχουν τύπους αλλά οおみくろんιいおた μεταβλητές δでるたεいぷしろんνにゅー έχουν μみゅーεいぷしろん αποτέλεσμα μみゅーιいおたαあるふぁ μεταβλητή νにゅーαあるふぁ μπορεί νにゅーαあるふぁ αναφέρεται σしぐまεいぷしろん τιμές κάθε είδους. Οおみくろんιいおた γλώσσες μみゅーεいぷしろん δυναμικούς τύπους περιλαμβάνουν τたうηいーたνにゅー APL, τたうηいーたνにゅー Erlang, τたうηいーた Groovy, τたうηいーた JavaScript, τたうηいーた Lisp, τたうηいーた Lua, αυτές τたうωおめがνにゅー MATLAB/GNU Octave, τたうηいーたνにゅー Perl (όσον αφορά τους τύπου πぱいοおみくろんυうぷしろん ορίζονται από τたうοおみくろん χρήστη αλλά όχι τους ενσωματωμένους), τたうηいーたνにゅー PHP, τたうηいーたνにゅー Prolog, τたうηいーたνにゅー Python, τたうηいーた Ruby, τたうηいーた Smalltalk κかっぱαあるふぁιいおた τたうηいーたνにゅー Tcl. Οおみくろんιいおた δυναμικοί τύποι μπορούν νにゅーαあるふぁ είναι πぱいιいおたοおみくろん ευέλικτοι από τους στατικούς τύπους (πぱい.χかい. επιτρέποντας σしぐまεいぷしろん ένα πρόγραμμα νにゅーαあるふぁ παράγει τύπους κかっぱαあるふぁιいおた λειτουργίες μみゅーεいぷしろん βάση δεδομένα σしぐまτたうοおみくろん χρόνο εκτέλεσης), αλλά εις βάρος λιγότερων εγγυήσεων εいぷしろんκかっぱ τたうωおめがνにゅー προτέρων. Αυτό οφείλεται σしぐまτたうοおみくろん ότι μみゅーιいおたαあるふぁ γλώσσα μみゅーεいぷしろん δυναμικούς τύπους δέχεται κかっぱαあるふぁιいおた προσπαθεί νにゅーαあるふぁ εκτελέσει ορισμένα προγράμματα πぱいοおみくろんυうぷしろん θεωρούνται μみゅーηいーた έγκυρα από τたうοおみくろんνにゅー στατικό ελεγκτή τύπων.

Οおみくろんιいおた δυναμικοί τύποι μπορεί νにゅーαあるふぁ προκαλέσουν σφάλματα τύπων σしぐまτたうοおみくろん χρόνο εκτέλεσης: μみゅーιいおたαあるふぁ τιμή μπορεί νにゅーαあるふぁ έχει τύπο πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー προβλέπεται σしぐまτたうοおみくろん χρόνο εκτέλεσης, κかっぱαあるふぁιいおた νにゅーαあるふぁ πρέπει νにゅーαあるふぁ εκτελεστεί μみゅーιいおたαあるふぁ λειτουργία σしぐまεいぷしろん αυτήν πぱいοおみくろんυうぷしろん νにゅーαあるふぁ μみゅーηいーたνにゅー έχει νόημα. Αυτή ηいーた λειτουργία μπορεί νにゅーαあるふぁ συμβεί σしぐまεいぷしろん σημείο μεταγενέστερο από αυτό σしぐまτたうοおみくろん οποίο έγινε τたうοおみくろん προγραμματιστικό λάθος - εκεί δηλαδή πぱいοおみくろんυうぷしろん δεδομένα λάθος τύπου περάστηκαν σしぐまεいぷしろん κάποιον κώδικα πぱいοおみくろんυうぷしろん δでるたεいぷしろん θしーたαあるふぁ έπρεπε. Αυτό δυσχεραίνει τたうηいーたνにゅー εύρεση τέτοιων σφαλμάτων.

Οおみくろんιいおた έλεγχοι σしぐまτたうοおみくろん χρόνο εκτέλεσης τたうωおめがνにゅー συστημάτων τたうωおめがνにゅー γλωσσών μみゅーεいぷしろん δυναμικούς τύπους μπορούν νにゅーαあるふぁ είναι πぱいιいおたοおみくろん πολύπλοκοι από αυτούς τたうωおめがνにゅー γλωσσών μみゅーεいぷしろん στατικούς τύπους, επειδή μπορούν νにゅーαあるふぁ χρησιμοποιήσουν δυναμική πληροφορία μαζί μみゅーεいぷしろん τたうηいーたνにゅー πληροφορία από τたうοおみくろんνにゅー πηγαίο κώδικα. Από τたうηいーたνにゅー άλλη πλευρά, οおみくろんιいおた έλεγχοι σしぐまτたうοおみくろん χρόνο εκτέλεσης βεβαιώνουν μόνο συνθήκες πぱいοおみくろんυうぷしろん ικανοποιούν μみゅーιいおたαあるふぁ συγκεκριμένη εκτέλεση ενός προγράμματος κかっぱαあるふぁιいおた πρέπει νにゅーαあるふぁ επαναλαμβάνονται γがんまιいおたαあるふぁ κάθε εκτέλεση.

Ηいーた ανάπτυξη λογισμικού σしぐまεいぷしろん γλώσσες μみゅーεいぷしろん δυναμικούς τύπους συχνά υποστηρίζεται από πρακτικές όπως οおみくろん έλεγχος μονάδας (unit testing). Οおみくろんιいおた δοκιμές αποτελούν βασική πρακτική σしぐまτたうηいーたνにゅー επαγγελματική ανάπτυξη λογισμικού κかっぱαあるふぁιいおた είναι ιδιαίτερα σημαντικές σしぐまεいぷしろん γλώσσες μみゅーεいぷしろん δυναμικούς τύπους. Σしぐまτたうηいーたνにゅー πράξη, οおみくろんιいおた δοκιμές μπορούν νにゅーαあるふぁ εντοπίσουν ένα ευρύτερο πεδίο σφαλμάτων σしぐまεいぷしろん σχέση μみゅーεいぷしろん τたうοおみくろん στατικό έλεγχο τύπων αλλά δでるたεいぷしろんνにゅー είναι τたうοおみくろん ίδιο πλήρεις κかっぱαあるふぁιいおた εξαντλητικές.

Συνδυασμοί δυναμικών κかっぱαあるふぁιいおた στατικών τύπων

Επεξεργασία

Ηいーた παρουσία στατικών τύπων σしぐまεいぷしろん μみゅーιいおたαあるふぁ γλώσσα προγραμματισμού δでるたεいぷしろんνにゅー αποκλείει απαραίτητα τους μηχανισμούς τたうωおめがνにゅー δυναμικών τύπων. Σしぐまτたうηいーた Java γがんまιいおたαあるふぁ παράδειγμα, καθώς κかっぱαあるふぁιいおた σしぐまεいぷしろん άλλες αντικειμενοστρεφείς γλώσσες, αあるふぁνにゅー κかっぱαあるふぁιいおた χρησιμοποιούνται οおみくろんιいおた στατικοί τύποι, κάποιες λειτουργίες (downcasting) απαιτούν ελέγχους σしぐまτたうοおみくろん χρόνο εκτέλεσης, μみゅーιいおたαあるふぁ μορφή δυναμικών τύπων.

Κάποιες γλώσσες, όπως ηいーた Clojure, έχουν δυναμικούς τύπους αλλά επιτρέπουν τたうηいーた χρήση ρητών σημειώσεων τύπων (explicit type hints) πぱいοおみくろんυうぷしろん έχουν ως αποτέλεσμα στατικούς τύπους. Ένας πιθανός λόγος πぱいοおみくろんυうぷしろん χρησιμοποιούνται είναι γがんまιいおたαあるふぁ τたうηいーた βελτιστοποίηση κώδικα μみゅーεいぷしろん απαιτήσεις ταχύτητας, μみゅーεいぷしろん βάση τους στατικούς τύπους.

Από τたうηいーたνにゅー έκδοση 4.0, τたうοおみくろん .NET Framework υποστηρίζει μみゅーιいおたαあるふぁ παραλλαγή τたうωおめがνにゅー δυναμικών τύπων μέσω τたうοおみくろんυうぷしろん χώρου ονομάτων System.Dynamic όπου ένα στατικό αντικείμενο (static) τύπου 'δυναμικό' ('dynamic') χρησιμοποιείται ως χώρος πぱいοおみくろんυうぷしろん τたうοおみくろん σύστημα χρόνου εκτέλεσης της πλατφόρμας .NET ρωτά γがんまιいおたαあるふぁ τις δυναμικές δυνατότητές τたうοおみくろんυうぷしろん ώστε νにゅーαあるふぁ επιλύσει μみゅーιいおたαあるふぁ αναφορά σしぐまεいぷしろん κάποιο αντικείμενο.

Στατικός κかっぱαあるふぁιいおた δυναμικός έλεγχος τύπων σしぐまτたうηいーたνにゅー πράξη

Επεξεργασία

Ηいーた απόφαση νにゅーαあるふぁ χρησιμοποιηθούν στατικοί ή δυναμικοί τύποι εξαρτάται από πολλούς παράγοντες, μみゅーεいぷしろん κάποιες αναγκαίες υποχωρήσεις σしぐまεいぷしろん κάθε περίπτωση (trade-offs).

Οおみくろんιいおた στατικοί τύποι μπορούν νにゅーαあるふぁ εντοπίσουν σφάλματα τύπων σしぐまτたうοおみくろん χρόνο μεταγλώττισης, κάτι πぱいοおみくろんυうぷしろん κανονικά κάνει ένα πρόγραμμα πぱいιいおたοおみくろん αξιόπιστο. Όμως, οおみくろんιいおた προγραμματιστές διαφωνούν σχετικά μみゅーεいぷしろん τたうοおみくろん πόσο συχνά συμβαίνουν σφάλματα τύπων κかっぱαあるふぁιいおた πぱいοおみくろんιいおたοおみくろん ποσοστό από τたうαあるふぁ λάθη κατά τたうηいーたνにゅー ανάπτυξη ενός προγράμματος εντοπίζεται μみゅーεいぷしろん τους στατικούς τύπους. Οおみくろんιいおた υποστηρικτές τたうωおめがνにゅー στατικών τύπων πιστεύουν ότι ένα πρόγραμμα είναι πぱいιいおたοおみくろん αξιόπιστο όταν έχει περάσει τたうοおみくろんνにゅー έλεγχο τύπων ενώ οおみくろんιいおた υποστηρικτές τたうωおめがνにゅー δυναμικών τύπων δείχνουν κατανεμημένο κώδικα πぱいοおみくろんυうぷしろん έχει αποδειχτεί αξιόπιστος. Ηいーた ισχύς τたうωおめがνにゅー στατικών τύπων αυξάνεται όσο αυξάνεται κかっぱαあるふぁιいおた ηいーた ισχύς τたうοおみくろんυうぷしろん συστήματος τύπων. Οおみくろんιいおた υποστηρικτές τたうωおめがνにゅー γλωσσών μみゅーεいぷしろん εξαρτώμενους τύπους (dependent types) όπως ηいーた Dependent ML κかっぱαあるふぁιいおた ηいーた Epigram, θεωρούν ότι σχεδόν όλα τたうαあるふぁ σφάλματα μπορούν νにゅーαあるふぁ θεωρηθούν σφάλματα τύπων, αあるふぁνにゅー οおみくろんιいおた τύποι πぱいοおみくろんυうぷしろん χρησιμοποιούνται σしぐまεいぷしろん ένα πρόγραμμα έχουν δηλωθεί σωστά από τたうοおみくろんνにゅー προγραμματιστή ή έχουν εξαχθεί σωστά από τたうοおみくろん μεταγλωττιστή.[3]

Οおみくろんιいおた στατικοί τύποι συνήθως έχουν ως αποτέλεσμα μεταγλωττισμένο κώδικα πぱいοおみくろんυうぷしろん εκτελείται πぱいιいおたοおみくろん γρήγορα. Όταν οおみくろん μεταγλωττιστής γνωρίζει πぱいοおみくろんιいおたοおみくろんιいおた ακριβώς τύποι δεδομένων χρησιμοποιούνται, μπορεί νにゅーαあるふぁ παράγει βελτιστοποιημένο κώδικα. Κάποιες γλώσσες μみゅーεいぷしろん δυναμικούς τύπους όπως ηいーた Common Lisp επιτρέπουν προαιρετικά τたうηいーた δήλωση τύπων γがんまιいおたαあるふぁ τたうηいーた βελτιστοποίηση κατά αυτόν τたうοおみくろんνにゅー τρόπο. Οおみくろんιいおた στατικοί τύποι αποτελούν επομένως τたうηいーた γενίκευση αυτού τたうοおみくろんυうぷしろん φαινομένου σしぐまεいぷしろん όλο τたうοおみくろん εύρος τたうοおみくろんυうぷしろん κώδικα. Βべーたλらむだ. βελτιστοποίηση (optimization).

Αντίθετα, οおみくろんιいおた δυναμικοί τύποι μπορούν νにゅーαあるふぁ επιτρέψουν σしぐまτたうοおみくろん μεταγλωττιστή νにゅーαあるふぁ εκτελείται πぱいιいおたοおみくろん γρήγορα κかっぱαあるふぁιいおた σしぐまτたうοおみくろん διορθωτή νにゅーαあるふぁ φορτώνει δυναμικά νέο κώδικα, επειδή οおみくろんιいおた αλλαγές σしぐまτたうοおみくろんνにゅー πηγαίο κώδικα στις γλώσσες μみゅーεいぷしろん δυναμικούς τύπους έχουν ως αποτέλεσμα λιγότερο περαιτέρω έλεγχο κかっぱαあるふぁιいおた λιγότερο κώδικα γがんまιいおたαあるふぁ επανεξέταση. Κάτι τέτοιο σしぐまεいぷしろん ορισμένες περιπτώσεις μπορεί νにゅーαあるふぁ μικρύνει τたうοおみくろんνにゅー κύκλο διόρθωση-μεταγλώττιση-δοκιμή-αποσφαλμάτωση (edit-compile-test-debug).

Οおみくろんιいおた γλώσσες μみゅーεいぷしろん στατικούς τύπους πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー έχουν εξαγωγή τύπων (όπως ηいーた Java κかっぱαあるふぁιいおた ηいーた C) απαιτούν οおみくろん προγραμματιστής νにゅーαあるふぁ δηλώνει όλους τους τύπους πぱいοおみくろんυうぷしろん πρόκειται νにゅーαあるふぁ χρησιμοποιήσει μみゅーιいおたαあるふぁ μέθοδος ή μみゅーιいおたαあるふぁ συνάρτηση. Αυτό μπορεί νにゅーαあるふぁ αποτελέσει επιπλέον τεκμηρίωση γがんまιいおたαあるふぁ τたうοおみくろん πρόγραμμα, τたうηいーたνにゅー οποία οおみくろん μεταγλωττιστής δでるたεいぷしろんνにゅー επιτρέπει σしぐまτたうοおみくろんνにゅー προγραμματιστή νにゅーαあるふぁ αγνοήσει ή νにゅーαあるふぁ μみゅーηいーたνにゅー αντιστοιχεί σしぐまτたうοおみくろんνにゅー κώδικα. Όμως μみゅーιいおたαあるふぁ γλώσσα μπορεί νにゅーαあるふぁ έχει στατικούς τύπους χωρίς νにゅーαあるふぁ απαιτεί δηλώσεις τύπων (πぱい.χかい. ηいーた Haskell, ηいーた Scala, κかっぱαあるふぁιいおた σしぐまεいぷしろん κάποιο βαθμό ηいーた C#), επομένως αυτό δでるたεいぷしろんνにゅー είναι απαραίτητη συνέπεια τたうωおめがνにゅー στατικών τύπων.

Οおみくろんιいおた δυναμικοί τύποι επιτρέπουν δομές πぱいοおみくろんυうぷしろん οおみくろんιいおた στατικοί τύποι απορρίπτουν ως μみゅーηいーた επιτρεπτές. Γがんまιいおたαあるふぁ παράδειγμα, επιτρέπουν συναρτήσεις τύπου αποτίμησε (eval), πぱいοおみくろんυうぷしろん εκτελούν αυθαίρετα κομμάτια κώδικα. Επιπλέον οおみくろんιいおた δυναμικοί τύποι χειρίζονται καλύτερα κώδικα σしぐまεいぷしろん μεταβατική φάση (transitional code) κかっぱαあるふぁιいおた τたうηいーた γρήγορη ανάπτυξη πρωτοτύπων (prototyping), όπως ηいーた χρήση μιας κενής δομής δεδομένων (ψευδο-αντικείμενο, mock object) σしぐまτたうηいーた θέση μιας πλήρους δομής δεδομένων (συνήθως γがんまιいおたαあるふぁ πειραματισμούς κかっぱαあるふぁιいおた δοκιμές).

Οおみくろんιいおた δυναμικοί τύποι χρησιμοποιούνται σしぐまτたうοおみくろん duck typing πぱいοおみくろんυうぷしろん μπορεί νにゅーαあるふぁ υποστηρίζει ευκολότερη επαναχρησιμοποίηση κώδικα.

Οおみくろんιいおた δυναμικοί τύποι συνήθως διευκολύνουν τたうοおみくろん μεταπρογραμματισμό (metaprogramming). Γがんまιいおたαあるふぁ παράδειγμα, τたうαあるふぁ πρότυπα της C++ (templates) συνήθως είναι δυσκολότερα σしぐまτたうηいーた χρήση από αντίστοιχο κώδικα σしぐまεいぷしろん Ruby ή Python. Πぱいιいおたοおみくろん προχωρημένες δομές χρόνου εκτέλεσης όπως οおみくろんιいおた μετακλάσεις κかっぱαあるふぁιいおた ηいーた ενδοσκόπηση (introspection) συχνά είναι πぱいιいおたοおみくろん δύσχρηστες σしぐまεいぷしろん γλώσσες μみゅーεいぷしろん στατικούς τύπους.

Ισχυροί κかっぱαあるふぁιいおた ασθενείς τύποι

Επεξεργασία

Ένα σύστημα τύπων λέγεται ότι έχει ισχυρούς τύπους (strongly typed) όταν ορίζει έναν ή περισσότερους περιορισμούς σしぐまτたうοおみくろんνにゅー τρόπο πぱいοおみくろんυうぷしろん συνδυάζονται οおみくろんιいおた λειτουργίες πぱいοおみくろんυうぷしろん χρησιμοποιούν τιμές από διαφορετικούς τύπους δεδομένων. Μみゅーιいおたαあるふぁ γλώσσα πぱいοおみくろんυうぷしろん υλοποιεί ισχυρούς τύπους απαγορεύει τたうηいーたνにゅー επιτυχή εκτέλεση μιας λειτουργίας σしぐまεいぷしろん παραμέτρους πぱいοおみくろんυうぷしろん έχουν λάθος τύπο.

Οおみくろんιいおた ασθενείς τύποι (Weak typing) σημαίνουν ότι μみゅーιいおたαあるふぁ γλώσσα έμμεσα μετατρέπει τους τύπους. Έστω τたうοおみくろん εξής παράδειγμα:

var x := 5;    // (1)  (ηいーた x είναι ακέραιος)
var y := "37"; // (2)  (ηいーた y είναι συμβολοσειρά)
x + y;         // (3)  (?)

Σしぐまεいぷしろん μみゅーιいおたαあるふぁ γλώσσα μみゅーεいぷしろん ασθενείς τύπους, τたうοおみくろん αποτέλεσμα της τελευταίας λειτουργίας δでるたεいぷしろんνにゅー είναι ξεκάθαρο. Κάποιες γλώσσες όπως ηいーた Visual Basic, θしーたαあるふぁ παρήγαγαν εκτελέσιμο κώδικα πぱいοおみくろんυうぷしろん όταν εκτελεστεί νにゅーαあるふぁ έχει αποτέλεσμα 42: τたうοおみくろん σύστημα θしーたαあるふぁ μετέτρεπε τたうηいーた συμβολοσειρά "37" σしぐまτたうοおみくろんνにゅー αριθμό 37 ώστε νにゅーαあるふぁ καταφέρει νにゅーαあるふぁ βべーたρろーεいぷしろんιいおた νόημα σしぐまτたうηいーた λειτουργία της πρόσθεσης. Άλλες γλώσσες όπως ηいーた JavaScript θしーたαあるふぁ παρήγαγαν τたうοおみくろん αποτέλεσμα "537": τたうοおみくろん σύστημα θしーたαあるふぁ μετέτρεπε τたうοおみくろんνにゅー αριθμό 5 σしぐまτたうηいーた συμβολοσειρά "5" κかっぱαあるふぁιいおた σしぐまτたうηいーた συνέχεια θしーたαあるふぁ συνένωνε τις δύο συμβολοσειρές. Κかっぱαあるふぁιいおた σしぐまτたうηいーた Visual Basic κかっぱαあるふぁιいおた σしぐまτたうηいーた JavaScript, οおみくろん τύπος τたうοおみくろんυうぷしろん αποτελέσματος ορίζεται από κανόνες πぱいοおみくろんυうぷしろん αφορούν κかっぱαあるふぁιいおた τις δύο παραμέτρους μιας λειτουργίας. Σしぐまεいぷしろん κάποιες γλώσσες όπως ηいーた AppleScript, οおみくろん τύπος της τιμής πぱいοおみくろんυうぷしろん προκύπτει καθορίζεται από τたうοおみくろんνにゅー τύπο της παραμέτρου πぱいοおみくろんυうぷしろん είναι σしぐまτたうαあるふぁ αριστερά της έκφρασης.

Σしぐまτたうηいーた C μみゅーιいおたαあるふぁ μετατροπή (cast) πぱいοおみくろんυうぷしろん αποτυγχάνει δείχνει τたうοおみくろん πρόβλημα πぱいοおみくろんυうぷしろん μπορεί νにゅーαあるふぁ εμφανιστεί αあるふぁνにゅー λείπουν οおみくろんιいおた ισχυροί τύποι - αあるふぁνにゅー οおみくろん προγραμματιστής μετατρέπει μみゅーιいおたαあるふぁ τιμή από έναν τύπο σしぐまεいぷしろん έναν άλλο σしぐまτたうηいーた C, όχι μόνο πρέπει οおみくろん μεταγλωττιστής νにゅーαあるふぁ τたうοおみくろん επιτρέψει σしぐまτたうοおみくろん χρόνο μεταγλώττισης αλλά νにゅーαあるふぁ τたうοおみくろん επιτρέψει κかっぱαあるふぁιいおた τたうοおみくろん ίδιο τたうοおみくろん σύστημα χρόνου εκτέλεσης. Αυτό μπορεί νにゅーαあるふぁ έχει ως αποτέλεσμα μικρότερο κかっぱαあるふぁιいおた γρηγορότερο κώδικα C, αλλά δυσκολεύει τたうηいーたνにゅー αποσφαλμάτωση.

Συστήματα μみゅーεいぷしろん ασφαλείς κかっぱαあるふぁιいおた μみゅーηいーた ασφαλείς τύπους

Επεξεργασία
Κύριο λήμμα: Ασφάλεια τύπων

Ένας τρίτος τρόπος κατηγοριοποίησης τたうοおみくろんυうぷしろん συστήματος τύπων μιας γλώσσας προγραμματισμού βασίζεται σしぐまτたうηいーたνにゅー ασφάλεια τたうωおめがνにゅー λειτουργιών μみゅーεいぷしろん τύπους κかっぱαあるふぁιいおた τたうωおめがνにゅー μετατροπών. Μみゅーιいおたαあるふぁ γλώσσα θεωρείται ότι έχει "ασφαλείς τύπους" ("type-safe") αあるふぁνにゅー δでるたεいぷしろんνにゅー επιτρέπει λειτουργίες ή μετατροπές πぱいοおみくろんυうぷしろん νにゅーαあるふぁ οδηγούν σしぐまεいぷしろん εσφαλμένες καταστάσεις.

Άλλοι όροι πぱいοおみくろんυうぷしろん χρησιμοποιούνται είναι γλώσσα μみゅーεいぷしろん ασφαλή μνήμη (memory-safe language) ή ασφαλής γλώσσα (safe language), πぱいοおみくろんυうぷしろん περιγράφουν γλώσσες πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー επιτρέπουν μみゅーηいーた ορισμένες λειτουργίες. Γがんまιいおたαあるふぁ παράδειγμα, μみゅーιいおたαあるふぁ γλώσσα αυτού τたうοおみくろんυうぷしろん τύπου ελέγχει τたうαあるふぁ όρια τたうωおめがνにゅー πινάκων ή εγγυάται μみゅーεいぷしろん κάποιον άλλο τρόπο στατικά (πぱい.χかい. σしぐまτたうηいーた μεταγλώττιση) ότι ηいーた πρόσβαση εκτός ορίων ενός πίνακα θしーたαあるふぁ προκαλέσει σφάλμα σしぐまτたうοおみくろん χρόνο μεταγλώττισης κかっぱαあるふぁιいおた ίσως κかっぱαあるふぁιいおた σしぐまτたうοおみくろん χρόνο εκτέλεσης.

var x := 5;     // (1)
var y := "37";  // (2)
var z := x + y; // (3)

Σしぐまεいぷしろん γλώσσες όπως ηいーた Visual Basic, ηいーた μεταβλητή z τたうοおみくろんυうぷしろん παραδείγματος παίρνει τたうηいーたνにゅー τιμή 42. Αあるふぁνにゅー κかっぱαあるふぁιいおた οおみくろん προγραμματιστής μπορεί νにゅーαあるふぁ μみゅーηいーたνにゅー ήθελε κάτι τέτοιο, τたうοおみくろん αποτέλεσμα ορίζεται σしぐまτたうηいーた γλώσσα κかっぱαあるふぁιいおた τたうοおみくろん πρόγραμμα δでるたεいぷしろんνにゅー αποτυγχάνει, ούτε δίνει κάποια λάθος τιμή σしぐまτたうηいーた z. Υπό αυτό τたうοおみくろん πρίσμα, τέτοιες γλώσσες έχουν ασφαλείς τύπους - αあるふぁνにゅー όμως ηいーた τιμή της y ήταν μみゅーιいおたαあるふぁ συμβολοσειρά πぱいοおみくろんυうぷしろん δでるたεいぷしろん μπορεί νにゅーαあるふぁ μετατραπεί σしぐまεいぷしろん αριθμό (πぱい.χかい. "γがんまεいぷしろんιいおたαあるふぁ σしぐまοおみくろんυうぷしろん, κόσμε"), τたうοおみくろん αποτέλεσμα δでるたεいぷしろん θしーたαあるふぁ ήταν ορισμένο. Επομένως, αあるふぁνにゅー κかっぱαあるふぁιいおた τέτοιες γλώσσες έχουν ασφαλείς τύπους (τたうαあるふぁ προγράμματά τους δでるたεいぷしろんνにゅー αποτυγχάνουν), μπορούν εύκολα νにゅーαあるふぁ παράγουν ανεπιθύμητα αποτελέσματα.

Έστω οおみくろん εξής κώδικας σしぐまεいぷしろん C:

int x = 5;
char y[] = "37";
char* z = x + y;

Σしぐまεいぷしろん αυτό τたうοおみくろん παράδειγμα ηいーた z δείχνει σしぐまεいぷしろん μみゅーιいおたαあるふぁ διεύθυνση μνήμης 5 χαρακτήρες μετά τたうηいーたνにゅー y, ισοδύναμα μみゅーεいぷしろん τρεις χαρακτήρες μετά τたうοおみくろんνにゅー τερματικό χαρακτήρα μηδέν της συμβολοσειράς σしぐまτたうηいーたνにゅー οποία δείχνει ηいーた y. Ηいーた διεύθυνση αυτής της θέσης μνήμης δでるたεいぷしろんνにゅー ορίζεται κかっぱαあるふぁιいおた μπορεί νにゅーαあるふぁ βρίσκεται εκτός της μνήμης πぱいοおみくろんυうぷしろん βλέπει τたうοおみくろん πρόγραμμα. Ακόμα κかっぱαあるふぁιいおた οおみくろん απλός υπολογισμός ενός τέτοιου δείκτη μπορεί νにゅーαあるふぁ έχει ως αποτέλεσμα ακαθόριστη συμπεριφορά (ακόμα κかっぱαあるふぁιいおた κατάρρευση τたうοおみくろんυうぷしろん προγράμματος) σύμφωνα μみゅーεいぷしろん τたうοおみくろん πρότυπο της C, κかっぱαあるふぁιいおた σしぐまτたうαあるふぁ πぱいιいおたοおみくろん πολλά συστήματα ηいーた απλή χρήση της διεύθυνσης της z σしぐまεいぷしろん αυτό τたうοおみくろん σημείο θしーたαあるふぁ προκαλούσε αστοχία τたうοおみくろんυうぷしろん προγράμματος. Επομένως τたうοおみくろん πρόγραμμα έχει σωστούς τύπους αλλά δでるたεいぷしろんνにゅー είναι ασφαλές ως προς τたうηいーた μνήμη - κάτι τέτοιο δでるたεいぷしろん θしーたαあるふぁ συνέβαινε σしぐまεいぷしろん μみゅーιいおたαあるふぁ γλώσσα μみゅーεいぷしろん ασφαλείς τύπους.

Πολυμορφισμός κかっぱαあるふぁιいおた τύποι

Επεξεργασία

Οおみくろん όρος "πολυμορφισμός" ("polymorphism") αναφέρεται σしぐまτたうηいーた δυνατότητα τたうοおみくろんυうぷしろん κώδικα νにゅーαあるふぁ εφαρμόζεται σしぐまεいぷしろん τιμές διαφορετικών τύπων ή σしぐまτたうηいーた δυνατότητα διαφορετικών στιγμιοτύπων (instances) της ίδιας δομής δεδομένων νにゅーαあるふぁ περιέχουν στοιχεία διαφορετικών τύπων. Τたうαあるふぁ συστήματα τύπων πぱいοおみくろんυうぷしろん επιτρέπουν πολυμορφισμό συνήθως τたうοおみくろん κάνουν γがんまιいおたαあるふぁ νにゅーαあるふぁ αυξήσουν τたうηいーた δυνατότητα επαναχρησιμοποίησης κώδικα: σしぐまεいぷしろん μみゅーιいおたαあるふぁ γλώσσα μみゅーεいぷしろん πολυμορφισμό, οおみくろん προγραμματιστής χρειάζεται νにゅーαあるふぁ υλοποιήσει μみゅーιいおたαあるふぁ δομή δεδομένων όπως ηいーた λίστα ή οおみくろん πίνακας συσχέτισης (associative array) μみゅーιいおたαあるふぁ φορά, αντί γがんまιいおたαあるふぁ κάθε τύπο στοιχείων πぱいοおみくろんυうぷしろん πρόκειται νにゅーαあるふぁ χρησιμοποιηθεί. Γがんまιいおたαあるふぁ αυτόν τたうοおみくろん λόγο, κάποιες μορφές πολυμορφισμού ονομάζονται generic programming. Οおみくろんιいおた τたうυうぷしろんπぱいοおみくろん-θεωρητικές βάσεις τたうοおみくろんυうぷしろん πολυμορφισμού είναι συγγενείς μみゅーεいぷしろん αυτές της αφαίρεσης (abstraction), τたうοおみくろんυうぷしろん modularity κかっぱαあるふぁιいおた (κάποιες φορές) τたうωおめがνにゅー υποτύπων (subtyping).

Κύριο λήμμα: Duck typing

Σしぐまτたうοおみくろん "duck typing",[4] μみゅーιいおたαあるふぁ εντολή πぱいοおみくろんυうぷしろん καλεί μみゅーιいおたαあるふぁ μέθοδο m ενός αντικειμένου δでるたεいぷしろん βασίζεται σしぐまτたうοおみくろん δηλωμένο τύπο τたうοおみくろんυうぷしろん αντικειμένου αλλά μόνο σしぐまτたうοおみくろん αあるふぁνにゅー αυτό τたうοおみくろん αντικείμενο υλοποιεί τたうηいーた μέθοδο πぱいοおみくろんυうぷしろん καλείται. Σしぐまτたうαあるふぁ συστήματα μみゅーεいぷしろん duck typing, οおみくろん τύπος ενός αντικειμένου μπορεί νにゅーαあるふぁ θεωρηθεί ότι εξαρτάται από τたうοおみくろん ίδιο τたうοおみくろん αντικείμενο κかっぱαあるふぁιいおた καθορίζεται από τたうοおみくろん ποιες μεθόδους υλοποιεί, επομένως αυτά τたうαあるふぁ συστήματα έχουν εいぷしろんξくしー ορισμού ασφαλείς τύπους αφού μπορούν νにゅーαあるふぁ κληθούν μόνο μέθοδοι πぱいοおみくろんυうぷしろん πραγματικά υλοποιεί ένα αντικείμενο. Μπορεί επίσης νにゅーαあるふぁ θεωρηθεί ότι τたうοおみくろん αντικείμενο ανήκει σしぐまεいぷしろん πολλούς τύπους, οおみくろんιいおた οποίοι περιλαμβάνουν κかっぱαあるふぁιいおた τたうοおみくろんνにゅー τύπο πぱいοおみくろんυうぷしろん περιγράφει τたうοおみくろん γεγονός ότι "έχει μみゅーιいおたαあるふぁ μέθοδο m." Οおみくろん έλεγχος τύπων όμως συμβαίνει σしぐまτたうοおみくろん χρόνο εκτέλεσης, όταν ζητηθεί, κάθε φορά πぱいοおみくろんυうぷしろん μみゅーιいおたαあるふぁ μέθοδος m πρέπει νにゅーαあるふぁ εκτελεστεί, κかっぱαあるふぁιいおた όχι σしぐまτたうοおみくろん χρόνο μεταγλώττισης ή φόρτωσης.

Τたうοおみくろん duck typing διαφέρει από τους δομικούς τύπους (structural typing) γιατί αあるふぁνにゅー τたうοおみくろん τμήμα (όλης της δομής της μονάδας κώδικα) πぱいοおみくろんυうぷしろん χρειάζεται γがんまιいおたαあるふぁ ένα δεδομένο τοπικό υπολογισμό υπάρχει σしぐまτたうοおみくろん χρόνο εκτέλεσης, τたうοおみくろん σύστημα ικανοποιείται από τたうηいーたνにゅー ανάλυση κかっぱαあるふぁιいおた τたうηいーたνにゅー ταυτοποίηση τύπων. Από τたうηいーたνにゅー άλλη πλευρά, ένα σύστημα δομικών τύπων θしーたαあるふぁ απαιτούσε τたうηいーたνにゅー ανάλυση όλης της δομής της μονάδας κώδικα σしぐまτたうοおみくろん χρόνο μεταγλώττισης γがんまιいおたαあるふぁ νにゅーαあるふぁ καθορίσει τたうηいーたνにゅー ταυτότητα τύπων ή τις μεταξύ τους εξαρτήσεις.

Τたうοおみくろん duck typing διαφέρει από ένα ονομαστικό σύστημα τύπων (nominal type system) από διάφορες απόψεις. Ηいーた κύρια είναι ότι καθορίζει τたうηいーたνにゅー πληροφορία τύπων σしぐまτたうοおみくろん χρόνο εκτέλεσης (κかっぱαあるふぁιいおた όχι σしぐまτたうοおみくろん χρόνο μεταγλώττισης) κかっぱαあるふぁιいおた τたうοおみくろん όνομα ενός τύπου δでるたεいぷしろんνにゅー έχει σημασία κατά τたうηいーたνにゅー εύρεση της ταυτότητας ή τたうωおめがνにゅー εξαρτήσεων τύπων - χρειάζεται μόνο μερική πληροφορία γがんまιいおたαあるふぁ τたうηいーた δομή, σしぐまεいぷしろん κάθε στιγμή της εκτέλεσης τたうοおみくろんυうぷしろん προγράμματος.

Οおみくろん όρος αρχικά προέκυψε από τたうοおみくろんνにゅー Alex Martelli, σしぐまτたうαあるふぁ πλαίσια της κοινότητας της Python, μみゅーεいぷしろん τたうηいーた βασική αρχή τたうοおみくろんυうぷしろん duck typing (όσον αφορά τις τιμές της γλώσσας) νにゅーαあるふぁ είναι: "αあるふぁνにゅー περπατάει σしぐまαあるふぁνにゅー πάπια (σしぐま.σしぐま. duck) κかっぱαあるふぁιいおた κάνει σしぐまαあるふぁνにゅー πάπια, τότε είναι πάπια".[5]

Εξειδικευμένα συστήματα τύπων

Επεξεργασία

Έχουν δημιουργηθεί πολλά συστήματα τύπων γがんまιいおたαあるふぁ χρήση σしぐまεいぷしろん συγκεκριμένα περιβάλλοντα, μみゅーεいぷしろん ειδικούς τύπους δεδομένων ή γがんまιいおたαあるふぁ περαιτέρω στατική ανάλυση προγράμματος. Συχνά βασίζονται σしぐまεいぷしろん ιδέες της τυπικής θεωρίας τύπων κかっぱαあるふぁιいおた εμφανίζονται σしぐまεいぷしろん ερευνητικά συστήματα.

Εξαρτώμενοι τύποι

Επεξεργασία

Οおみくろんιいおた εξαρτώμενοι τύποι (dependent types) βασίζονται σしぐまτたうηいーたνにゅー ιδέα της χρήσης δεδομένων γがんまιいおたαあるふぁ τたうηいーたνにゅー ακριβέστερη περιγραφή τたうοおみくろんυうぷしろん τύπου κάποιων άλλων δεδομένων. Γがんまιいおたαあるふぁ παράδειγμα οおみくろん τύπος "matrix(3,3)" μπορεί νにゅーαあるふぁ περιγράφει έναν 3×3 πίνακα. Τότε μπορούν νにゅーαあるふぁ οριστούν κανόνες τυποποίησης όπως οおみくろん ακόλουθος τたうοおみくろんυうぷしろん πολλαπλασιασμού πινάκων:

matrix_multiply : matrix(k,m) × matrix(m,n) → matrix(k,n)

όπου k, m, n είναι αυθαίρετες ακέραιες τιμές. Μみゅーιいおたαあるふぁ παραλλαγή της ML, πぱいοおみくろんυうぷしろん ονομάζεται Dependent ML, βασίζεται σしぐまεいぷしろん αυτό τたうοおみくろん σύστημα τύπων, αλλά επειδή οおみくろん κλασικός έλεγχος τたうωおめがνにゅー εξαρτώμενων τύπων είναι μみゅーηいーた-υπολογίσιμο πρόβλημα, προγράμματα πぱいοおみくろんυうぷしろん τους χρησιμοποιούν δでるたεいぷしろん μπορούν πάντα νにゅーαあるふぁ ελεγχθούν ότι έχουν τους σωστούς τύπους χωρίς κάποιας μορφής περιορισμούς. Ηいーた Dependent ML περιορίζει τたうοおみくろんνにゅー τύπο της ισότητας πぱいοおみくろんυうぷしろん μπορεί νにゅーαあるふぁ υπολογίσει σしぐまτたうηいーたνにゅー αριθμητική Presburger. Άλλες γλώσσες όπως ηいーた Epigram έχουν υπολογίσιμους τύπους σしぐまεいぷしろん όλες τις εκφράσεις της γλώσσας, κάνοντας υπολογίσιμο κかっぱαあるふぁιいおた τたうοおみくろんνにゅー έλεγχο τύπων, ενώ επίσης μπορεί μみゅーιいおたαあるふぁ γλώσσα νにゅーαあるふぁ είναι Τιούρινγκ-πλήρης (Turing complete) μみゅーεいぷしろん τたうοおみくろん κόστος τたうοおみくろんυうぷしろん μみゅーηいーた-υπολογίσιμου ελέγχου τύπων, όπως σしぐまτたうηいーたνにゅー Cayenne.

Γραμμικοί τύποι

Επεξεργασία

Οおみくろんιいおた γραμμικοί τύποι (linear types), πぱいοおみくろんυうぷしろん βασίζονται σしぐまτたうηいーた θεωρία της γραμμικής λογικής (linear logic), κかっぱαあるふぁιいおた σχετίζονται μみゅーεいぷしろん τους τύπους μοναδικότητας (uniqueness types), είναι τύποι αποδίδονται σしぐまεいぷしろん τιμές πぱいοおみくろんυうぷしろん έχουν τたうηいーたνにゅー ιδιότητα νにゅーαあるふぁ υπάρχει ακριβώς μみゅーιいおたαあるふぁ αναφορά σしぐまεいぷしろん αυτές σしぐまεいぷしろん κάθε χρονική στιγμή. Είναι σημαντικοί γがんまιいおたαあるふぁ τたうηいーたνにゅー περιγραφή μεγάλων τιμών πぱいοおみくろんυうぷしろん δでるたεいぷしろんνにゅー αλλάζουν (immutable values) όπως οおみくろんιいおた συμβολοσειρές ή τたうαあるふぁ αρχεία, γιατί κάθε λειτουργία πぱいοおみくろんυうぷしろん ταυτόχρονα καταστρέφει ένα γραμμικό αντικείμενο κかっぱαあるふぁιいおた ταυτόχρονα δημιουργεί ένα παρόμοιο αντικείμενο (όπως οおみくろん κώδικας 'str = str + "a"') μπορεί νにゅーαあるふぁ βελτιστοποιηθεί σしぐまαあるふぁνにゅー επιτόπου τροποποίηση (in-place mutation). Κανονικά κάτι τέτοιο δでるたεいぷしろん θしーたαあるふぁ ήταν δυνατό, γιατί τέτοιες αλλαγές μπορεί νにゅーαあるふぁ προκαλούσαν παρενέργειες σしぐまεいぷしろん μέρη τたうοおみくろんυうぷしろん προγράμματος πぱいοおみくろんυうぷしろん έχουν αναφορές προς τたうοおみくろん αντικείμενο, κατά παράβαση της διαφάνειας αναφοράς (referential transparency). Χρησιμοποιούνται επίσης σしぐまτたうοおみくろん λειτουργικό σύστημα Singularity γがんまιいおたαあるふぁ επικοινωνία μεταξύ τたうωおめがνにゅー διεργασιών, βεβαιώνοντας στατικά ότι οおみくろんιいおた διαδικασίες δでるたεいぷしろん μπορούν νにゅーαあるふぁ μοιράζονται αντικείμενα σしぐまεいぷしろん κοινή μνήμη, ώστε νにゅーαあるふぁ αποφεύγονται καταστάσεις απροσδιοριστίας (race conditions). Ηいーた γλώσσα Clean (πぱいοおみくろんυうぷしろん είναι παρόμοια μみゅーεいぷしろん τたうηいーた Haskell) χρησιμοποιεί ένα σχετικό σύστημα τύπων ώστε νにゅーαあるふぁ έχει καλύτερη ταχύτητα εκτέλεσης, μένοντας ασφαλής.

Τύποι τομής

Επεξεργασία

Οおみくろんιいおた τύποι τομής (intersection types) περιγράφουν τιμές πぱいοおみくろんυうぷしろん ανήκουν ταυτόχρονα σしぐまεいぷしろん δύο άλλους τύπους, μみゅーεいぷしろん επικαλυπτόμενα πεδία τιμών. Γがんまιいおたαあるふぁ παράδειγμα, στις περισσότερες υλοποιήσεις της C οおみくろん χαρακτήρας μみゅーεいぷしろん πρόσημο (signed char) έχει εύρος μεταξύ -128 και 127 και οおみくろん χαρακτήρας χωρίς πρόσημο (unsigned char) έχει εύρος μεταξύ 0 και 255, επομένως οおみくろん τύπος τομής αυτών τたうωおめがνにゅー δύο τύπων έχει εύρος μεταξύ 0 και 127. Ένας τέτοιος τύπος τομής θしーたαあるふぁ μπορούσε νにゅーαあるふぁ περαστεί μみゅーεいぷしろん ασφάλεια σしぐまεいぷしろん συναρτήσεις πぱいοおみくろんυうぷしろん περιμένουν χαρακτήρες μみゅーεいぷしろん πρόσημο ή χωρίς πρόσημο, γιατί κかっぱαあるふぁιいおた οおみくろんιいおた δύο τύποι είναι συμβατοί.

Οおみくろんιいおた τύποι τομής είναι χρήσιμοι γがんまιいおたαあるふぁ τたうηいーたνにゅー περιγραφή υπερφορτωμένων (overloaded) τύπων συναρτήσεων: γがんまιいおたαあるふぁ παράδειγμα, αあるふぁνにゅー οおみくろん τύπος τたうωおめがνにゅー συναρτήσεων πぱいοおみくろんυうぷしろん δέχονται έναν ακέραιο κかっぱαあるふぁιいおた επιστρέφουν ακέραιο είναι "int → int", κかっぱαあるふぁιいおた οおみくろん τύπος τたうωおめがνにゅー συναρτήσεων πぱいοおみくろんυうぷしろん δέχονται έναν αριθμό κινητής υποδιαστολής and επιστρέφουν αριθμό κινητής υποδιαστολής είναι "float → float", τότε ηいーた τομή αυτών τたうωおめがνにゅー δύο τύπων μπορεί νにゅーαあるふぁ χρησιμοποιηθεί γがんまιいおたαあるふぁ συναρτήσεις πぱいοおみくろんυうぷしろん κάνουν είτε τたうοおみくろん πρώτο είτε τたうοおみくろん δεύτερο, μみゅーεいぷしろん βάση τたうοおみくろんνにゅー τύπο της παραμέτρου τους. Μみゅーιいおたαあるふぁ τέτοια συνάρτηση μπορεί νにゅーαあるふぁ περαστεί σしぐまεいぷしろん κάποια άλλη συνάρτηση πぱいοおみくろんυうぷしろん περιμένει συνάρτηση τύπου "int → int" μみゅーεいぷしろん ασφάλεια - απλά δでるたεいぷしろん θしーたαあるふぁ χρησιμοποιούσε τたうηいーた λειτουργικότητα τたうοおみくろんυうぷしろん τύπου "float → float".

Σしぐまεいぷしろん μみゅーιいおたαあるふぁ ιεραρχία μみゅーεいぷしろん υποκλάσεις, ηいーた τομή ενός τύπου κかっぱαあるふぁιいおた ενός γονικού τύπου είναι οおみくろん τύπος χαμηλότερα σしぐまτたうηいーたνにゅー ιεραρχία. Ηいーた τομή αδελφικών τύπων είναι οおみくろん κενός τύπος.

Ηいーた γλώσσα Forsythe περιλαμβάνει μみゅーιいおたαあるふぁ γενική υλοποίηση τたうωおめがνにゅー τύπων τομής. Μみゅーιいおたαあるふぁ σχετική μορφή είναι οおみくろんιいおた refinement types.

Τύποι ένωσης

Επεξεργασία

Οおみくろんιいおた τύποι ένωσης (union types) περιγράφουν τιμές πぱいοおみくろんυうぷしろん ανήκουν σしぐまεいぷしろん έναν μόνο από δύο τύπους. Γがんまιいおたαあるふぁ παράδειγμα, σしぐまτたうηいーた C, οおみくろん χαρακτήρας μみゅーεいぷしろん πρόσημο έχει εύρος μεταξύ -128 και 127, κかっぱαあるふぁιいおた οおみくろん χαρακτήρας χωρίς πρόσημο έχει εύρος μεταξύ 0 και 255, επομένως ηいーた ένωση αυτών τたうωおめがνにゅー δύο τύπων έχει εύρος μεταξύ -128 και 255. Κάθε συνάρτηση πぱいοおみくろんυうぷしろん χειρίζεται αυτόν τたうοおみくろんνにゅー τύπο ένωσης θしーたαあるふぁ έπρεπε νにゅーαあるふぁ χειρίζεται τους ακεραίους σしぐまεいぷしろん όλο αυτό τたうοおみくろん εύρος. Γενικά, οおみくろんιいおた μόνες έγκυρες λειτουργίες σしぐまεいぷしろん έναν τύπο ένωσης είναι αυτές πぱいοおみくろんυうぷしろん είναι έγκυρες κかっぱαあるふぁιいおた στους δύο τύπους πぱいοおみくろんυうぷしろん ενώνονται. Ηいーた δομή "union" της C είναι παρόμοια μみゅーεいぷしろん τους τύπους ένωσης, αλλά δでるたεいぷしろんνにゅー έχει ασφαλή τύπο γιατί επιτρέπει λειτουργίες πぱいοおみくろんυうぷしろん είναι έγκυρες σしぐまεいぷしろん οποιονδήποτε από τους δύο τύπους, αντί κかっぱαあるふぁιいおた γがんまιいおたαあるふぁ τους δύο. Οおみくろんιいおた τύποι ένωσης είναι σημαντικοί σしぐまτたうηいーたνにゅー ανάλυση προγράμματος, όπου χρησιμοποιούνται γがんまιいおたαあるふぁ τたうηいーたνにゅー αναπαράσταση συμβολικών τιμών, τたうωおめがνにゅー οποίων ηいーた ακριβής φύση (πぱい.χかい. τιμή, τύπος) δでるたεいぷしろんνにゅー είναι γνωστή.

Σしぐまεいぷしろん μみゅーιいおたαあるふぁ ιεραρχία μみゅーεいぷしろん υποκλάσεις, ηいーた ένωση ενός τύπου κかっぱαあるふぁιいおた ενός προγόνου τたうοおみくろんυうぷしろん, είναι οおみくろん πρόγονος. Ηいーた ένωση δύο αδελφικών τύπων είναι υποτύπος τたうοおみくろんυうぷしろん κοινού τους προγόνου (όλες οおみくろんιいおた λειτουργίες πぱいοおみくろんυうぷしろん επιτρέπονται σしぐまτたうοおみくろんνにゅー κοινό πρόγονο επιτρέπονται κかっぱαあるふぁιいおた σしぐまτたうοおみくろんνにゅー τύπο ένωσης, αλλά μπορεί επίσης νにゅーαあるふぁ υπάρχουν κかっぱαあるふぁιいおた άλλες κοινές λειτουργίες).

Υπαρξιακοί τύποι

Επεξεργασία

Οおみくろんιいおた υπαρξιακοί τύποι (existential types) χρησιμοποιούνται συχνά μαζί μみゅーεいぷしろん τους τύπους εγγραφής (record types) σしぐまτたうηいーたνにゅー αναπαράσταση μονάδων κώδικα (modules) κかっぱαあるふぁιいおた αφηρημένων δομών δεδομένων (abstract data types), λόγω της ικανότητάς τους νにゅーαあるふぁ διαχωρίζουν μεταξύ υλοποίησης κかっぱαあるふぁιいおた διαπροσωπείας (interface). Γがんまιいおたαあるふぁ παράδειγμα, οおみくろん τύπος "T = ∃X { a: X; f: (X → int); }" περιγράφει τたうηいーた διαπροσωπεία μιας μονάδας κώδικα πぱいοおみくろんυうぷしろん έχει ένα μέλος δεδομένων τύπου X κかっぱαあるふぁιいおた μみゅーιいおたαあるふぁ συνάρτηση πぱいοおみくろんυうぷしろん παίρνει μみゅーιいおたαあるふぁ παράμετρο τたうοおみくろんυうぷしろん ίδιου τύπου X κかっぱαあるふぁιいおた επιστρέφει έναν ακέραιο. Αυτό μπορεί νにゅーαあるふぁ υλοποιηθεί μみゅーεいぷしろん διάφορους τρόπους, γがんまιいおたαあるふぁ παράδειγμα:

  • intT = { a: int; f: (int → int); }
  • floatT = { a: float; f: (float → int); }

Οおみくろんιいおた παραπάνω τύποι είναι υποτύποι τたうοおみくろんυうぷしろん γενικότερου υπαρξιακού τύπου T κかっぱαあるふぁιいおた αντιστοιχούν σしぐまεいぷしろん συμπαγείς τύπους της υλοποίησης, επομένως κάθε τιμή ενός από αυτούς τους τύπους είναι τιμή τたうοおみくろんυうぷしろん τύπου T. Έστω μία τιμή "t" τύπου "T", τότε ξέρουμε ότι ηいーた "t.f(t.a)" έχει σωστό τύπο, όποιος κかっぱαあるふぁιいおた νにゅーαあるふぁ είναι οおみくろん αφηρημένος τύπος X. Αυτό επιτρέπει ευελιξία σしぐまτたうηいーたνにゅー επιλογή τύπων πぱいοおみくろんυうぷしろん νにゅーαあるふぁ ταιριάζουν σしぐまεいぷしろん κάθε εφαρμογή, ενώ οおみくろんιいおた χρήστης τたうοおみくろんυうぷしろん αφηρημένου τύπου χρησιμοποιούν μόνο τたうοおみくろんνにゅー τύπο της διαπροσωπείας—τたうοおみくろんνにゅー υπαρξιακό τύπο—κかっぱαあるふぁιいおた δでるたεいぷしろんνにゅー έρχονται σしぐまεいぷしろん επαφή μみゅーεいぷしろん αυτήν τたうηいーたνにゅー επιλογή.

Γενικά οおみくろん ελεγκτής τύπων δでるたεいぷしろん μπορεί νにゅーαあるふぁ βべーたρろーεいぷしろんιいおた αυτόματα σしぐまεいぷしろん ποιόν υπαρξιακό τύπο ανήκει μみゅーιいおたαあるふぁ μονάδα κώδικα. Σしぐまτたうοおみくろん παραπάνω παράδειγμα, οおみくろん intT { a: int; f: (int → int); } θしーたαあるふぁ μπορούσε νにゅーαあるふぁ έχει επίσης τύπο ∃X { a: X; f: (int → int); }. Ηいーた ευκολότερη λύση θしーたαあるふぁ ήταν νにゅーαあるふぁ σημειώνεται κάθε μονάδα κώδικα μみゅーεいぷしろん τたうοおみくろんνにゅー τύπο πぱいοおみくろんυうぷしろん προορίζεται νにゅーαあるふぁ έχει, πぱい.χかい.:

  • intT = { a: int; f: (int → int); } as ∃X { a: X; f: (X → int); }

Αあるふぁνにゅー κかっぱαあるふぁιいおた οおみくろんιいおた αφηρημένοι τύποι δεδομένων κかっぱαあるふぁιいおた οおみくろんιいおた μονάδες κώδικα είχαν υλοποιηθεί από παλιά στις γλώσσες προγραμματισμού, τたうοおみくろん 1988 εδραιώθηκε ηいーた τυπική θεωρία από τたうοおみくろんνにゅー John C. Mitchell κかっぱαあるふぁιいおた τたうοおみくろんνにゅー Gordon Plotkin, μみゅーεいぷしろん τたうοおみくろん σύνθημα: "Οおみくろんιいおた αφηρημένοι τύποι δεδομένων έχουν υπαρξιακό τύπο"[6] Ηいーた θεωρία είναι λらむだ-λογισμός μみゅーεいぷしろん τύπους δεύτερης τάξης μみゅーεいぷしろん τύπους, όμοιος μみゅーεいぷしろん τたうοおみくろん Σύστημα F, αλλά μみゅーεいぷしろん υπαρξιακούς αντί γがんまιいおたαあるふぁ καθολικούς ποσοδείκτες.

Ρητή ή έμμεση δήλωση κかっぱαあるふぁιいおた εξαγωγή

Επεξεργασία
Κύριο λήμμα: Εξαγωγή τύπων

Πολλά στατικά συστήματα τύπων, όπως της C κかっぱαあるふぁιいおた της Java, απαιτούν δηλώσεις τύπων (type declarations): οおみくろん προγραμματιστής πρέπει νにゅーαあるふぁ αντιστοιχίσει ρητά κάθε μεταβλητή μみゅーεいぷしろん ένα συγκεκριμένο τύπο. Άλλα συστήματα, όπως της Haskell, κάνουν εξαγωγή τύπων (type inference): οおみくろん μεταγλωττιστής βγάζει συμπεράσματα γがんまιいおたαあるふぁ τους τύπους τたうωおめがνにゅー μεταβλητών, μみゅーεいぷしろん βάση πώς χρησιμοποιούνται αυτές από τたうοおみくろんνにゅー προγραμματιστή. Γがんまιいおたαあるふぁ παράδειγμα, αあるふぁνにゅー ηいーた συνάρτηση f(x,y) προσθέτει τις μεταβλητές x κかっぱαあるふぁιいおた y, οおみくろん μεταγλωττιστής μπορεί νにゅーαあるふぁ συμπεράνει ότι οおみくろんιいおた x κかっぱαあるふぁιいおた y είναι αριθμοί – εφόσον ηいーた πρόσθεση ορίζεται μόνο γがんまιいおたαあるふぁ αριθμούς. Επομένως, κάθε κλήση σしぐまτたうηいーたνにゅー f οπουδήποτε σしぐまτたうοおみくろん πρόγραμμα πぱいοおみくろんυうぷしろん χρησιμοποιεί ένα μみゅーηいーた-αριθμητικό τύπο (πぱい.χかい. συμβολοσειρά ή λίστα) σしぐまαあるふぁνにゅー όρισμά της, θしーたαあるふぁ αποτελούσε λάθος.

Οおみくろんιいおた αριθμητικές σταθερές, οおみくろんιいおた σταθερές συμβολοσειρών κかっぱαあるふぁιいおた οおみくろんιいおた εκφράσεις σしぐまτたうοおみくろんνにゅー κώδικα συνήθως υπονοούν ένα συγκεκριμένο περιβάλλον σしぐまτたうοおみくろん οποίο χρησιμοποιούνται. Γがんまιいおたαあるふぁ παράδειγμα, ηいーた έκφραση 3.14 θしーたαあるふぁ μπορούσε νにゅーαあるふぁ υπονοεί τたうοおみくろんνにゅー τύπο τたうωおめがνにゅー αριθμών κινητής υποδιαστολής (floating-point), ενώ ηいーた [1, 2, 3] θしーたαあるふぁ μπορούσε νにゅーαあるふぁ υπονοεί μみゅーιいおたαあるふぁ λίστα από ακέραιους.

Ηいーた εξαγωγή τύπων γενικά μπορεί νにゅーαあるふぁ γίνεται μόνο όταν είναι υπολογίσιμο πρόβλημα σしぐまτたうηいーた θεωρία τύπων πぱいοおみくろんυうぷしろん χρησιμοποιείται. Επιπλέον, ακόμα κかっぱαあるふぁιいおた αあるふぁνにゅー ηいーた εξαγωγή γενικά δでるたεいぷしろんνにゅー είναι υπολογίσιμη γがんまιいおたαあるふぁ μみゅーιいおたαあるふぁ δεδομένη θεωρία τύπων, ηいーた εξαγωγή συνήθως είναι δυνατή γがんまιいおたαあるふぁ ένα μεγάλο υποσύνολο προγραμμάτων σしぐまτたうηいーたνにゅー πράξη. Τたうοおみくろん σύστημα τύπων της Haskell, παραλλαγή τたうοおみくろんυうぷしろん Hindley-Milner, πぱいοおみくろんυうぷしろん είναι περιορισμός τたうοおみくろんυうぷしろん Συστήματος Fωおめが στους αποκαλούμενους πολυμορφικούς τύπους rank-1, στους οποίους ηいーた εξαγωγή τύπων είναι υπολογίσιμο πρόβλημα. Οおみくろんιいおた περισσότεροι μεταγλωττιστές της Haskell επιτρέπουν ως επέκταση, πολυμορφισμό γがんまιいおたαあるふぁ κάθε rank, κάτι πぱいοおみくろんυうぷしろん όμως κάνει τたうηいーたνにゅー εξαγωγή τύπων μみゅーηいーた υπολογίσιμη. (Οおみくろん έλεγχος τύπων όμως είναι υπολογίσιμος κかっぱαあるふぁιいおた τたうαあるふぁ προγράμματα rank-1 εξακολουθούν νにゅーαあるふぁ έχουν εξαγωγή τύπων ενώ τたうαあるふぁ προγράμματα ανώτερου rank απορρίπτονται αあるふぁνにゅー δでるたεいぷしろん δοθούν ρητές σημειώσεις τύπων.)

Οおみくろんιいおた τύποι τたうωおめがνにゅー τύπων

Επεξεργασία
Κύριο λήμμα: Τύπος δεδομένων

Οおみくろん τύπος τύπων είναι είδος (kind). Τたうαあるふぁ είδη εμφανίζονται σしぐまτたうοおみくろんνにゅー προγραμματισμό μみゅーεいぷしろん τύπους (typeful programming), όπως οおみくろんιいおた κατασκευαστές τύπων (type constructors) σしぐまτたうηいーた γλώσσα Haskell.

Οおみくろんιいおた τύποι έχουν πολλές κατηγορίες:

  • Πρωτογενείς τύποι (primitive types) – οおみくろんιいおた απλούστεροι τύποι, πぱい.χかい. οおみくろんιいおた ακέραιοι κかっぱαあるふぁιいおた οおみくろんιいおた αριθμοί κινητής υποδιαστολής
    • Τιμή αλήθειας (boolean)
    • Τύποι integral – τύποι ολόκληρων αριθμών, πぱい.χかい. ακέραιοι ή φυσικοί αριθμοί
    • Τύποι κινητής υποδιαστολής (floating point) – τύποι αριθμών σしぐまεいぷしろん αναπαράσταση κινητής υποδιαστολής
  • Τύποι αναφοράς (reference types)
  • Τύποι επιλογής (option types)
  • Σύνθετοι τύποι – τύποι πぱいοおみくろんυうぷしろん αποτελούνται από βασικούς τύπους, πぱい.χかい. πίνακες ή εγγραφές
    Αφηρημένοι τύποι δεδομένων
  • Αλγεβρικοί τύποι
  • Υποτύποι
  • Εξαγόμενοι τύποι (derived types))
  • Τύποι αντικειμένων, πぱい.χかい. μεταβλητές τύπων
  • Μερικοί τύποι (partial types)
  • Αναδρομικοί τύποι
  • Συναρτησιακοί τύποι, πぱい.χかい. δυαδικές συναρτήσεις
  • Τύποι καθολικά ποσοδεικτούμενοι, όπως οおみくろんιいおた παραμετρικοί τύποι
  • Τύποι υπαρξιακά ποσοδεικτούμενοι, όπως οおみくろんιいおた μονάδες κώδικα (modules)
  • Τύποι εκλέπτυνσης (refinement types) – τύποι πぱいοおみくろんυうぷしろん ορίζουν υποσύνολα άλλων τύπων
  • Εξαρτώμενοι τύποι (dependent types) – τύποι πぱいοおみくろんυうぷしろん εξαρτώνται από όρους (τιμές)
  • Τύποι ιδιοκτησίας (ownership types) – τύποι πぱいοおみくろんυうぷしろん περιγράφουν ή περιορίζουν τたうηいーた δομή αντικειμενοστρεφών συστημάτων

Συμβατότητα: ισοδυναμία κかっぱαあるふぁιいおた υποτύποι

Επεξεργασία

Οおみくろん ελεγκτής τύπων γがんまιいおたαあるふぁ μみゅーιいおたαあるふぁ γλώσσα μみゅーεいぷしろん στατικούς τύπους πρέπει νにゅーαあるふぁ βεβαιώνει ότι οおみくろん τύπος κάθε έκφρασης συμφωνεί μみゅーεいぷしろん τたうοおみくろんνにゅー τύπο πぱいοおみくろんυうぷしろん περιμένει τたうοおみくろん περιβάλλον σしぐまτたうοおみくろん οποίο αυτή εμφανίζεται. Γがんまιいおたαあるふぁ παράδειγμα, σしぐまεいぷしろん μみゅーιいおたαあるふぁ εντολή ανάθεσης της μορφής x := e, οおみくろん τύπος πぱいοおみくろんυうぷしろん συνάγεται γがんまιいおたαあるふぁ τたうηいーたνにゅー έκφραση e πρέπει νにゅーαあるふぁ συμφωνεί μみゅーεいぷしろん τたうοおみくろんνにゅー τύπο πぱいοおみくろんυうぷしろん δηλώθηκε ή βρέθηκε αυτόματα γがんまιいおたαあるふぁ τたうηいーた μεταβλητή x. Αυτή ηいーた συνέπεια ονομάζεται συμβατότητα (compatibility) κかっぱαあるふぁιいおた διαφέρει ανάμεσα στις γλώσσες προγραμματισμού.

Αあるふぁνにゅー οおみくろん τύπος της e κかっぱαあるふぁιいおた οおみくろん τύπος της x είναι οおみくろん ίδιος κかっぱαあるふぁιいおた επιτρέπεται ηいーた ανάθεση γがんまιいおたαあるふぁ αυτόν, τότε πρόκειται γがんまιいおたαあるふぁ έγκυρη έκφραση. Σしぐまεいぷしろん απλά συστήματα τύπων, ηいーた ερώτηση αあるふぁνにゅー δύο τύποι είναι συμβατοί ανάγεται σしぐまτたうοおみくろんνにゅー αあるふぁνにゅー είναι ίσοι ή ισοδύναμοι. Άλλες γλώσσες όμως έχουν άλλα κριτήρια γがんまιいおたαあるふぁ τたうοおみくろん πότε δύο εκφράσεις θεωρείται ότι σημαίνουν τιμές τたうοおみくろんυうぷしろん ίδιου τύπου. Αυτές οおみくろんιいおた θεωρίες ισοδυναμίας (equational theories) γενικά διαφέρουν, μみゅーεいぷしろん δύο ακραίες περιπτώσεις νにゅーαあるふぁ είναι τたうαあるふぁ δομικά συστήματα τύπων (structural type systems), σしぐまτたうαあるふぁ οποία δύο τύποι είναι ισοδύναμοι όταν περιγράφουν τιμές μみゅーεいぷしろん τたうηいーたνにゅー ίδια δομή, κかっぱαあるふぁιいおた τたうαあるふぁ ονομαστικά συστήματα τύπων (nominative type systems), σしぐまτたうαあるふぁ οποία δύο συντακτικά ξεχωριστοί τύποι ποτέ δでるたεいぷしろん σημαίνουν τたうοおみくろんνにゅー ίδιο τύπο (δηλαδή δύο τύποι πρέπει νにゅーαあるふぁ έχουν τたうοおみくろん ίδιο "όνομα" γがんまιいおたαあるふぁ νにゅーαあるふぁ είναι ίσοι).

Σしぐまεいぷしろん γλώσσες μみゅーεいぷしろん υποτύπους (subtyping), ηいーた σχέση συμβατότητας είναι πぱいιいおたοおみくろん πολύπλοκη. Ειδικότερα, αあるふぁνにゅー οおみくろん A είναι υποτύπος τたうοおみくろんυうぷしろん B, τότε μみゅーιいおたαあるふぁ τιμή τύπου A μπορεί νにゅーαあるふぁ χρησιμοποιηθεί σしぐまεいぷしろん ένα περιβάλλον πぱいοおみくろんυうぷしろん απαιτείται μみゅーιいおたαあるふぁ τιμή τύπου B, ακόμα κかっぱαあるふぁιいおた αあるふぁνにゅー τたうοおみくろん ανάποδο δでるたεいぷしろんνにゅー ισχύει. Όπως σしぐまτたうηいーたνにゅー ισοδυναμία, ηいーた σχέση υποτύπου ορίζεται διαφορετικά γがんまιいおたαあるふぁ κάθε γλώσσα προγραμματισμού, μみゅーεいぷしろん πολλές δυνατές παραλλαγές. Ηいーた παρουσία παραμετρικού κかっぱαあるふぁιいおた περιστασιακού (ad hoc) πολυμορφισμού σしぐまεいぷしろん μみゅーιいおたαあるふぁ γλώσσα μπορεί επίσης νにゅーαあるふぁ έχει επιπτώσεις σしぐまτたうηいーた συμβατότητα τύπων.

Προγραμματιστικό σしぐまτたうυうぷしろんλらむだ

Επεξεργασία

Κάποιοι προγραμματιστές προτιμούν τις γλώσσες μみゅーεいぷしろん στατικούς τύπους ενώ άλλοι αυτές μみゅーεいぷしろん δυναμικούς τύπους. Οおみくろんιいおた γλώσσες μみゅーεいぷしろん στατικούς τύπους ειδοποιούν τたうοおみくろんνにゅー προγραμματιστή γがんまιいおたαあるふぁ σφάλματα τύπων κατά τたうηいーた μεταγλώττιση ενώ μπορεί νにゅーαあるふぁ είναι κかっぱαあるふぁιいおた πぱいιいおたοおみくろん γρήγορες σしぐまτたうοおみくろん χρόνο εκτέλεσης. Οおみくろんιいおた υποστηρικτές τたうωおめがνにゅー γλωσσών μみゅーεいぷしろん δυναμικούς τύπους υποστηρίζουν ότι είναι καλύτερες σしぐまτたうηいーた γρήγορη ανάπτυξη πρωτότυπου λογισμικού (rapid prototyping) κかっぱαあるふぁιいおた ότι τたうαあるふぁ σφάλματα τύπων είναι μόνο ένα υποσύνολο τたうωおめがνにゅー σφαλμάτων ενός προγράμματος.[7][8] Επίσης, συνήθως δでるたεいぷしろんνにゅー είναι αναγκαίο νにゅーαあるふぁ ορίζονται ρητά όλοι οおみくろんιいおた τύποι σしぐまεいぷしろん μみゅーιいおたαあるふぁ γλώσσα πぱいοおみくろんυうぷしろん υποστηρίζει εξαγωγή τύπων ενώ πολλές γλώσσες μみゅーεいぷしろん δυναμικούς τύπους έχουν βελτιστοποιήσεις σしぐまτたうοおみくろん χρόνο εκτέλεσης[9][10] πぱいοおみくろんυうぷしろん μπορούν νにゅーαあるふぁ παράγουν γρήγορο κώδικα μみゅーεいぷしろん ταχύτητα πぱいοおみくろんυうぷしろん νにゅーαあるふぁ πλησιάζει αυτήν τたうωおめがνにゅー μεταγλωττιστών γがんまιいおたαあるふぁ στατικές γλώσσες, συχνά χρησιμοποιώντας μερική εξαγωγή τύπων (partial type inference).

Δείτε επίσης

Επεξεργασία

Αναφορές

Επεξεργασία
  1. 1,0 1,1 Pierce, Benjamin (2002). Types and Programming Languages. MIT Press. ISBN 0-262-16209-1. 
  2. B.C. Pierce (2002), σしぐまεいぷしろんλらむだ. 208: "The fundamental problem addressed by a type theory is to insure that programs have meaning. The fundamental problem caused by a type theory is that meaningful programs may not have meanings ascribed to them. The quest for richer type systems results from this tension."
  3. Dependent Types in Practical Programming - Xi, Pfenning (ResearchIndex)
  4. Rozsnyai, S.; Schiefer, J.; Schatten, A. (2007). Concepts and models for typing events for event-based systems, σしぐまεいぷしろんλらむだ. 62. doi:10.1145/1266894.1266904. 
  5. "if it walks like a duck, and quacks like a duck, then it is a duck"
  6. "Abstract data types have existential type". [1]
  7. Meijer, Erik and Peter Drayton. «Static Typing Where Possible, Dynamic Typing When Needed: The End of the Cold War Between Programming Languages» (PDF). Microsoft Corporation. Αρχειοθετήθηκε από τたうοおみくろん πρωτότυπο (PDF) στις 8 Απριλίου 2011. Ανακτήθηκε στις 25 Μαρτίου 2011. 
  8. Bruce Eckel. «Strong Typing vs. Strong Testing». Google Docs. [νεκρός σύνδεσμος]
  9. «Adobe and Mozilla Foundation to Open Source Flash Player Scripting Engine». 
  10. «Psyco, a Python specializing compiler». 

Περαιτέρω διάβασμα

Επεξεργασία