Γλώσσες Προγραμματισμού Μεταγλωττιστές Σημασιολογική Ανάλυση Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου
Δομή ▪Σημασιολογικής Ανάλυσης Στατική και Δυναμική Σημασιολογία Σημασιολογικοί Έλεγχοι Συστήματα Τύπων ▪Γραμματικές Ιδιοτήτων Είδη ιδιοτήτων Σημασιολογικοί Κανόνες
Φάσεις Μεταγλώττισης Συντακτική Ανάλυση Λεκτική Ανάλυση Σημασιολογική Ανάλυση Παραγωγή Ενδιάμεσου Κώδικα Βελτιστοποίηση Ενδιάμεσου Κώδικα Βελτιστοποίηση Τελικού Κώδικα Παραγωγή Τελικού Κώδικα Πίνακας Συμβόλω ν Χειριστής Σφαλμάτω ν Αρχικό Πρόγραμμα λεκτικές μονάδες συντακτικό δένδρο ενδιάμεσος κώδικας τελικός κώδικας Τελικό Πρόγραμμα
Σύνταξη και Σημασιολογία ▪Σε οποιαδήποτε γλώσσα (προγραμματισμού ή μη) υπάρχουν δύο βασικές έννοιες: Σύνταξη: μορφή και δομή καλώς σχηματισμένων ακολουθιών συμβόλων (προγραμμάτων) Σημασιολογία: αφορά την ερμηνεία των ορθά σχηματισμένων ακολουθιών (προγραμμάτων). ▪Η περιγραφή της σημασιολογίας γίνεται συνήθως σε φυσική γλώσσα και τυποκρατικές μεθόδους (σπάνια).
Στατική Σημασιολογία ▪Έλεγχος πέρα από τον συντακτικό έλεγχο για την ορθότητα ενός προγράμματος για τον εντοπισμό σημασιολογικών σφαλμάτων. Δήλωση μεταβλητής μια μόνο φορά σε μια εμβέλεια. Ορθή χρήση τελεστών σε σχέση με τον τύπο των ορισμάτων. Ύπαρξη μιας εντολής break εκτός κατάλληλου βρόγχου. κλπ.
Δυναμική Σημασιολογία ▪Απόδοση ερμηνείας σε προγράμματα που περιγράφει την συμπεριφορά τους. ▪Τρόποι περιγραφής: Λειτουργική Σημασιολογία (operational semantics): περιγράφει συμπεριφορά σαν υπολογιστικά βήματα. Δηλωτική Σημασιολογία (denotational semantics): περιγραφή με κάποιο μαθηματικό φορμαλισμό (πχ. συναρτήσεις) Αξιωματική Σημασιολογία (axiomatic semantics): περιγραφή ως λογικές προτάσεις πάνω στις ιδιότητες του προγράμματος.
Σημασιολογική Ανάλυση ▪Έλεγχοι που διεξάγονται: Έλεγχοι τύπων: τύποι μεταβλητών, συστήματα τύπων, κλπ. Έλεγχοι ύπαρξης ονομάτων: η χρήση μιας μεταβλητής επιτρέπεται μετά τη δήλωση της (πίνακας συμβόλων). Έλεγχοι μοναδικότητας: δύο ονόματα ετικετών, συναρτήσεων, κλπ δεν μπορούν να έχουν το ίδιο όνομα (πίνακας συμβόλων). Έλεγχοι συνέπειας: σε εντολές που ξεκινούν και τελειώνουν με το όνομα της δηλωθείσας δομής. Έλεγχοι ροής: πχ. ύπαρξη break έξω από κατάλληλη δομή, κλπ.
Συστήματα Τύπων ▪Σύστημα τύπων (type system): διαχείριση και έλεγχος τύπων. ▪Βασικοί τύποι (basic types): πρωταρχικοί τύποι της γλώσσας. integer, boolean, real, char. ▪Σύνθετοι τύποι (composite types): τύποι ου προκύπτουν από "κατασκευαστές τύπων" με συνδυασμό άλλων τύπων: Πίνακες, Καρτεσιανά γινόμενα, εγγραφές, δείκτες, συναρτήσεις.
Συστήματα Τύπων (ii) ▪Περιορισμοί στη κατασκευή τύπων: πχ. διάσταση πινάκων, επιστροφή τιμών από συναρτήσεις, κλπ. ▪Οι τύποι που δεν υπόκεινται σε περιορισμούς ονομάζονται τύποι πρώτης τάξης (first class types). ▪Τυποκρατική περιγραφή των συστημάτων τύπων περιλαμβάνει την έννοια περιβάλλοντα τύπων (type environments). Εξαγωγή τύπων βάσει κανόνων για εκφράσεις. var x,y : int { x integer, y real}
Τύποι και Έλεγχοι ▪Δύο είδη μετατροπών: ρητή μετατροπή τύπου (type casting): ο προγραμματιστής δηλώνει ρητά την μετατροπή. έμμεση μετατροπή τύπου (type coersion): που η μετατροπή αποφασίζεται από το μεταγλωττιστή αν είναι επιτρεπτή. ▪Υπερφόρτωση τελεστών: τελεστής διεξάγει δύο παρεμφερείς αλλά διαφορετικές πράξεις. Μεταγλωττιστής πρέπει να ελέγξει την σωστή χρήση υπερφόρτωσης. Παράδειγμα τελεστής "+"
Τύποι και Έλεγχοι ▪Πολυμορφικοί τελεστές: υλοποιούν την ίδια πράξη αλλά με διαφορετικού τύπου ορίσματα. πχ. τελεστής αποδεικτοδότητησης (dereferencing) Αν Ε είναι δείκτης σε τύπο τ, τότε ^Ε είναι τύπου τ. ▪Συνώνυμα τύπων ▪Ισοδυναμία τύπων (χρήση χωρίς μετατροπή) Δομική ισοδυναμία (σχηματίζονται με τον ίδιο κατασκευαστή) Ονομαστική Ισοδυναμία ▪Υποσύνολα τύπων πχ. var i : (υποσύνολο τύπου integer)
Πότε γίνονται οι έλεγχοι ▪Κατά την μεταγλώττιση: στατικοί έλεγχοι ▪Κατά την εκτέλεση: δυναμικοί έλεγχοι ▪Ισχυρά συστήματα τύπων (strong type systems): Εγγύηση ότι το μεταγλωττισμένο πρόγραμμα δεν θα εμφανίσει σφάλμα τύπου. Μεγάλο κόστος. Πολλές φορές ανάγκη για δυναμικούς ελέγχους.
Υλοποίηση Σημασιολογικής Ανάλυσης; ▪Πώς γίνεται η σημασιολογική ανάλυση; ▪Μεταγλωττιστής πολλαπλών περασμάτων: δημιουργία συντακτικού δένδρου και έπειτα έλεγχος. ▪Μεταγλωττιστής απλού περάσματος: Η ανάλυση γίνεται σταδιακά παράλληλα με την συντακτική ανάλυση. ▪Θεωρητικά υπάρχει η ανάγκη για υποστήριξη όλων των παραπάνω από κάποιου είδους γραμματικής. Γραμματική με συμφραζόμενα: μεγάλο υπολογιστικό κόστος.
Σημασιολογική Ανάλυση Γραμματικές Ιδιοτήτων (Attributed Grammars)
Γραμματικές Ιδιοτήτων (ή Κατηγορημάτων) ▪Attributed grammars ▪Επέκταση των γραμματικών χωρίς συμφραζόμενα Προσκολλούνται ιδιότητες (κατηγορήματα-attributes) σε κάθε σύμβολο της γραμματικής. Συνήθως συμβολίζονται με X.att, όπου Χ το σύμβολο της γραμματικής και att το όνομα της ιδιότητας. ▪Οι ιδιότητες χρησιμοποιούνται σε κανόνες ώστε να εξασφαλιστεί ότι ακολουθούνται οι περιορισμοί της γλώσσας. Σημασιολογικοί Κανόνες
Ορισμός ▪Μια γραμματική ιδιοτήτων είναι μια τριάδα (G,V,F) όπου: G είναι μια γραμματική χωρίς συμφραζόμενα. V ένα πεπερασμένο σύνολο ιδιοτήτων για κάθε σύμβολο της γλώσσας, με ορισμένο τύπο. F ένα σύνολο περιορισμών (assertions) με σκοπό: ▫ να καθορίσει τις τιμές των ιδιοτήτων των συμβόλων ▫ να ορίσει υπό ποιες προϋποθέσεις είναι μια παραγωγή δυνατή, καθώς κάθε περιορισμός αντιστοιχεί σε ένα κανόνα παραγωγής (ένας κανόνας περιέχει περισσότερους περιορισμούς) ▪Περιορισμοί είναι λογικές σχέσεις ανάμεσα στις ιδιότητες του αριστερού και δεξιού μέλους του κανόνα.
Παράδειγμα ΓραμματικήΚανόνες Ε::=Ε+Τ Ε 1.val = E 2.val + T.val E::=TE.val = T.val Τ::=T*FT 1.val = T 2.val * F.val Τ::=FT.val = F.val F::=numT.val = num.value F::=(E)F.val = E.val
Παράδειγμα σε FLEX/BISON %{typedef int YYSTYPE; %} program :expression {printf(“Value: %d\n”, $1};) ; expression : term{$$ = $1;} | expression ‘+’ term {$$ = $1 + $3;} ; term: factor {$$ = $1;} | term ‘*’ factor {$$ = $1 * $3;} ; factor: ‘(‘ expression ‘)’{$$ = $2;} | TK_num {$$ = $1;} ; Flex file (part): {D}+ {yylval = atoi(yytext); return T_num; }
Γραμματικές Ιδιοτήτων και ΣΑ ▪Δεδομένης μιας γραμματικής ιδιοτήτων και ενός συντακτικού δένδρου που παράγεται για μια συμβολοσειρά: είναι δυνατό να ελεγχθεί αν η κατασκευή του δένδρου ικανοποιεί τους περιορισμούς, απλώς ελέγχοντας κάθε κόμβο. Απαιτείται "πρίν" τον έλεγχο η ανάθεση τιμών στις ιδιότητες των συμβόλων. ▪Στην γενική περίπτωση το παραπάνω πρόβλημα είναι εξαιρετικά δύσκολο, λόγω πιθανών αλληλεξαρτήσεων. Περιορισμός του τρόπου υπολογισμού των τιμών.
Είδη Ιδιοτήτων ▪Συνθετικές ιδιότητες (synthesized attributes): εξαρτώνται από τους κόμβους που είναι άμεσοι απόγονοι του κόμβου αυτού. Χρησιμοποιούνται για να περαστούν τιμές από τα χαμηλότερα επίπεδα του δένδρου στα υψηλότερα. ▪Κληρονομούμενες ιδιότητες (inherited attributes): εξαρτώνται από ιδιότητες του κόμβου γονέα ή των αδελφών κόμβων του συντακτικού δένδρου. Χρησιμοποιούνται για να περαστούν τιμές από τα υψηλότερα επίπεδα του δένδρου στα χαμηλότερα.
Παράδειγμα ▪Έστω η γραμματική που επιτρέπει την δήλωση τύπων μεταβλητών. Γραμματική D ::= T L T ::= "int" T ::= "float" L ::= L 1, "id" L ::= "id" Σημασιολογικοί Κανόνες { L.inh = T.type } { T.type = integer } { T.type = float } { L 1.inh = L.inh, istype(id.entry, L.inh} { istype(id.entry, L.inh} Κληρονομούμενη Ιδιότητα Συνθετική Ιδιότητα
Σημασιολογικοί Κανόνες ▪Για κάθε κανόνα της γραμματικής Α::=α 1...α n ορίζεται ως σημασιολογικός κανόνας ένα υποσύνολο των περιορισμών του συνόλου F. ▪Ένας κανόνας: ορίζει συνθετικές ιδιότητες του Α ορίζει κληρονομούμενες ιδιότητες των α i βάσει των ιδιοτήτων του Α και των ιδιοτήτων των α j (i j) ορίζει συμπληρωματικούς περιορισμούς
Παράδειγμα Γραμματική ▪T ::= F T′ ▪T′ ::= * F T 1 ′ ▪T′ ::= ε ▪F ::= "digit" Σημ. Κανόνες { T.val = T′.val T'.inh = F.val} { T′.val = T 1 '.val T 1 '.inh = T′.inh * F } { T′.val = T'.inh } { F.val = digit.value }
Γενική Μέθοδος Υπολογισμού Ιδιοτήτων (annotation) ▪Κατασκευή του συντακτικού δένδρου. ▪Υπολογισμός των ιδιοτήτων των κόμβων. Ιδιότητες των τερματικών συμβόλων μπορεί να είναι μόνο συνθετικές και να προέρχονται από εξωτερική πηγή (λεκτικός αναλυτής). Αν το αρχικό σύμβολο έχει κληρονομούμενες ιδιότητες πρέπει να δίνονται από εξωτερική πηγή. Εύρεση των τιμών των ιδιοτήτων στους ενδιάμεσους κόμβους του δένδρου. ▪Πρόβλημα: Ιδιότητες μπορεί να έχουν εξαρτήσεις μεταξύ τους. Σειρά εκτέλεσης ενεργειών ανάθεσης τιμών.
Κυκλικές Εξαρτήσεις ▪Πρόσθετο Πρόβλημα: Αν σε μια γραμματική ιδιοτήτων υπάρχει αλληλεξάρτηση μεταξύ συνθετικών και κληρονομούμενων ιδιοτήτων τότε μπορεί να υπάρξουν κυκλικές εξαρτήσεις. ▪Απλό παράδειγμα Α::=Β {Α.s = B.i; B.i = A.s + 1;} A B A.s B.i
Σειρά Υπολογισμών ▪Δημιουργία γράφου εξαρτήσεων ιδιοτήτων. Για κάθε σύμβολο της γραμματικής και για κάθε ιδιότητα του δημιουργείται ένας κόμβος στο γράφο. Κάθε εξάρτηση μεταξύ ιδιοτήτων, δηλ. όταν μια ιδιότητα Χ.α απαιτεί για τον υπολογισμό της την τμή μιας άλλης ιδιότητας Υ.b τότε προστίθεται μια ακμή από το Υ.β στο Χ.α. ▪Υπολογίζεται μια τοπολογική διάταξη του γράφου. Σειρά με την οποία θα υπολογιστούν οι ιδιότητες. Η εκτέλεση ξεκινά από τις κληρονομούμενες ιδιότητες της ρίζας και τις συνθετικές των τερματικών συμβόλων.
Παράδειγμα: Συμβολοσειρά float id, id D T L idid L, idid flo at T.type = float float id, id D ::= T L {L.inh = T.type } T ::= "int" { T.type = integer } T ::= "float" { T.type = float } L ::= L 1, "id" { L 1.inh = L.inh, istype(id.entry, L.inh} L ::= "id" { istype(id.entry, L.inh} L.inh = float
Παράδειγμα 2: Συμβολοσειρά 3*2 T ::= F T′ { T.val = T′.val, T'.inh = F.val} T′ ::= * F T 1 ′ { T′.val = T 1 '.val, T 1 '.inh = T′.inh * F } T′ ::= ε { T′.val = T'.inh } F ::= "d" { F.val = d.value } T val F d value (= 3) T'T' valinh T'T' valinh *F val d value (= 2)
Μέθοδοι και Γραμματικες για Μεταγλωττιστές ▪Η γενική μέθοδος είναι δαπανηρή. ▪Δεν είναι κατάλληλη για μεταγλωττιστές απλού περάσματος, μιας και απαιτεί την κατασκευή του συντακτικού δένδρου και έπειτα υπολογισμό των ιδιοτήτων. ▪Ανάγκη για γραμματικές που να είναι δυνατό να υπολογίζουν τις ιδιότητες σε ένα πέρασμα. ▪Άρα: Περιορισμοί στη δομή των γραμματικών ιδιοτήτων. S-attributed Γραμματικές L-attributed Γραμματικές.
S-attributed Γραμματικές ▪Υπάρχουν μόνο συνθετικές ιδιότητες ▪Εύκολος υπολογισμός ξεκινώντας από τα φύλλα προς την ρίζα. ▪Εύκολη υπολοποίηση με LR συντακτικούς αναλυτές από πάνω προς τα κάτω. ▪Χρησιμοποιείται σε συντριπτική πλειοψηφία στην πράξη.
L-attributed Γραμματικές Ιδιότητες συμβόλων είναι: ▪Συνθετικές ▪Κληρονομούμενες, αλλά σε ένα κανόνα Α::=B 1,B 2...B j για σύμβολο Β i βασίζονται είτε: σε κληρονομούμενες ιδιότητες του Α, είτε σε ιδιότητες (γενικά) των συμβόλων Β k, όπου k<i, Ιδιότητες του Β i χωρίς όμως να δημιουργούνται κυκλικές αναφορές. ▪L-attributed γραμματικές υλοποιούνται εύκολα σε LL συντακτικούς αναλυτές. ▪Υλοποιούνται και με LR αναλυτές αν γίνει κατάλληλη μετατροπή της γραμματικής.
Μεταφραστικά Σχήματα Οδηγούμενα από τη Σύνταξη ▪Στην πραγματικότητα εκτός από αναθέσεις τιμών σε ιδιότητες και έλεγχο ικανοποίησης περιορισμών, γίνονται και άλλες ενέργειες (έμμεσες συνέπειες) πχ. εγγραφή στον πίνακα συμβόλων, εκτύπωση μηνύματος κλπ. Οποιασδήποτε μορφής κώδικα. ▪Κανόνες ονομάζονται σημασιολογικές ρουτίνες. Μεταφραστικό σχήμα οδηγούμενο από τη σύνταξη. Ιδιαίτερα χρήσιμο στη παραγωγή ενδιάμεσου κώδικα.
Άλλα παραδείγματα- Έλεγχος τύπων ▪Έλεγχος τύπων E= Ε 1 + Ε 2 {if E 1.type = int then if E 2.type = int then E.type = int else if E 2.type = real then E.type = real else error("type missmatch") if E 1.type = real then if E 2.type = real or E 2.type = int then E.type = real else error("type missmatch") }
Άλλα παραδείγματα- Έλεγχος μοναδικότητας ▪Κατά τη δήλωση της μεταβλητής εξετάζεται από τον πίνακα συμβόλων αν έχει δηλωθεί ξανά. var_decl: "var" T_id ':' T_type ';' {if (addvar($2, $4)!=0) {printf("Variable:: %s on line %d. ",$2,line); yyerror("Var already defined.\n");} }
Σύνοψη ▪Σημασιολογικής Ανάλυσης Στατική και Δυναμική Σημασιολογία Σημασιολογικοί Έλεγχοι Συστήματα Τύπων ▪Γραμματικές Ιδιοτήτων Είδη ιδιοτήτων Σημασιολογικοί Κανόνες