1 / 32

Π αραγωγή Ενδιάμεσου Κώδικα

Π αραγωγή Ενδιάμεσου Κώδικα. Ο ενδιάμεσος κώδικας αποτελεί τη γλώσσα επικοινωνίας ανάμεσα στο εμπρόσθιο και οπίσθιο τμήμα ενός μεταγλωττιστή. Ο χωρισμός σε εμπρόσθιο και ενδιάμεσο τμήμα επιτρέπει: Τη δημιουργία μεταγλωττιστών για νέες αρχιτεκτονικές με αλλαγή μόνο του οπίσθιου τμήματος.

Download Presentation

Π αραγωγή Ενδιάμεσου Κώδικα

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Παραγωγή Ενδιάμεσου Κώδικα • Ο ενδιάμεσος κώδικας αποτελεί τη γλώσσα επικοινωνίας ανάμεσα στο εμπρόσθιο και οπίσθιο τμήμα ενός μεταγλωττιστή. • Ο χωρισμός σε εμπρόσθιο και ενδιάμεσο τμήμα επιτρέπει: • Τη δημιουργία μεταγλωττιστών για νέες αρχιτεκτονικές με αλλαγή μόνο του οπίσθιου τμήματος. • Τη βελτιστοποίηση στο επίπεδο της αφηρημένης μηχανής του ενδιάμεσου κώδικα. • Τυπικά ο ενδιάμεσος κώδικας παράγεται από μία μετάφραση κατευθυνόμενη από τη σύνταξη. ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  2. Ενδιάμεσες Γλώσσες • Η γλώσσα στην οποία εκφράζεται ο ενδιάμεσος κώδικας πρέπει: • Να είναι ικανή να εκφράσει τις λειτουργίες των γλωσσών υψηλού επιπέδου. • Να είναι δυνατό να μεταφραστεί εύκολα και αποδοτικά (δηλ. να μπορεί να εκμεταλλευτεί πρόσθετες δυνατότητες) στην εκάστοτε γλώσσα μηχανής. • Συνήθως χρησιμοποιούνται οι εξής ενδιάμεσες γλώσσες: • Αφηρημένα συντακτικά δένδρα ή γράφοι • Επιθεματικός κώδικας • Κώδικας τριών διευθύνσεων ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  3. Γραφικές Ενδιάμεσες Γλώσσες • Αφηρημένα συντακτικά δένδρα (AST): συντακτικά δένδρα στα οποία δεν υπάρχουν μη-τερματικά σύμβολα. • Ακυκλικοί κατευθυνόμενοι γράφοι (DAG): προκύπτουν με τροποποίηση των συναρτήσεων mknode & mkleaf, της της μετάφρασης που παράγει το AST (απαλειφή κοινών υποεκφράσεων). • Παράδειγμα: a = b * - c + b * - c ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  4. Δημιουργία ΑST & DAG • H δημιουργία γίνεται με την βοήθεια μετάφρασης οδηγούμενη από τη σύνταξη. Π.χ. • H υλοποίηση του δένδρου μπορεί να γίνει με τη μορφή πίνακα: ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  5. Επιθεματικός Κώδικας • Ο επιθεματικός κώδικας (postfix notation) είναι μία γραμμική αναπαράσταση του αφηρημένου συντακτικού δένδρου. • Σχηματίζεται τοποθετώντας τους κόμβους του δένδρου σε μία λίστα, ώστε ένας κόμβος να εμφανίζεται αμέσως μετά τα παιδιά του. Π.χ. για το προηγούμενο παράδειγμα : a b c uminus * b c uminus * + assign • H λειτουργία του βασίζεται στην ύπαρξη μίας στοίβας στο οποίο τοποθετούνται όλοι οι κόμβοι. Η τοποθέτηση ενός τελεστή πυροδοτεί την εκτέλεσή του, την αφαίρεση των ορισμάτων του από τη στοίβα και την τοποθέτηση του αποτελέσματος. • Η στοίβα περιορίζει τις δυνατές βελτιστοποιήσεις καθώς ελαττώνει τις δυνατές τροποποιήσεις στη θέση των κόμβων. ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  6. Κώδικας Τριών Διευθύνσεων • Ο κώδικας τριών διευθύνσεων (ΚΤΔ) αποτελείται από εντολές της μορφής: x := y op z όπου x, y, z είναι ονόματα μεταβλητών, σταθερές ή βοηθητικές μεταβλητές που δημιουργεί ο μεταγλωττιστής. • O χαρακτηρισμός «κώδικας τριών διευθύνσεων» προέρχεται από το γεγονός ότι κάθε εντολή περιέχει τρείς διευθύνσεις. • Ο ΚΤΔ δεν επιτρέπει την άμεση αναπαράσταση περίπλοκων εκφράσεων. Π.χ. για την έκφραση x+y*z έχουμε: t1 := y * z t2 := x + t1 ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  7. Τύποι εντολών ΚΤΔ • Εντολές εκχώρησης (assignment) x := y op z x := op y (μοναδιαίος τελεστής) x := y (αντιγραφή) • Eντολές διακλάδωσης με και χωρίς συνθήκη goto L (όπου L ετικέτα) if x relop y goto L (όπου relop σχεσιακός τελεστής: <, =, κλπ) • Ετικέτες L: ή label L ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  8. Τύποι εντολών ΚΤΔ (2) • Κλήσης διαδικασιών param x τοποθέτηση της παραμέτρου x στη στοίβα call p, n κλήση της διαδικασίας p με n παραμέτρους return y επιστροφή της τιμής y Π.χ. για την κλήση της διαδικασίας p(x1, x2, …, xn): param x1 param x2 … call p, n • Εντολές προσπέλασης πινάκων x := y[i] θέσε το x ίσο με τα περιεχόμενα της θέσης μνήμης που βρίσκεται απόσταση i από τη θέση y x[i] := y ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  9. Τύποι εντολών ΚΤΔ (3) • Εντολές δεικτών και διευθυνσιοδότησης (pointers & addressing) x := &y δώσε στο x την διεύθυνση του y x := *y δώσε στο x τα περιεχόμενα της διεύθυνση που περιέχεται στο y *x := y • Π.χ. if (x == 0) then y=1 else y=3 if x = 0 goto L1 y := 3 goto L2 L1: y := 1 L2: ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  10. Παραγωγή ΚΤΔ • H παραγωγή ΚΤΔ επιτυγχάνεται με τη χρήση μετάφρασης κατευθυνόμενης από τη σύνταξη. • Κατά την παραγωγή χρησιμοποιούμε για κάθε σύμβολο της γραμματικής μία σειρά από χαρακτηριστικά (attributes) που μας επιτρέπουν να αναφερόμαστε σε σχετικές διευθύνσεις καθώς και στον κώδικα που τα υπολογίζει. • Χαρακτηριστικά για εκφράσεις E (expressions): • E.place : η διεύθυνση που κρατά την τιμή της Ε • E.code : ο κώδικας που υπολογίζει την Ε • Χαρακτηριστικά για πρότάσεις S (statements): • S.begin : η διεύθυνση της πρώτης εντολής του κώδικα της S • S.after : η διεύθυνση της πρώτης εντολής μετά την S ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  11. Βοηθητικές Συναρτήσεις • Κατά την παραγωγή του ΚΤΔ απαιτείται η δέσμευση προσωρινής μνήμης ή η παραγωγή ετικετών για αναφορά από τις εντολές διακλάδωσης. Οι ακόλουθες συναρτήσεις επιτελούν αυτές και άλλες λειτουργίες: • newtemp() : επιστρέφει το όνομα (ή το δείκτη στον πίνακα συμβόλων) μίας καινούργιας προσωρινής μεταβλητής κάθε φορά που καλείται. Ενδεχομένως να δέχεται ως παράμετρο τον τύπο της μεταβλητής. • newlabel() : επιστρέφει μία νέα ετικέτα • gen() : παράγει το ΚΤΔ που της δίνεται ως παράμετρο. Η παραγωγή μπορεί να συνίσταται στη χρήση ειδικής αναπαράστασης (π.χ. πίνακας εγγραφών) ή στην αποθήκευση του ενδιάμεσου κώδικα σε αρχείο. Π.χ. gen(x “:=” y “+” z) ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  12. Παράδειγμα : ΚΤΔ για εκφράσεις ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  13. Παράδειγμα : μετάφραση WHILE ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  14. Αναπαράσταση του ΚΤΔ • Κάθε εντολή του ΚΤΔ μπορεί να αναπαρασταθεί με τη μορφή μίας εγγραφής με κατάλληλα πεδία. Η επικρατέστερη αναπαράσταση είναι με τη χρήση τετράδων (quadruples). Π.χ. x := y + z if t1 > t2 goto L • Στην πράξη, η διαφοροποίηση ανάμεσα σε παραμέτρους που είναι π.χ. σταθερές ή διευθύνσεις, μπορεί να γίνει είτε με χρήση ψηφίων (bits) στο πεδίο του τελεστή ή με πρόσθετα πεδία. ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  15. Δηλώσεις Μεταβλητών • Συνήθως, κατά την παραγωγή του ενδιάμεσου αλλά και του τελικού κώδικα, δεν είναι γνωστές οι απόλυτες θέσεις στη μνήμη των μεταβλητών.Έτσι, συνηθίζεται να τις τοποθετούμε σε μία κοινή περιοχή (π.χ. data segment, ή stack segment για τοπικές μεταβλητές) και να χρησιμοποιούμε ως διεύθυνσή τους την απόστασή τους (offset) από την αρχή της περιοχής. ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  16. Aντίστοιχο Σχέδιο Μετάφρασης P = {offset = 0}, D D = D, D D = id, “:” , T, {enter(id.name, T.type, offset); offset += T.width} T = integer, {T.type = integer; T.width = 4} T = real , {T.type = real; T.width = 8} T = array,“[”,num, “]”, of, T1, {T.type=array(num.val,T1.type); T.width = num.val * T1.width} ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  17. Τοπικές μεταβλητές • Μία από τις πιο συνηθισμένες προσεγγίσεις για τη διαχείριση των τοπικά ορισμένων αναγνωριστικών, είναι η δημιουργία ενός ξεχωριστού πίνακα συμβόλων. • Για την πιο δύσκολη περίπτωση των φωλιασμένων διαδικασιών, η χρήση των ξεχωριστών πινάκων συμβόλων μπορεί να συνδυαστεί με δύο στοίβες: • tblptr : η οποία περιέχει δείκτες στους πίνακες συμβόλων των φωλιασμένων διαδικασιών. • offset : η οποία περιέχει τις αποστάσεις του διαθέσιμου χώρου κάθε διαδικασίας από την αρχή του χώρου των μεταβλητών. • Όποτε μπαίνουμε στο σώμα μίας διαδικασίας, δημιουργούμε ένα καινούργιο πίνακα συμβόλων και βάζουμε τη διεύθυνσή του στη στοίβα tblptr. Αντίστοιχα, τοποθετούμε την τιμή 0 (νέο offset=0) στη στοίβα offset. ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  18. Παράδειγμα program sort(input, output); var a : array[0..10] of integer; x : integer; procedure readarray; var i: integer; begin … end; procedure exchange(i, j : integer); begin … end; procedure quicksort(m, n: integer); var k, v : integer; function partition(y,z : integer) : integer; var i, j : integer; begin … end ; begin… end; begin … end. ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  19. Παράδειγμα Σχεδίου Μετάφρασης P = M, D, { addwidth(top(tblptr), top(offset)); pop(tblptr); pop(offset);} M = ε , {t = mktable(nil); push(t, tblptr); push(0, offset);} D = D1, “;”, D2, D = proc, id, “;”, N, D1, “;”, S, {t=top(tblptr); addwidth(t, top(offset)); pop(tblptr); pop(offset); enterproc(top(tblptr), id.name, t);} D = id, “:”, T, { enter(top(tblptr), id.name, T.type, top(offset)); top(offset)+= T.size; } N = ε , {t = mktable(top(tblptr)); push(t, tblptr); push(0, offset);} ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  20. Απεικόνιση της οργάνωσης των Π.Σ. ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  21. Επεξήγηση Συναρτήσεων • mktable(previous) : δημιουργεί ένα καινούργιο πίνακα συμβόλων και επιστρέφει ένα δείκτη σε αυτόν. Ο δείκτης previous αφορά το πίνακα συμβόλων της διαδικασίας που περιέχει αυτή που εξετάζουμε και καταχωρείται στα δεδομένα του νέου πίνακα, ώστε να είναι δυνατή η αναζήτηση μη-τοπικών μεταβλητών. • enter(table, name, type, offset): εισάγει τη μεταβλητή με όνομα name, τύπο type και διεύθυνση offset στον πίνακα συμβόλων table. • addwidth(table, width): καταχωρεί στον πίνακα table το μέγεθος των τοπικών δεδομένων. • enterproc(table, name, newtable): εισάγει τη διαδικασία με όνομα name και πίνακα συμβόλων newtable, στο πίνακα συμβόλων της διαδικασίας που την περιέχει. ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  22. Εγγραφές (records) • Η καταχώρηση των πεδίων των εγγραφών γίνεται επίσης με δημιουργία ενός νέου πίνακα συμβόλων. • Π.χ. R = struct, L, D, “;” , { T.type = record(top(tblptr)); T.size = top(offset); pop(tblptr); pop(offset);} L = ε, {t = mktable(nil); push(t, tblptr); push(0,offset); } ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  23. Μεταβλητές - Πίνακες • H διεύθυνση του i-στού στοιχείου ενός πίνακα ορισμένου ως εξής: T[low...high], προυποθέτοντας ότι την αποθήκευση των στοιχείων του πίνακα σε διαδοχικές θέσεις μνήμης, δίνεται από την σχέση: base + (i - low)*w όπου base : είναι η διεύθυνση της βάσης του πίνακα w : το μέγεθος των στοιχείων του πίνακα. Η σχέση αυτή μπορεί να γραφτεί και ως εξής: i*w + (base - low*w) όπου ο δεύτερος όρος του αθροίσματος είναι σταθερός, μπορεί να υπολογιστεί κατά την μεταγλώττιση και να αποθηκευτεί ως χαρακτηριστικό του πίνακα. ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  24. Μεταβλητές - Πίνακες (2) • Για διδιάστατο πίνακα Τ[low1…high1, low2…high2] με οργάνωση κατά γραμμές (row-major) η διεύθυνση του στοιχείου Τ[i1, i2] είναι: base + ((i1-low1)*(high2-low2) + i2-low2)*w = = (i1*(high2-low2) + i2)*w + + base - (low1*(high2-low2) -low2)*w • Παραγωγή ΚΤΔ: Var = id, “[”, {IDX.array = lookup(id.name);}, IDX, “]” IDX = E, {t = newtemp; gen(t “=” E.place “*” w(IDX.array)); gen(t “=” t “+” c(IDX.array)) ; IDX.place = t;} σταθερά c ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  25. Λογικές εκφράσεις • Mία πρώτη προσέγγιση στην παραγωγή ΚΤΔ για τον υπολογισμό λογικών εκφράσεων είναι η ακόλουθη: ΒΕxpr = E1, relop, E2, { E1.code || E2.code || t = newtemp; L = newlabel; gen(t “=” 1); gen(if E1.place relop E2.place goto L); gen(t “=” 0); gen(L “:”); } • To πρόβλημα με την παραπάνω προσέγγιση είναι ότι σε πολλές περιπτώσεις δεν είναι αναγκαίος ο υπολογισμός και των δύο υποεκφράσεων. Εξαίρεση αποτελεί η περίπτωση που αυτές προκαλούν άλλα επακόλουθα (side-effects), π.χ. Ι AND (j++). ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  26. Bραχυκυκλωμένες Λογικές Εκφράσεις • Εναλλακτικά, μπορούμε να “βραχυκυκλώσουμε” (short-circuit) τον υπολογισμό των υποεκφράσεων κάνοντας χρήση δύο χαρακτηριστικών: ΒΕxpr.trueκαι ΒΕxpr.false, και δημιουργώντας για κάθε λογική έκφραση ΚΤΔ της μορφής: if Bexpr.place = 1 goto BExpr.true goto Bexpr.false δηλ. κωδικοποιώντας την τιμή της έκφρασης ανάλογα με το σημείο του κώδικα που μεταβαίνουμε. • Στην περίπτωση που έχουμε μία έκφραση της μορφής E = E1 AND E2 μπορούμε να θέσουμε E1.false = E.false ώστε να μην απαιτείται o υπολογισμός του Ε2. ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  27. Bραχυκυκλωμένες Λογικές Εκφράσεις (2) E = E1, AND, E2, { Ε1.true = newlabel; E1.false = E.false; E2.true = E.true; E2.false = E.false; E.code = E1.code || gen(E1.true “:”) || E2.code} E = E1, OR, E2, { Ε1.false = newlabel; E1.true = E.false; E2.true = E.true; E2.false = E.false; E.code = E1.code || gen(E1.false “:”) || E2.code} E = not, E1, { Ε1.false = E.true; E1.true = E.false; E.code = E1.code} ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  28. Εντολές Ελέγχου ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  29. Προτάσεις switch-case • Το κλειδί στην υλοποίηση μίας πρότασης switch είναι η επιλογή του τρόπου διακλάδωσης: • Αν ο αριθμός των περιπτώσεων (cases) είναι μικρός π.χ. ~10, η παραγωγή ΚΤΔ μπορεί να βασιστεί σε διαδοχικές εντολές if … goto • Aν ο αριθμός των καταστάσεων είναι μεγάλος μπορούμε να κατασκευάσουμε ένα πίνακα κατακερματισμού (hash) με κλειδιά τις τιμές των προτάσεων case και τιμές τις ετικέτες των goto. • Αν οι εντολές case χρησιμοπoιούν ένα μικρό διάστημα τιμών, μπορούμε να κατασκευάσουμε ένα πίνακα με τις διευθύνσεις των μεταβάσεων (jump table). • Σε περίπτωση αποτυχίας εύρεσης της κατάλληλης τιμής με τους παραπάνω τρόπους, κάνουμε goto default. ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  30. Παράδειγμα ΚΤΔ για εντολές switch switch E { begin case V1 : S1 case V2 : S2 … case Vn-1: Sn-1 default : Sn end E.code goto test L1: S1.code goto next L2: S2.code goto next … Ln: Sn.code goto next test: if E.place = V1 goto L1 if E.place = V2 goto L2 … goto Ln next: KTΔ ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  31. Παραγωγή ΚΤΔ για switch-case SS = switch, E, begin, {LC.next = newlabel; LC.ctrl_var = E.place}, LC, end, {SS.code = E.code || LC.code || || gen(LC.next “:”) } LC = {LC1.next = LC.next; LC1.ctrl_var = LC.ctrl_var} LC1, case, E, “:”, S, { L = newlabel; LC.code = LC1.code || gen( if LC.ctrl_var “!=” E.place goto L) || S.code || gen( goto LC.next) || gen( L “:”);} LC = ε ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

  32. Aναδρομική Κατάβαση (backpatching) • Η πλειψηφία των σχεδίων μετάφρασης που προηγήθηκαν δεν βασίζονται σε ορισμούς L, δηλ. απαιτούν δύο περάσματα για τη δημιουργία ενδιάμεσου κώδικα.Π.χ. δεν γνωρίζουμε που ακριβώς πρέπει να γίνει μετάβαση (goto) την στιγμή που παράγεται η αντίστοιχη εντολή: • Το πρόβλημα μπορεί να λυθεί χωρίς να καταφύγουμε σε πολ-λαπλά περάσματα με την αναδρομική κατάβαση, η οποία συνίσταται στην κατασκευή λιστών από τις εντολές μετάβα-σης (goto, if… goto) για τις οποίες δεν είναι γνωστός ο προ-ορισμός. Όταν ο τελευταίος γίνει γνωστός, επισκεπτόμαστε τα μέλη της αντίστοιχης λίστας και συμπληρώνουμε τα αντίστοιχα πεδία. ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών

More Related