Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
ΔημοσίευσεHercules Kairis Τροποποιήθηκε πριν 10 χρόνια
1
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-1 Παραγωγή Ενδιάμεσου Κώδικα Ο ενδιάμεσος κώδικας αποτελεί τη γλώσσα επικοινωνίας ανάμεσα στο εμπρόσθιο και οπίσθιο τμήμα ενός μεταγλωττιστή. Ο χωρισμός σε εμπρόσθιο και ενδιάμεσο τμήμα επιτρέπει: –Τη δημιουργία μεταγλωττιστών για νέες αρχιτεκτονικές με αλλαγή μόνο του οπίσθιου τμήματος. –Τη βελτιστοποίηση στο επίπεδο της αφηρημένης μηχανής του ενδιάμεσου κώδικα. Τυπικά ο ενδιάμεσος κώδικας παράγεται από μία μετάφραση κατευθυνόμενη από τη σύνταξη.
2
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-2 Ενδιάμεσες Γλώσσες Η γλώσσα στην οποία εκφράζεται ο ενδιάμεσος κώδικας πρέπει: –Να είναι ικανή να εκφράσει τις λειτουργίες των γλωσσών υψηλού επιπέδου. –Να είναι δυνατό να μεταφραστεί εύκολα και αποδοτικά (δηλ. να μπορεί να εκμεταλλευτεί πρόσθετες δυνατότητες) στην εκάστοτε γλώσσα μηχανής. Συνήθως χρησιμοποιούνται οι εξής ενδιάμεσες γλώσσες: – Αφηρημένα συντακτικά δένδρα ή γράφοι – Επιθεματικός κώδικας – Κώδικας τριών διευθύνσεων
3
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-3 Γραφικές Ενδιάμεσες Γλώσσες Αφηρημένα συντακτικά δένδρα (AST): συντακτικά δένδρα στα οποία δεν υπάρχουν μη-τερματικά σύμβολα. Ακυκλικοί κατευθυνόμενοι γράφοι (DAG): προκύπτουν με τροποποίηση των συναρτήσεων mknode & mkleaf, της της μετάφρασης που παράγει το AST (απαλειφή κοινών υποεκφράσεων). Παράδειγμα: a = b * - c + b * - c
4
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-4 Δημιουργία ΑST & DAG H δημιουργία γίνεται με την βοήθεια μετάφρασης οδηγούμενη από τη σύνταξη. Π.χ. H υλοποίηση του δένδρου μπορεί να γίνει με τη μορφή πίνακα:
5
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-5 Επιθεματικός Κώδικας Ο επιθεματικός κώδικας (postfix notation) είναι μία γραμμική αναπαράσταση του αφηρημένου συντακτικού δένδρου. Σχηματίζεται τοποθετώντας τους κόμβους του δένδρου σε μία λίστα, ώστε ένας κόμβος να εμφανίζεται αμέσως μετά τα παιδιά του. Π.χ. για το προηγούμενο παράδειγμα : a b c uminus * b c uminus * + assign H λειτουργία του βασίζεται στην ύπαρξη μίας στοίβας στο οποίο τοποθετούνται όλοι οι κόμβοι. Η τοποθέτηση ενός τελεστή πυροδοτεί την εκτέλεσή του, την αφαίρεση των ορισμάτων του από τη στοίβα και την τοποθέτηση του αποτελέσματος. Η στοίβα περιορίζει τις δυνατές βελτιστοποιήσεις καθώς ελαττώνει τις δυνατές τροποποιήσεις στη θέση των κόμβων.
6
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-6 Κώδικας Τριών Διευθύνσεων Ο κώδικας τριών διευθύνσεων (ΚΤΔ) αποτελείται από εντολές της μορφής: x := y op z όπου x, y, z είναι ονόματα μεταβλητών, σταθερές ή βοηθητικές μεταβλητές που δημιουργεί ο μεταγλωττιστής. O χαρακτηρισμός «κώδικας τριών διευθύνσεων» προέρχεται από το γεγονός ότι κάθε εντολή περιέχει τρείς διευθύνσεις. Ο ΚΤΔ δεν επιτρέπει την άμεση αναπαράσταση περίπλοκων εκφράσεων. Π.χ. για την έκφραση x+y*z έχουμε: t1 := y * z t2 := x + t1
7
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-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
8
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-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
9
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-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:
10
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-10 Παραγωγή ΚΤΔ H παραγωγή ΚΤΔ επιτυγχάνεται με τη χρήση μετάφρασης κατευθυνόμενης από τη σύνταξη. Κατά την παραγωγή χρησιμοποιούμε για κάθε σύμβολο της γραμματικής μία σειρά από χαρακτηριστικά (attributes) που μας επιτρέπουν να αναφερόμαστε σε σχετικές διευθύνσεις καθώς και στον κώδικα που τα υπολογίζει. Χαρακτηριστικά για εκφράσεις E (expressions): –E.place: η διεύθυνση που κρατά την τιμή της Ε –E.code: ο κώδικας που υπολογίζει την Ε Χαρακτηριστικά για πρότάσεις S (statements): –S.begin: η διεύθυνση της πρώτης εντολής του κώδικα της S –S.after: η διεύθυνση της πρώτης εντολής μετά την S
11
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-11 Βοηθητικές Συναρτήσεις Κατά την παραγωγή του ΚΤΔ απαιτείται η δέσμευση προσωρινής μνήμης ή η παραγωγή ετικετών για αναφορά από τις εντολές διακλάδωσης. Οι ακόλουθες συναρτήσεις επιτελούν αυτές και άλλες λειτουργίες: –newtemp() : επιστρέφει το όνομα (ή το δείκτη στον πίνακα συμβόλων) μίας καινούργιας προσωρινής μεταβλητής κάθε φορά που καλείται. Ενδεχομένως να δέχεται ως παράμετρο τον τύπο της μεταβλητής. –newlabel() : επιστρέφει μία νέα ετικέτα –gen() : παράγει το ΚΤΔ που της δίνεται ως παράμετρο. Η παραγωγή μπορεί να συνίσταται στη χρήση ειδικής αναπαράστασης (π.χ. πίνακας εγγραφών) ή στην αποθήκευση του ενδιάμεσου κώδικα σε αρχείο. Π.χ. gen(x “:=” y “+” z)
12
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-12 Παράδειγμα : ΚΤΔ για εκφράσεις
13
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-13 Παράδειγμα : μετάφραση WHILE
14
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-14 Αναπαράσταση του ΚΤΔ Κάθε εντολή του ΚΤΔ μπορεί να αναπαρασταθεί με τη μορφή μίας εγγραφής με κατάλληλα πεδία. Η επικρατέστερη αναπαράσταση είναι με τη χρήση τετράδων (quadruples). Π.χ. x := y + zif t1 > t2 goto L Στην πράξη, η διαφοροποίηση ανάμεσα σε παραμέτρους που είναι π.χ. σταθερές ή διευθύνσεις, μπορεί να γίνει είτε με χρήση ψηφίων (bits) στο πεδίο του τελεστή ή με πρόσθετα πεδία.
15
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-15 Δηλώσεις Μεταβλητών Συνήθως, κατά την παραγωγή του ενδιάμεσου αλλά και του τελικού κώδικα, δεν είναι γνωστές οι απόλυτες θέσεις στη μνήμη των μεταβλητών.Έτσι, συνηθίζεται να τις τοποθετούμε σε μία κοινή περιοχή (π.χ. data segment, ή stack segment για τοπικές μεταβλητές) και να χρησιμοποιούμε ως διεύθυνσή τους την απόστασή τους (offset) από την αρχή της περιοχής.
16
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-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, T 1, {T.type=array(num.val,T 1.type); T.width = num.val * T 1.width}
17
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-17 Τοπικές μεταβλητές Μία από τις πιο συνηθισμένες προσεγγίσεις για τη διαχείριση των τοπικά ορισμένων αναγνωριστικών, είναι η δημιουργία ενός ξεχωριστού πίνακα συμβόλων. Για την πιο δύσκολη περίπτωση των φωλιασμένων διαδικασιών, η χρήση των ξεχωριστών πινάκων συμβόλων μπορεί να συνδυαστεί με δύο στοίβες: –tblptr : η οποία περιέχει δείκτες στους πίνακες συμβόλων των φωλιασμένων διαδικασιών. –offset : η οποία περιέχει τις αποστάσεις του διαθέσιμου χώρου κάθε διαδικασίας από την αρχή του χώρου των μεταβλητών. Όποτε μπαίνουμε στο σώμα μίας διαδικασίας, δημιουργούμε ένα καινούργιο πίνακα συμβόλων και βάζουμε τη διεύθυνσή του στη στοίβα tblptr. Αντίστοιχα, τοποθετούμε την τιμή 0 (νέο offset=0) στη στοίβα offset.
18
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-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.
19
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-19 Παράδειγμα Σχεδίου Μετάφρασης P = M, D, { addwidth(top(tblptr), top(offset)); pop(tblptr); pop(offset);} M = ε, {t = mktable(nil); push(t, tblptr); push(0, offset);} D = D 1, “;”, D 2, D = proc, id, “;”, N, D 1, “;”, 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);}
20
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-20 Απεικόνιση της οργάνωσης των Π.Σ.
21
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-21 Επεξήγηση Συναρτήσεων mktable(previous) : δημιουργεί ένα καινούργιο πίνακα συμβόλων και επιστρέφει ένα δείκτη σε αυτόν. Ο δείκτης previous αφορά το πίνακα συμβόλων της διαδικασίας που περιέχει αυτή που εξετάζουμε και καταχωρείται στα δεδομένα του νέου πίνακα, ώστε να είναι δυνατή η αναζήτηση μη-τοπικών μεταβλητών. enter(table, name, type, offset): εισάγει τη μεταβλητή με όνομα name, τύπο type και διεύθυνση offset στον πίνακα συμβόλων table. addwidth(table, width): καταχωρεί στον πίνακα table το μέγεθος των τοπικών δεδομένων. enterproc(table, name, newtable): εισάγει τη διαδικασία με όνομα name και πίνακα συμβόλων newtable, στο πίνακα συμβόλων της διαδικασίας που την περιέχει.
22
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-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); }
23
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-23 Μεταβλητές - Πίνακες H διεύθυνση του i-στού στοιχείου ενός πίνακα ορισμένου ως εξής: T[low...high], προυποθέτοντας ότι την αποθήκευση των στοιχείων του πίνακα σε διαδοχικές θέσεις μνήμης, δίνεται από την σχέση: base + (i - low)*w όπου base : είναι η διεύθυνση της βάσης του πίνακα w : το μέγεθος των στοιχείων του πίνακα. Η σχέση αυτή μπορεί να γραφτεί και ως εξής: i*w + (base - low*w) όπου ο δεύτερος όρος του αθροίσματος είναι σταθερός, μπορεί να υπολογιστεί κατά την μεταγλώττιση και να αποθηκευτεί ως χαρακτηριστικό του πίνακα.
24
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-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
25
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-25 Λογικές εκφράσεις Mία πρώτη προσέγγιση στην παραγωγή ΚΤΔ για τον υπολογισμό λογικών εκφράσεων είναι η ακόλουθη: ΒΕxpr = E 1, relop, E 2, { E 1.code || E 2.code || t = newtemp; L = newlabel; gen(t “=” 1); gen(if E 1.place relop E 2.place goto L); gen(t “=” 0); gen(L “:”); } To πρόβλημα με την παραπάνω προσέγγιση είναι ότι σε πολλές περιπτώσεις δεν είναι αναγκαίος ο υπολογισμός και των δύο υποεκφράσεων. Εξαίρεση αποτελεί η περίπτωση που αυτές προκαλούν άλλα επακόλουθα (side- effects), π.χ. Ι AND (j++).
26
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-26 Bραχυκυκλωμένες Λογικές Εκφράσεις Εναλλακτικά, μπορούμε να “βραχυκυκλώσουμε” (short- circuit) τον υπολογισμό των υποεκφράσεων κάνοντας χρήση δύο χαρακτηριστικών: ΒΕxpr.true και ΒΕxpr.false, και δημιουργώντας για κάθε λογική έκφραση ΚΤΔ της μορφής: if Bexpr.place = 1 goto BExpr.true goto Bexpr.false δηλ. κωδικοποιώντας την τιμή της έκφρασης ανάλογα με το σημείο του κώδικα που μεταβαίνουμε. Στην περίπτωση που έχουμε μία έκφραση της μορφής E = E 1 AND E 2 μπορούμε να θέσουμε E 1.false = E.false ώστε να μην απαιτείται o υπολογισμός του Ε 2.
27
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-27 Bραχυκυκλωμένες Λογικές Εκφράσεις (2) E = E 1, AND, E 2, { Ε 1.true = newlabel; E 1.false = E.false; E 2.true = E.true; E 2.false = E.false; E.code = E 1.code || gen(E 1.true “:”) || E 2.code} E = E 1, OR, E 2, { Ε 1.false = newlabel; E 1.true = E.false; E 2.true = E.true; E 2.false = E.false; E.code = E 1.code || gen(E 1.false “:”) || E 2.code} E = not, E 1, { Ε 1.false = E.true; E 1.true = E.false; E.code = E 1.code}
28
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-28 Εντολές Ελέγχου
29
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-29 Προτάσεις switch-case Το κλειδί στην υλοποίηση μίας πρότασης switch είναι η επιλογή του τρόπου διακλάδωσης: –Αν ο αριθμός των περιπτώσεων (cases) είναι μικρός π.χ. ~10, η παραγωγή ΚΤΔ μπορεί να βασιστεί σε διαδοχικές εντολές if … goto –Aν ο αριθμός των καταστάσεων είναι μεγάλος μπορούμε να κατασκευάσουμε ένα πίνακα κατακερματισμού (hash) με κλειδιά τις τιμές των προτάσεων case και τιμές τις ετικέτες των goto. –Αν οι εντολές case χρησιμοπoιούν ένα μικρό διάστημα τιμών, μπορούμε να κατασκευάσουμε ένα πίνακα με τις διευθύνσεις των μεταβάσεων (jump table). Σε περίπτωση αποτυχίας εύρεσης της κατάλληλης τιμής με τους παραπάνω τρόπους, κάνουμε goto default.
30
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-30 Παράδειγμα ΚΤΔ για εντολές switch switch E { begin case V 1 :S 1 case V 2 :S 2 … case V n-1 :S n-1 default :S n end E.code goto test L 1 :S 1.code goto next L 2 :S 2.code goto next … L n :S n.code goto next test:if E.place = V 1 goto L 1 if E.place = V 2 goto L 2 … goto L n next: KTΔ
31
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-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 = ε
32
ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-32 Aναδρομική Κατάβαση (backpatching) Η πλειψηφία των σχεδίων μετάφρασης που προηγήθηκαν δεν βασίζονται σε ορισμούς L, δηλ. απαιτούν δύο περάσματα για τη δημιουργία ενδιάμεσου κώδικα.Π.χ. δεν γνωρίζουμε που ακριβώς πρέπει να γίνει μετάβαση (goto) την στιγμή που παράγεται η αντίστοιχη εντολή: Το πρόβλημα μπορεί να λυθεί χωρίς να καταφύγουμε σε πολ- λαπλά περάσματα με την αναδρομική κατάβαση, η οποία συνίσταται στην κατασκευή λιστών από τις εντολές μετάβα- σης (goto, if… goto) για τις οποίες δεν είναι γνωστός ο προ- ορισμός. Όταν ο τελευταίος γίνει γνωστός, επισκεπτόμαστε τα μέλη της αντίστοιχης λίστας και συμπληρώνουμε τα αντίστοιχα πεδία.
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.