ΕΠΛ223 Θεωρία και Πρακτική Μεταγλωττιστών Εαρινό Εξάμηνο 2002 Κ. Μουρλάς, Λέκτορας Σημείωση: Οι διαφάνειες αυτές βασίζονται κατά το μεγαλύτερο μέρος τους στο υλικό που δόθηκε από τον Επισκέπτη Επίκ. Καθηγητή Γ. Μπαρλά στα πλαίσια αυτού του μαθήματος που διδάχθηκε κατά το ακαδημαϊκό έτος
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-2 Τι είναι οι μεταγλωττιστές; Μετασχηματισμός από μία αναπαράσταση ενός προγράμματος σε μία άλλη Η τυπική εικόνα
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-3 Το μοντέλο της ανάλυσης-σύνθεσης Synthesis - Analysis –Ανάλυση του πηγαίου κώδικα –Σύνθεση του κώδικα στην τελική γλώσσα Άλλα προγράμματα που ακολουθούν τον κύκλο αυτό και που σε γενικές γραμμές μπορούν να χαρακτηριστούν μεταγλωττιστές: –Συστήματα διαμόρφωσης κειμένου (text formatters, π.χ. TeX) –Μεταγλωττιστές σιλικόνης (Silicon Compilers)
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-4 Απαιτήσεις κατασκευής μεταγλωττιστή Απαιτήσεις από τον μεταγλωττιστή –αξιοπιστία –γρήγορη εκτέλεση –μικρές απαιτήσεις σε μνήμη –καλά διαγνωστικά μηνύματα –δυνατότητα ανάνηψης από λάθη –μεταφερσιμότητα –εύκολη συντήρηση Απαιτήσεις από τον τελικό κώδικα –γρήγορη εκτέλεση –μικρές απαιτήσεις σε μνήμη
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-5 Πηγαίος Κώδικας Διαμορφωμένος με στόχο την εύκολη ανάγνωση –Εκφραστικός: προσεγγίζει την ανθρώπινη γλώσσα –Περιέχει πλεονασμούς int expr(int n) { int d; d = 4 * n * n * (n + 1) * (n + 1); return d; }
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-6 Κώδικας Μηχανής Βελτιστοποιημένος για εκτέλεση από το υλικό Έλλειψη ασάφειας, πλεονασμού Κατακερματισμός της πληροφορίας για τον τελικό στόχο lda $30,-32($30) stq $26,0($30) stq $15,8($30) bis $30,$30,$15 bis $16,$16,$1 stl $1,16($15) lds $f1,16($15) sts $f1,24($15) ldl $5,24($15) bis $5,$5,$2 s4addq $2,0,$3 ldl $4,16($15) mull $4,$3,$2 ldl $3,16($15) addq $3,1,$4 mull $2,$4,$2 ldl $3,16($15) addq $3,1,$4 mull $2,$4,$2 stl $2,20($15) ldl $0,20($15) br $31,$33 $33: bis $15,$15,$30 ldq $26,0($30) ldq $15,8($30) addq $30,32,$30 ret $31,($26),1
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-7 Πώς θα γίνει η μεταγλώττιση; Σε βήματα : σταδιακή μετατροπή του πηγαίου κώδικα σε ενδιάμεσες αναπαραστάσεις κατάλληλες για τον εκάστοτε κάθε φορά στόχο (π.χ. έλεγχο ορθότητας, βελτιστοποίηση κώδικα κ.α.). Κάθε βήμα απομακρύνει την αναπαράστασή μας από την γλώσσα του πηγαίου κώδικα και πλησιάζει το επίπεδο της μηχανής.
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-8 Οι φάσεις λειτουργίας ενός μεταγλωττιστή 1: Λεκτικές μονάδες (tokens) 2: Συντακτικό δένδρο 3: Ενδιάμεσος κώδικας
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-9 Λεκτική Ανάλυση Έστω η έκφραση position := initial + rate * 60 Ο λεκτικός αναλυτής παράγει την ακόλουθη έξοδο λεκτικών μονάδων: id(1) op(:=) id(2) op(+) id(3) op(*) cons(60) όπου id:identifier, op:operator και cons:constant Ο πίνακας συμβόλων έχει ως εξής:
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-10 Συντακτική Ανάλυση Η συντακτική ανάλυση κατασκευάζει μία δομή που περιγράφει τις σχέσεις των λεκτικών μονάδων
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-11 Σημασιολογική Ανάλυση Π.χ. έλεγχος των παραμέτρων ενός τελεστή και τροποποίηση του συντακτικού δένδρου
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-12 Ενδιάμεσος Κώδικας & Βελτιστοποίηση Ενδιάμεσος Κώδικας temp1 := int_2_real(60) temp2 := id(3) * temp1 temp3 := id(2) + temp2 id(1) := temp3 Βελτιστοποίηση: temp1 := id(3) * 60.0 id(1) := id(2) + temp1
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-13 Η γενικότερη εικόνα Source code Compiler Κώδικας σε γλώσσα Assembly Assembler Κώδικας μηχανής Εκτελέσιμο πρόγραμμα Εκτέλεση Linker ΟS Loader
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-14 Οργάνωση σε εμπρόσθιο και οπίσθιο τμήμα Front end (machine- independent) Back end Πλεονεκτήματα: π.χ. Κ μεταγλωττιστές για Ν τελικούς Η/Υ Χρειαζόμαστε: N οπίσθια τμήματα & K εμπρόσθια, αντί Κ*Ν μεταγλωττιστές
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-15 Οργάνωση σε περάσματα Πέρασμα (pass) : ανάγνωση του πηγαίου κώδικα Ο αριθμός των περασμάτων εξαρτάται από την αρχική και τελική γλώσσα καθώς και το περιβάλλον εκτέλεσης του μεταγλωττιστή (λιγότερη μνήμη = λιγότερα περάσματα). Pascal : 1 πέρασμα Algol 68 : 3 περάσματα Αναδρομική κατάβαση (backpatching) για περιορισμό των περασμάτων
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-16 Ένας απλός μεταγλωττιστής Πρόβλημα: Δημιουργία ενός μεταγλωττιστή για μετατροπή αριθμητικών εκφράσεων από προθεματικό (infix) σε επιθεματικό (postfix) συμβολισμό. Π.χ.3+4*5 * + Ο επιθεματικός συμβ. είναι κατάλληλος για εκτέλεση από μηχανές που χρησιμοποιούν στοίβα. Προσδιορισμός - Περιγραφή της γλώσσας σε επίπεδο: –Συντακτικό –Σημασιολογικό
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-17 Παράδειγμα Γραμματικής Για την μετατροπή από προ- σε επιθεματικό κώδικα 1.expr = expr + expr 2.expr = expr - expr 3.expr = expr * expr 4.expr = expr / expr 5.expr = ( expr ) 6.expr = digit 7.digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-18 Συντακτικό Δένδρο Δένδρο με κόμβους: –Ρίζα το αρχικό σύμβολο της γραμματικής –Εσωτερικούς κόμβους που αντιστοιχούν σε μη- τερματικά σύμβολα –Φύλλα που αντιστοιχούν σε τερματικά σύμβολα. Συντακτικός αναλυτής (parser): κατασκευάζει το συντακτικό δένδρο.
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-19 Είδη συντακτικής ανάλυσης Από κάτω προς τα πάνω Από πάνω προς τα κάτω
ΕΠΛ223 - Θεωρία και Πρακτική Μεταγλωττιστών 1-20 Υλοποίηση Παραδείγματος