ΗΥ – 340 Γλώσσες και Μεταφραστές Φροντιστήριο Ενδιάμεσος κώδικας - Backpatching
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Runtime Checking (1/3) Η γλώσσα alpha είναι μια dynamic typing γλώσσα (ο τύπος μιας μεταβλητής αλλάζει ακολουθώντας τον τύπο της τιμής που κάθε φορά αποθηκεύεται σε αυτήν) επομένως δεν μπορούμε κατά την μεταγλώττιση να εφαρμόσουμε έλεγχο τύπων. if (x > 12) a = false; else a = 3.33; b = (a and c); // ? x = input(); y = !x; // ? Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Runtime Checking (2/3) Δεν μπορούμε να υλοποιήσουμε πλήρη έλεγχο at compile time, για το λόγο αυτό ο έλεγχος θα γίνει at runtime. Στην περίπτωση των σταθερών εκφράσεων προαιρετικά ο έλεγχος μπορεί να γίνει at compile time. a = true + 12; // Boolean + Number Error b = “str1” + false; // String + Boolean Error Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Runtime Checking (3/3) Run-time Warnings / Run-time Errors l-value = r-value +,-,*,%,++,--,- &&, ||, ! >,>=,<,<= ==, != … (see Lecture 9) Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Alpha i-code (1/3) enum iopcode { assign, add, sub, mul, div, mod, not, if_eq, if_noteq, … }; struct quad { iopcode op; expr* res; expr* arg1; expr* arg2; unsigned label; unsigned line; quad* quads = (quad *) 0; quads[quadNo].label = … Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Alpha i-code (2/3) enum expr_t { var_e, tableitem_e, programfunc_e, libraryfunc_e, … }; struct expr { expr_t type; symbol* sym; expr* index; double numConst; char* strConst; unsigned char boolConst; expr* next; Σε ένα quad μπορούμε δώσουμε τις παρακάτω τιμές: σταθερή τιμή (string, number, boolean) τιμή συνάρτησης βιβλιοθήκης (όνομα) τιμή συνάρτησης προγράμματος (διεύθυνση) κρυφή μεταβλητή μεταβλητή προγράμματος Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Alpha i-code (3/3) Ο πίνακας για τα quads είναι δυναμικός, επομένως δεν έχουμε δείκτες σε quads αλλά χρησιμοποιούμε το index του κάθε quad για να αναφερθούμε σε αυτό. … if (a > b) c = true; else c = false; index Op Arg1 Arg2 Result / Label … 10 IF_GREATER a b 13 11 ASSIGN false c 12 JUMP 14 true Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Backpatching Για την αποτίμηση των λογικών εκφράσεων (boolean expressions) υπάρχουν δύο τεχνικές: Ολική αποτίμηση (total boolean evaluation) Αποτιμάται ολόκληρη η έκφραση. Μερική αποτίμηση (short circuit / jumping code) Αποτιμάται μόνο το ελάχιστο αναγκαίο τμήμα της έκφρασης από το οποίο μπορεί να εξαχθεί συμπέρασμα για την τιμή της. Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Ολική αποτίμηση έκφρασης Παράδειγμα a < b or c < d Ο ενδιάμεσος κώδικας που αντιστοιχεί σε αυτή την έκφραση είναι: Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Μερική αποτίμηση έκφρασης Προσθέτοντας τα συντιθέμενα γνωρίσματα (synthesized attributes) truelist και falselist. Καθώς παράγεται ο ενδιάμεσος κώδικας οι JUMP εντολές δεν συμπληρώνονται. Τα labels που αντιστοιχούν σε αυτές τις εντολές προστίθενται στην κατάλληλη από τις δύο λίστες. Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Γραμματική Η γραμματική είναι η εξής: Π.χ. από τον 1ο κανόνα παρατηρούμε ότι εάν το Ε1 είναι true τότε και το Ε θα είναι true, άρα η λίστα Ε1.truelist γίνεται μέρος της Ε.truelist. Εάν το Ε1 είναι false, τότε πρέπει να εξεταστεί το Ε2. Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Συναρτήσεις χειρισμού λίστας makelist(i): Δημιουργεί μία νέα λίστα merge(p1, p2): Συνενώνει τις λίστες p1 και p2. backpatch(p, i): Εισάγει το i ως το target label όλων των JUMP εντολών που είναι καταχωρημένα στην p. Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Σημασιολογικοί κανόνες Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Παράδειγμα (1/5) a < b or c < d and e < f Ο ενδιάμεσος κώδικας που παράγεται είναι: 1ο Βήμα: Γινεται reduce το a < b από τον κανόνα Ε -> id1 relop id2. 2ο Βήμα: Γίνεται reduce το c < d από τον κανόνα Ε -> id1 relop id2. 1: IF_LESS a b _ 2: JUMP _ 3: IF_LESS c d _ 4: JUMP _ Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Παράδειγμα (2/5) 3ο Βήμα: Γίνεται reduce το e < f από τον κανόνα Ε -> id1 relop id2. 4ο Βήμα: Από τον κανόνα Ε -> Ε1 and M E2 γίνεται reduce. Εκτελείται ο σημασιολογικός κανόνας backpatch({3}, 5). 5: IF_LESS e f _ 6: JUMP _ 1: IF_LESS a b _ 2: JUMP _ 3: IF_LESS c d 5 4: JUMP _ 5: IF_LESS e f _ 6: JUMP _ Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Παράδειγμα (3/5) 5ο Βήμα: Από τον κανόνα Ε -> Ε1 or M E2 γίνεται reduce. Εκτελείται ο σημασιολογικός κανόνας backpatch({2}, 3). 1: IF_LESS a b _ 2: JUMP 3 3: IF_LESS c d 5 4: JUMP _ 5: IF_LESS e f _ 6: JUMP _ Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Παράδειγμα (4/5) Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας
Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας Παράδειγμα (5/5) Η έκφραση είναι αληθής, εάν εκτελεστούν οι JUMP εντολές με label 1 ή 5. Αντίθετα, η έκφραση είναι ψευδής, εάν εκτελεστούν οι JUMP εντολές με label 4 ή 6. Ποιος όμως θα συμπληρώσει τα target labels αυτών των JUMP εντολών ? Στην 11η διάλεξη (9η διαφάνεια) παρουσιάστηκε η συνάρτηση patchlabel, η οποία συμπληρώνει το target label μίας JUMP εντολής. Θα πρέπει να τροποποιηθεί αυτή η συνάρτηση, ώστε να συμπληρώνει τα target codes όλων των JUMP εντολών που βρίσκονται στο truelist και στο falselist.. Spring 2007 Γ. Γεωργαλής, Σ. Δουμπουλάκης, Μ. Ζηδιανάκης, Θ. Μπουρδένας