HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ Φροντιστήριο 4ο Παραγωγή Ενδιάμεσου Κώδικα ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης HY340, 2009 Α. Σαββίδης Slide 2 / 143 Κώδικας τριών διευθύνσεων Περιγραφή ραφή ενός πολύπλοκου λο ο προγράμματος ρά ος με μία ακολουθία απλών εντολών Οι εντολές είναι συνήθως λίγες Έχουν πανομοιότυπη μορφή Εντολή, αποτέλεσμα, τελεστής 1, τελεστής 2 Είναι πολύ κοντά στην γλώσσα μηχανής Σε πολλές από τις εντολές η αντιστοίχηση με τις τελικές εντολές μηχανής είναι 1 1 Απλός υπολογιστής Έστω ότι θέλουμε, στο calculator, αντί να υπολογίζουμε άμεσα το αποτέλεσμα, των πράξεών μας Να παράγουμε σαν έξοδο ένα ισοδύναμο πρόγραμμα που θα περιγράφεται από μια ακολουθία εντολών κώδικα τριών διευθύνσεων Το πρόγραμμα εξόδου θα μπορεί να εκτελεστεί από ένα πολύ απλό πρόγραμμα (virtual machine) Θα μπορούμε να εκτελούμε το πρόγραμμα και να παίρνουμε αποτελέσματα πολύ πιο γρήγορα HY340, 2009 Α. Σαββίδης Slide 3 / 143 HY340, 2009 Α. Σαββίδης Slide 4 / 143
Εντολές (1/2) ADD $1, $2, $3 Προσθέτει το $2 με το $3 και αποθηκεύει το αποτέλεσμα στο $1 SUB $1, $2, $3 Αφαιρεί το $3 από το $2 και αποθηκεύει το αποτέλεσμα στο $1 MUL $1, $2, $3 Πολλαπλασιάζει το $2 με το $3 και αποθηκεύει το αποτέλεσμα στο $1 DIV $1, $2, $3 Διαιρεί το $3 από το $2 και αποθηκεύει το αποτέλεσμα στο $1 Εντολές (2/2) NEG $1 $2 Αποθηκεύει στο $1 τον αντίθετο του $2 RES $1 Τυπώνει το $1 στην οθόνη ASS $1 $2 Αναθέτει την τιμή του $2 στο $1 Επίσης Οι τελεστές των εντολών, μπορούν να είναι Μεταβλητές (που υπάρχουν στο symbol table του calculator) Σταθερές τιμές HY340, 2009 Α. Σαββίδης Slide 5 / 143 HY340, 2009 Α. Σαββίδης Slide 6 / 143 Μορφή ενδιάμεσου κώδικα (1/4) Μορφή ενδιάμεσου κώδικα (2/4) Όλες οι εντολές μας δέχονται το ΠΟΛΥ 2 τελεστές Επομένως θα πρέπει να τεμαχίζουμε τις εντολές της μορφής x = 5 + 4 * 3 / 2 8 σε ακολουθίες των προηγούμενων εντολών οι οποίες θα παράγουν τελικά ακριβώς το ίδιο αποτέλεσμα Θα πρέπει να αποθηκεύουμε κάπου τα ενδιάμεσα αποτελέσματα Θα πρέπει να εισάγουμε προσωρινές μεταβλητές για μπορούμε να περιγράψουμε την παραπάνω έκφραση με κώδικα τριών διευθύνσεων Παράδειγμα α x = 5 + 4 * 3 / 2 8 MUL x, 4, 3 DIV x, x, 2 ADD x, x, 5 SUB x, x, 8 x=5+4*3/2 8 MUL tmp1, 4, 3 DIV tmp1, tmp1, 2 ADD tmp1, tmp1, 5 SUB tmp1, tmp1, 8 ASS x, tmp1 ADD res, arg1, arg2 SUB res, arg1, arg2 MUL res, arg1, arg2 DIV res, arg1, arg2 NEG res, arg1 RES arg1 ASS res, arg1 HY340, 2009 Α. Σαββίδης Slide 7 / 143 HY340, 2009 Α. Σαββίδης Slide 8 / 143
Μορφή ενδιάμεσου κώδικα (3/4) Ή εάν δεν προσπαθήσουμε να ελαχιστοποιήσουμε τη χρήση προσωρινών μεταβλητών x = 5 + 4 * 3 / 2 8 MUL tmp1, 4, 3 DIV tmp2, tmp1, 2 ADD tmp3, tmp2, 5 SUB tmp4, tmp3, 8 ASS x, tmp4 Μορφή ενδιάμεσου κώδικα (4/4) Είμαστε σίγουροι όμως ότι όα όταντελειώσουμε ε τον υπολογισμό μιας συγκεκριμένης έκφρασης και αποθηκεύσουμε το αποτέλεσμα στην κατάλληλη μεταβλητή, οι προσωρινές μεταβλητές μπορούν να επανα-χρησιμοποιηθούν. Στην πράξη δεν είναι εύκολο να ξέρουμε πότε μπορούμε optimally να επανα-χρησιμοποιήσουμε μία προσωρινή μεταβλητή HY340, 2009 Α. Σαββίδης Slide 9 / 143 HY340, 2009 Α. Σαββίδης Slide 10 / 143 Βοηθητικές η δομές Αλλαγές στο union του yacc Διαφορετικές εντολές ενδιάμεσου δά κώδικα Εντολή Μεταβλητή αποτελέσματος Τλ Τελεστές HY340, 2009 Α. Σαββίδης Slide 11 / 143 Θέλουμε να κρατάμε πληροφορία για το πού έχει αποθηκευτεί το ενδιάμεσο αποτέλεσμα ενός epression expression HY340, 2009 Α. Σαββίδης Slide 12 / 143
Βοηθητικές η συναρτήσεις (1/2) Βοηθητικές η συναρτήσεις (2/2) Λίστα με εντολές ενδιάμεσου κώδικα Δημιουργία μίας εντολής ενδιάμεσου κώδικα (όλες τις εντολές τις κρατάμε σε μία λίστα) HY340, 2009 Α. Σαββίδης Slide 13 / 143 HY340, 2009 Α. Σαββίδης Slide 14 / 143 Παράδειγμα σε κανόνες (1/4) Παράδειγμα σε κανόνες (2/4) a = 5 + 4 * 2; a + 55; Δημιουργούμε δομές Expr στη μνήμη, ανάλογα με την εντολή HY340, 2009 Α. Σαββίδης Slide 15 / 143 HY340, 2009 Α. Σαββίδης Slide 16 / 143
Παράδειγμα σε κανόνες (3/4) Παράδειγμα σε κανόνες (4/4) a = 5 + 4 * 2; a + 55; a = 5 + 4 * 2; a + 55; HY340, 2009 Α. Σαββίδης Slide 17 / 143 HY340, 2009 Α. Σαββίδης Slide 18 / 143 Runtime Checking (1/3) Runtime Checking (2/3) Η γλώσσα alpha είναι μια dynamically typed γλώσσα (ο τύπος μιας μεταβλητής αλλάζει ακολουθώντας τον τύπο της τιμής που κάθε φορά αποθηκεύεται σε αυτήν) επομένως δεν μπορούμε κατά την μεταγλώττιση να εφαρμόσουμε έλεγχο τύπων. Δεν μπορούμε να υλοποιήσουμε πλήρη έλεγχο at compile time, για το λόγο αυτό ο έλεγχος θα γίνει at runtime. if (x > 12) a = false; else a = 3.33; 33; b = (a and c); //? x = input(); y =!x; //? Στην περίπτωση των σταθερών εκφράσεων προαιρετικά ο έλεγχος μπορεί να γίνει at compile time. a = true + 12; // Boolean + Number Error b = str1 + false; // String + Boolean Error HY340, 2009 Α. Σαββίδης Slide 19 / 143 HY340, 2009 Α. Σαββίδης Slide 20 / 143
Runtime Checking (3/3) Alpha i-code (1/3) enum iopcode { assign, add, sub, mul, div, mod, not, if_eq, if_noteq,, }; struct quad { iopcode expr* expr* expr* unsigned unsigned struct op; res; ///< result temporary (e.g. add, sub, etc) arg1; ///< first operant (e.g. add, sub, etc) arg2; ///< second operant (e.g. add, sub, etc) g label; ///< target label (e.g. jump, if _ eq, etc) line;}; struct quad quads[max_quads]; κάθε quad μπορεί να έχει label ίδιο με τη θέση του στον πίνακα HY340, 2009 Α. Σαββίδης Slide 21 / 143 HY340, 2009 Α. Σαββίδης Slide 22 / 143 Alpha i-code (2/3) enum expr_t { var_e, tableitem_e, programfunc_e, libraryfunc_e, }; struct expr { expr_t symbol* expr* double char* char }; type; sym; index; numconst; strconst; boolconst; Σε ένα quad μπορούμε δώσουμε τις παρακάτω τιμές: -τιμή συνάρτησης βιβλιοθήκης (όνομα) - τιμή συνάρτησης προγράμματος (διεύθυνση) - κρυφή μεταβλητή - μεταβλητή προγράμματος - σταθερή τιμή (string, number, boolean) HY340, 2009 Α. Σαββίδης Slide 23 / 143 Alpha i-code (3/3) Ο πίνακας για τα quads είναι δυναμικός, επομένως δεν έχουμε δείκτες ες σε quads αλλά χρησιμοποιούμε ο ούμε το index του κάθε quad για να αναφερθούμε σε αυτό. if (a > b) c = true; else c = false; index Op Result / Label Arg1 10 IF_GREATER 13 a b 11 ASSIGN c false 12 JUMP 14 13 ASSIGN c true 14 Arg2 HY340, 2009 Α. Σαββίδης 24/143
HY - 340 Γλώσσες και Μεταφραστές Φροντιστήριο if (expr) stmt if statement Intermediate Code go if skip if HY340, 2009 Α. Σαββίδης Slide 26 / 143 if..else statement while statement if (expr) stmt else stmt while (expr) stmt break list continue list HY340, 2009 Α. Σαββίδης Slide 27 / 143 HY340, 2009 Α. Σαββίδης Slide 28 / 143
for statement Ενδεικτικό παράδειγμα for (elist1; expr; elist2) stmt loop true false break list continue list closure HY340, 2009 Α. Σαββίδης Slide 29 / 143 HY340, 2009 Α. Σαββίδης Slide 30 / 143