Γιώργος Δημητρίου Ενότητα 2 η : Συστήματα τύπων
Συστήματα Τύπων (ΣΤ) Το σύστημα τύπων μιας γλώσσας προγραμματισμού με τύπους είναι ένα σύνολο από κανόνες στους οποίους πρέπει να υπακούουν οι τύποι της Τα συστήματα τύπων έχουν στόχο την πρόληψη λαθών κατά την εκτέλεση των προγραμμάτων μιας γλώσσας προγραμματισμού με τύπους Ο ορισμός κάθε γλώσσας προγραμματισμού με τύπους πρέπει να περιλαμβάνει και ένα σύστημα τύπων
Θεωρητική Περιγραφή ΣΤ Η σημασία των ΣΤ οδήγησε σε δημιουργία θεωρητικών μοντέλων περιγραφής ΣΤ Άτυπες περιγραφές ΣΤ μπορούν να ο- δηγήσουν σε διφορούμενες ερμηνείες, πολλαπλές διαφορετικές υλοποιήσεις και σφάλματα εκτέλεσης Τέτοια σφάλματα μπορούν να εμφανιστούν ακόμα κι αν το πρόγραμμα έχει περάσει έλεγχο τύπων
Τύποι και Γλώσσες με Τύπους Τύπος είναι ένας περιορισμός στις τιμές που μπορεί να λάβει μια μεταβλητή ενός προγράμματος της γλώσσας Οι πιο πολλές γλώσσες περιλαμβάνουν στις γραμματικές τους δήλωση τύπων για τις μεταβλητές τους Κάποιες γλώσσες δεν έχουν τύπους, επιτρέποντας στις μεταβλητές τους να λαμβάνουν τιμές χωρίς περιορισμούς
Τύποι και Σφάλματα Εκτέλεσης Συνήθως οι γλώσσες χωρίς τύπους περιλαμβάνουν αυστηρό έλεγχο κατά την εκτέλεση, ώστε να μην εμφανίζονται σφάλματα λ-calculus και γλώσσες συναρτησιακού προγραμματισμού Στις γλώσσες με τύπους ο έλεγχος είναι στατικός μέσα από το σύστημα τύπων που υλοποιεί ο μεταγλωττιστής, ή και δυναμικός
Τύποι και Δηλώσεις Τύπων Στις περισσότερες γλώσσες με τύπους ο τύπος κάθε μεταβλητής δηλώνεται στο πρόγραμμα (explicitly typed languages) Υπάρχουν και γλώσσες με τύπους, χωρίς όμως δηλώσεις τύπων, οπότε το σύστημα τύπων εξάγει τον τύπο που υπονοείται κάθε στιγμή (implicitly typed languages)
Σφάλματα Εκτέλεσης Σφάλματα που πάντα ανιχνεύονται (trapped errors) Διαίρεση με το μηδέν Προσπέλαση μη νόμιμης διεύθυνσης Σφάλματα που μπορούν να περάσουν απαρατήρητα (untrapped errors) Υπέρβαση του ορίου πίνακα Λανθασμένος προορισμός άλματος
Ασφαλείς / Μη Ασφαλείς Γλώσσες Ασφαλείς είναι οι γλώσσες των οποίων τα προγράμματα δεν εμφανίζουν απαρατήρητα σφάλματα Ένα σύστημα τύπων κάνει μια γλώσσα ασφαλή, ώστε τα προγράμματά της να μην έχουν απρόβλεπτη συμπεριφορά Πολλές φορές δεν απαλείφει όλα τα ανιχνεύσιμα σφάλματα, αφήνοντας την ευθύνη α- παλοιφής τους στον προγραμματιστή
Ισχυρά / Μη Ισχυρά ΣΤ Οι γλώσσες των οποίων τα ΣΤ επιτυγχάνουν να απαλείψουν τα απαρατήρητα σφάλματα σε κάθε πρόγραμμά τους ονομάζονται ισχυρού ελέγχου ή ισχυρού τύπου (strongly-checked, stronglytyped) Ισχυρού ελέγχου είναι και οι γλώσσες χωρίς τύπους που υλοποιούν δυναμικό έλεγχο για απαλοιφή σφαλμάτων Ισχυρά και μη ισχυρά ΣΤ
Ανεπάρκεια Άτυπου ΣΤ Αδυναμία εξασφάλισης ότι με βάση μια άτυπη περιγραφή του συστήματος τύπων δεν θα περάσουν τον έλεγχο εσφαλμένα προγράμματα Η θεωρητική (μαθηματική) περιγραφή των ΣΤ έχει σα στόχο την σύνταξη για κάθε γλώσσα ενός θεωρήματος ορθότητας τύπων (type soundness theorem), το οποίο να διασφαλίζει την ορθότητα τύπων για όλα τα προγράμματα της γλώσσας!
Περιγραφή ΣΤ Σύνταξη Τύποι και δηλώσεις τους Εμβέλειες μεταβλητών Συνήθως προκύπτουν μέσα από τη σύνταξη Κανόνες τύπων Υποτύποι και ισοδυναμίες τύπων Περιβάλλοντα τύπων Οι κανόνες εφαρμόζονται στα κατάλληλα περιβάλλοντα
Παραγωγή Τύπου Κρίση τύπου (judgement) είναι κάθε λογική σχέση τύπου: Γ ⱶ Μ:Α δηλαδή «η έκφραση Μ είναι τύπου Α στο περιβάλλον Γ» Ένας κανόνας (R) οδηγεί σε παραγωγή τύπου από μια σειρά κρίσεων Κ 1, Κ 2,, Κ ν σε μια κρίση Κ: (R) Κ 1 Κ 2 Κ ν Κ
Παράδειγμα Κανόνων Δύο κανόνες: (Val n) (n = 0,1, ) (Val +) Γ ⱶ Γ ⱶ M: Nat Γ ⱶ Ν: Nat Γ ⱶ n: Nat Γ ⱶ Μ+Ν: Nat Ο πρώτος κρίνει ότι οι εκφράσεις 0,1, είναι τύπου Nat (φυσικών αριθμών) Ο δεύτερος κρίνει ότι το άθροισμα δύο εκφράσεων τύπου Nat είναι του ίδιου τύπου σημαίνει ορθότητα περιβάλλοντος
Παράδειγμα Παραγωγής ⱶ ⱶ 1: Nat ⱶ 1+2: Nat ⱶ ⱶ 2: Nat είναι το κενό περιβάλλον, που έχει εξ ορισμού ορθούς τύπους Η παραγωγή γίνεται από πάνω προς τα κάτω Συμπέρασμα: Η έκφραση «1+2» είναι τύπου Nat
Παράδειγμα Σφάλματος Αν στους προηγούμενους προσθέσουμε τον κανόνα Γ ⱶ Γ ⱶ true: Bool τότε η έκφραση «1+true» είναι λανθασμένη, καθώς δεν παράγεται τύπος γι αυτήν
ΣΤ Πρώτης Τάξης Είναι τα ΣΤ γλωσσών που δεν δέχονται τύπους ως παραμέτρους ούτε έχουν α- φηρημένους τύπους Μπορούν όμως να δέχονται συναρτήσεις ως παραμέτρους Τα ΣΤ που δέχονται τα παραπάνω είναι δεύτερης τάξης Οι πιο πολλές γλώσσες προστακτικού προγραμματισμού έχουν ΣΤ πρώτης τάξης: Pascal, Algol68
Γλώσσα λ-calculus με Τύπους: F1 Κανόνες σύνταξης της F1: Κρίσεις της F1:
Γλώσσα λ-calculus με Τύπους: F1 Κανόνες τύπων της F1:
Γλώσσα λ-calculus με Τύπους: F1 Παράδειγμα παραγωγής της F1:
Γλώσσα λ-calculus με Τύπους: F1 Τύπος Unit (Void): Τύπος Bool:
Γλώσσα λ-calculus με Τύπους: F1 Τύπος Nat:
Γλώσσα λ-calculus με Τύπους: F1 Γινόμενο τύπων (product):
Γλώσσα λ-calculus με Τύπους: F1 Ένωση τύπων (union):
Γλώσσα λ-calculus με Τύπους: F1 Πιο σύνθετες δομές τύπων: Records (= γινόμενα με πεδία) Variants (= ενώσεις με πεδία) Pointers Arrays Αναδρομικοί τύποι: Lists
Γλώσσα λ-calculus με Τύπους: F1 Παράδειγμα: Records
Γλώσσα λ-calculus με Τύπους: F1 Παράδειγμα: Pointers
Γλώσσα λ-calculus με Τύπους: F1 Παράδειγμα: Arrays
Γλώσσα λ-calculus με Τύπους: F1 Παράδειγμα: Arrays (λειτουργίες)
Παράδειγμα Προστακτικής Γλώσσας Κανόνες σύνταξης
Παράδειγμα Προστακτικής Γλώσσας Κρίσεις
Παράδειγμα Προστακτικής Γλώσσας Κανόνες τύπων (μέρος Α )
Παράδειγμα Προστακτικής Γλώσσας Κανόνες τύπων (μέρος Β )
Πηγές Luca Cardelli (DEC): Type Systems, in Handbook of Computer Science and Engineering, 1997. Benjamin Pierce: Types and Programming Languages, 2002. Benjamin Pierce, ed.: Advanced Topics in Types and Programming Languages, 2003.