ΕΠΛ 223 - Θεωρία και Πρακτική Μεταγλωττιστών11-1 Παραγωγή Ενδιάμεσου Κώδικα Ο ενδιάμεσος κώδικας αποτελεί τη γλώσσα επικοινωνίας ανάμεσα στο εμπρόσθιο.

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Βάσεις Δεδομένων Ευαγγελία Πιτουρά 1 Ευρετήρια.
Advertisements

Βασικές έννοιες αλγορίθμων
7.3.8 Μεταφραστές Ελληνογαλλική Σχολή Καλαμαρί - Τίκβα Χριστίνα.
Βασικές Συναρτήσεις Πινάκων
-Στοίβα-Ουρά - Πλεονεκτήματα πινάκων -Δομές δεδομένων δευτερεύουσας μνήμης -Πληροφορική και δεδομένα -Παραδείγματα-Προβλήματα ψευδοκώδικα.
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι
Εισαγωγή στους Η/Υ Πίνακες.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ Διάλεξη 2: Πίνακες και δυναμικά δεδομένα στη FORTRAN 90 Εαρινό εξάμηνο 2009 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ.
ΣΤΟΙΧΕΙΑ ΨΕΥΔΟΚΩΔΙΚΑ ΒΑΣΙΚΕΣ ΔΟΜΕΣ ΒΑΣΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ ΠΙΝΑΚΩΝ
Προγραμματισμός Ι Πίνακες •Ο πίνακας είναι μία συλλογή μεταβλητών ίδιου τύπου, οι οποίες είναι αποθηκευμένες σε διαδοχικές θέσεις μνήμης. Χρησιμοποιείται.
Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού
Πρόγραμμα Αναβάθμισης Προγράμματος Σπουδών Τμήματος Πληροφορικής Τ. Ε
HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος.
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών9-1 Στατικός Έλεγχος Με τον όρο στατικός έλεγχος (static checking) χαρακτηρίζεται ο έλεγχος της συντακτικής.
Προγραμματισμός PASCAL Πληροφορική Γ' Λυκείου μέρος γ
Προγραμματισμός στο ΜatLab
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων. Πίνακας Συμβόλων (Symbol Table) (Ι)  Είναι μια δομή στην οποία αποθηκεύονται τα ονόματα ενός προγράμματος και.
ΕΠΛ223 Θεωρία και Πρακτική Μεταγλωττιστών Εαρινό Εξάμηνο 2002 Κ. Μουρλάς, Λέκτορας Σημείωση: Οι διαφάνειες αυτές βασίζονται κατά το μεγαλύτερο μέρος τους.
Προγραμματισμός ΙΙ Διάλεξη #6: Απλές Δομές Ελέγχου Δρ. Νικ. Λιόλιος.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών5-1 Επίλυσης ασάφειας με εισαγωγή μη-τερματικών Π.χ. stmt = “if”, expr, “then”, stmt | “if”, expr, “then”,
1 Α. Βαφειάδης Αναβάθμισης Προγράμματος Σπουδών Τμήματος Πληροφορικής Τ.Ε.Ι Θεσσαλονίκης Μάθημα Προηγμένες Αρχιτεκτονικές Υπολογιστών Κεφαλαίο Τρίτο Συστήματα.
HY Γλώσσες και Μεταφραστές Φροντιστήριο Runtime Environment.
Δομές Δεδομένων 1 Στοίβα. Δομές Δεδομένων 2 Στοίβα (stack)  Δομή τύπου LIFO: Last In - First Out (τελευταία εισαγωγή – πρώτη εξαγωγή)  Περιορισμένος.
ΣΥΝΑΡΤΗΣΕΙΣ.
Τεχνολογία ΛογισμικούSlide 1 Αλγεβρική Εξειδίκευση u Καθορισμός τύπων αφαίρεσης σε όρους σχέσεων μεταξύ τύπων λειτουργιών.
ΗΥ302 Διδακτική της Πληροφορικής Η γλώσσα προγραμματισμού LOGO Writer Ομάδα Εργασία: Αλεβίζου Βασιλική (Α.Μ.:1029) Κοφφινά Ιωάννα (Α.Μ.:1035) Τριανταφυλλίδου.
Προγραμματισμός ΙΙ Διάλεξη #5: Εντολές Ανάθεσης Εντολές Συνθήκης Δρ. Νικ. Λιόλιος.
1 Οργάνωση και Αρχιτεκτονική Υπολογιστών Πρόγραμμα Αναβάθμισης Προγράμματος Σπουδών Τμήματος Πληροφορικής Τ.Ε.Ι Θεσσαλονίκης Μάθημα Οργάνωση και Αρχιτεκτονική.
ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ 2: ΘΕΜΑΤΑ ΘΕΩΡΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων Φροντιστήριο - 30/04/2009.
Lists– Λίστες 1. Αυτό-αναφορικές δομές Τα μέλη μίας δομής μπορεί να είναι οποιουδήποτε τύπου, ακόμα και δείκτες σε δομές του ίδιου τύπου. Χρησιμοποιώντας.
Ενότητα Α.4. Δομημένος Προγραμματισμός
ΕΠΛ 223 Θεωρία και Πρακτική Μεταγλωττιστών7-1 Πίνακας Συμβόλων Πίνακας συμβόλων: δομή δεδομένων που χρησιμοποιείται για την αποθήκευση διαφόρων πληροφοριών.
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
1 ΗΥ-340 Γλώσσες και Μεταφραστές Φροντιστήριο Πίνακας Συμβόλων Symbol Table.
Διαφάνειες παρουσίασης Πίνακες (συνέχεια) Αριθμητικοί υπολογισμοί Αναδρομή.
Βάσεις Δεδομένων Εργαστήριο ΙΙ Τμήμα Πληροφορικής ΑΠΘ
Δηλαδή οι σημαντικοί δεν ασχολούνται με μικροπράγματα.
ΕΡΩΤΗΜΑΤΑ ΕΠΙΛΟΓΗΣ 2 ΜΑΘΗΜΑ 8. ΑΠΑΛΟΙΦΗ ΔΙΠΛΟΕΓΓΡΑΦΩΝ DISTINCT Μπορούμε να απαλείψουμε τις διπλοεγγραφές που μας επιστρέφονται και που οφείλονται στην.
Templates Standard Template Library (STL) Exceptions Μεταπτυχιακό Πρόγραμμα Σπουδών, Τμήμα Εφαρμοσμένης Πληροφορικής.
HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος.
Δομές Δεδομένων - Ισοζυγισμένα Δυαδικά Δένδρα (balanced binary trees)
1 Βάσεις Δεδομένων ΙI Επιμέλεια: ΘΟΔΩΡΗΣ ΜΑΝΑΒΗΣ SQL (3 από 3) T Manavis.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
ΘΕΜΑΤΙΚΗ ΕΝΟΤΗΤΑ 2: ΘΕΜΑΤΑ ΘΕΩΡΗΤΙΚΗΣ ΕΠΙΣΤΗΜΗΣ Η/Υ
HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 9: Παραγωγή Ενδιάμεσου Κώδικα (Ενδιάμεσες Γλώσσες) Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής ΤΕ Ανοικτά Ακαδημαϊκά.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 12: Παραγωγή Ενδιάμεσου Κώδικα (Σημασιολογικές ρουτίνες μετάφρασης-Μέρος Β) Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 13: Επαναληπτικό μάθημα Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής ΤΕ Το περιεχόμενο του μαθήματος διατίθεται.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 8: Πίνακας Συμβόλων Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής ΤΕ Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Αθήνας.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 10: Παραγωγή Ενδιάμεσου Κώδικα (Σημασιολογικές ρουτίνες μετάφρασης-Μέρος Α) Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής.
ΗΥ-340 – Γλώσσες και Μεταφραστές Φροντιστήριο Παραγωγή τελικού κώδικα.
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
Μεταγλωττιστές (Compilers) (Θ) Ενότητα 11: Βελτιστοποίηση Ενδιάμεσου Κώδικα Κατερίνα Γεωργούλη Τμήμα Μηχανικών Πληροφορικής ΤΕ Ανοικτά Ακαδημαϊκά Μαθήματα.
1 Οργάνωση και Αρχιτεκτονική Υπολογιστών Πρόγραμμα Αναβάθμισης Προγράμματος Σπουδών Τμήματος Πληροφορικής Τ.Ε.Ι Θεσσαλονίκης Μάθημα Οργάνωση και Αρχιτεκτονική.
HY Γλώσσες και Μεταφραστές Φροντιστήριο Runtime Environment.
HY100 : ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΟΝΤΕΣ Αντώνιος Σαββίδης, Χρήστος.
ΘΠ06 - Μεταγλωττιστές Ενδιάμεσος Κώδικας – Μεταφραστικά Σχήματα.
ΕΠΛ 231 – Δομές Δεδομένων και Αλγόριθμοι 4-1 Στην ενότητα αυτή θα μελετηθεί η χρήση στοιβών στις εξής εφαρμογές: Αναδρομικές συναρτήσεις Ισοζυγισμός Παρενθέσεων.
ΗΥ-340 Γλώσσες και Μεταφραστές Φροντιστήριο Syntax Directed Translation and alpha Language.
Βασικά στοιχεία της Java
ΗΥ150 – ΠρογραμματισμόςΚώστας Παναγιωτάκης ΗΥ-150 Προγραμματισμός Τύποι Μεταβλητών Τελεστές Βασική Είσοδος/Έξοδος.
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ Διδάσκοντες:Στάθης Ζάχος Νίκος Παπασπύρου
Γλώσσες Προγραμματισμού Μεταγλωττιστές Πίνακας Συμβόλων Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
ΜΕΤΑΒΛΗΤΕΣ-ΣΤΑΘΕΡΕΣ -ΕΚΦΡΑΣΕΙΣ
ΑΛΓΟΡΙΘΜΟΣ ΠΡΟΒΛΗΜΑ ΑΛΓΟΡΙΘΜΟΣ ΛΥΣΗ
Η Γλώσσα Pascal Υποπρογράμματα
Πίνακας Συμβόλων Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΩΝ Η/Υ
Μεταγράφημα παρουσίασης:

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

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

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

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

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

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

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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:

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

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

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

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

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

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

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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}

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

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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.

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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);}

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

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

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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); }

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

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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++).

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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.

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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}

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

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

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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Δ

ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών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 = ε

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