Ποιες είναι οι φάσεις του σχεδιασμού του μεταγλωττιστή;
Το πρόγραμμα μεταγλώττισης λειτουργεί σε διάφορες φάσεις, κάθε φάση μετατρέπει το πρόγραμμα προέλευσης από μια αναπαράσταση σε άλλη. Κάθε φάση λαμβάνει εισόδους από το προηγούμενο στάδιο και τροφοδοτεί την έξοδο στην επόμενη φάση του μεταγλωττιστή.
Υπάρχουν 6 φάσεις σε έναν μεταγλωττιστή. Κάθε μια από αυτές τις φάσεις βοηθά στη μετατροπή του υψηλού επιπέδου γλώσσας του κώδικα του μηχανήματος. Οι φάσεις ενός μεταγλωττιστή είναι:
- Λεξική ανάλυση
- Ανάλυση σύνταξης
- Σημασιολογική ανάλυση
- Ενδιάμεση γεννήτρια κώδικα
- Εργαλείο βελτιστοποίησης κώδικα
- Γεννήτρια κώδικα
Όλες αυτές οι φάσεις μετατρέπουν τον πηγαίο κώδικα διαιρώντας σε διακριτικά, δημιουργώντας αναλυτικά δέντρα και βελτιστοποιώντας τον πηγαίο κώδικα με διαφορετικές φάσεις.
Σε αυτό το σεμινάριο, θα μάθετε:
- Ποιες είναι οι φάσεις του σχεδιασμού του μεταγλωττιστή;
- Φάση 1: Λεξική Ανάλυση
- Φάση 2: Ανάλυση σύνταξης
- Φάση 3: Σημασιολογική ανάλυση
- Φάση 4: Ενδιάμεση δημιουργία κώδικα
- Φάση 5: Βελτιστοποίηση κώδικα
- Φάση 6: Δημιουργία κώδικα
- Διαχείριση πίνακα συμβόλων
- Σφάλμα χειρισμού ρουτίνας:
Φάση 1: Λεξική Ανάλυση
Η Λεξική Ανάλυση είναι η πρώτη φάση όταν ο μεταγλωττιστής σαρώνει τον πηγαίο κώδικα. Αυτή η διαδικασία μπορεί να είναι από αριστερά προς τα δεξιά, ανά χαρακτήρα, και να ομαδοποιεί αυτούς τους χαρακτήρες σε διακριτικά.
Εδώ, η ροή χαρακτήρων από το πρόγραμμα προέλευσης ομαδοποιείται σε σημαντικές ακολουθίες προσδιορίζοντας τα διακριτικά. Κάνει την είσοδο των αντίστοιχων εισιτηρίων στον πίνακα συμβόλων και περνά το σύμβολο στην επόμενη φάση.
Οι κύριες λειτουργίες αυτής της φάσης είναι:
- Προσδιορίστε τις λεξικές μονάδες σε έναν πηγαίο κώδικα
- Ταξινομήστε τις λεξικές ενότητες σε τάξεις όπως σταθερές, δεσμευμένες λέξεις και εισαγάγετε τις σε διαφορετικούς πίνακες. Θα αγνοήσει τα σχόλια στο πρόγραμμα προέλευσης
- Προσδιορίστε το διακριτικό που δεν είναι μέρος της γλώσσας
Παράδειγμα :
x = y + 10
Διακριτικά
Χ | αναγνωριστικό |
= | Χειριστής ανάθεσης |
Γ | αναγνωριστικό |
+ | Τελεστής προσθήκης |
10 | Αριθμός |
Φάση 2: Ανάλυση σύνταξης
Η ανάλυση σύνταξης αφορά την ανακάλυψη δομής στον κώδικα. Καθορίζει εάν ένα κείμενο ακολουθεί ή όχι την αναμενόμενη μορφή. Ο κύριος στόχος αυτής της φάσης είναι να βεβαιωθείτε ότι ο πηγαίος κώδικας γράφτηκε από τον προγραμματιστή είναι σωστός ή όχι.
Η ανάλυση σύνταξης βασίζεται στους κανόνες που βασίζονται στη συγκεκριμένη γλώσσα προγραμματισμού, κατασκευάζοντας το δέντρο ανάλυσης με τη βοήθεια των διακριτικών. Καθορίζει επίσης τη δομή της γλώσσας πηγής και της γραμματικής ή της σύνταξης της γλώσσας.
Εδώ είναι μια λίστα εργασιών που εκτελούνται σε αυτήν τη φάση:
- Λάβετε μάρκες από τη λεξική αναλυτή
- Ελέγχει εάν η έκφραση είναι συντακτικά σωστή ή όχι
- Αναφορά όλων των σφαλμάτων σύνταξης
- Κατασκευάστε μια ιεραρχική δομή που είναι γνωστή ως δέντρο ανάλυσης
Παράδειγμα
Οποιοδήποτε αναγνωριστικό / αριθμός είναι μια έκφραση
Εάν το x είναι αναγνωριστικό και το y + 10 είναι μια έκφραση, τότε x = y + 10 είναι μια δήλωση.
Εξετάστε το δέντρο ανάλυσης για το ακόλουθο παράδειγμα
(a+b)*c
Σε Parse Tree
- Εσωτερικός κόμβος: εγγραφή με έναν τελεστή που έχει κατατεθεί και δύο αρχεία για παιδιά
- Leaf: εγγραφές με 2 / περισσότερα πεδία. ένα για διακριτικό και άλλες πληροφορίες σχετικά με το διακριτικό
- Βεβαιωθείτε ότι τα στοιχεία του προγράμματος ταιριάζουν ουσιαστικά
- Συγκεντρώνει πληροφορίες τύπου και ελέγχει για συμβατότητα τύπου
- Επιτρέπονται οι τελεστές ελέγχου από τη γλώσσα προέλευσης
Φάση 3: Σημασιολογική ανάλυση
Η σημασιολογική ανάλυση ελέγχει τη σημασιολογική συνέπεια του κώδικα. Χρησιμοποιεί το δέντρο σύνταξης της προηγούμενης φάσης μαζί με τον πίνακα συμβόλων για να επαληθεύσει ότι ο δεδομένος πηγαίος κώδικας είναι σημασιολογικά συνεπής. Ελέγχει επίσης εάν ο κώδικας μεταδίδει την κατάλληλη έννοια.
Ο Semantic Analyzer θα ελέγξει για αναντιστοιχίες τύπου, ασυμβίβαστους τελεστές, μια συνάρτηση που ονομάζεται ακατάλληλη ορίσματα, μια μη δηλωμένη μεταβλητή κ.λπ.
Οι λειτουργίες της φάσης σημασιολογικών αναλύσεων είναι:
- Σας βοηθά να αποθηκεύσετε πληροφορίες τύπου που συγκεντρώθηκαν και να τις αποθηκεύσετε σε πίνακα συμβόλων ή δέντρο σύνταξης
- Σας επιτρέπει να κάνετε έλεγχο τύπου
- Στην περίπτωση αναντιστοιχίας τύπου, όπου δεν υπάρχουν ακριβείς κανόνες διόρθωσης τύπου που ικανοποιούν την επιθυμητή λειτουργία, εμφανίζεται ένα σημασιολογικό σφάλμα.
- Συλλέγει πληροφορίες τύπου και ελέγχει για συμβατότητα τύπου
- Ελέγχει εάν η γλώσσα προέλευσης επιτρέπει τους τελεστές ή όχι
Παράδειγμα
float x = 20.2;float y = x*30;
Στον παραπάνω κώδικα, ο σημασιολογικός αναλυτής θα πληκτρολογήσει τον ακέραιο 30 για να επιπλέει 30.0 πριν από τον πολλαπλασιασμό
Φάση 4: Ενδιάμεση δημιουργία κώδικα
Μόλις η φάση της σημασιολογικής ανάλυσης τελειώσει τον μεταγλωττιστή, δημιουργείται ενδιάμεσος κώδικας για τη μηχανή προορισμού. Αντιπροσωπεύει ένα πρόγραμμα για κάποια αφηρημένη μηχανή.
Ο ενδιάμεσος κωδικός βρίσκεται μεταξύ της γλώσσας υψηλού επιπέδου και επιπέδου μηχανήματος. Αυτός ο ενδιάμεσος κώδικας πρέπει να δημιουργηθεί με τέτοιο τρόπο που να διευκολύνει τη μετάφρασή του στον κώδικα της μηχανής προορισμού.
Λειτουργίες για τη δημιουργία ενδιάμεσου κώδικα:
- Θα πρέπει να δημιουργηθεί από τη σημασιολογική αναπαράσταση του προγράμματος προέλευσης
- Διατηρεί τις τιμές που υπολογίστηκαν κατά τη διαδικασία της μετάφρασης
- Σας βοηθά να μεταφράσετε τον ενδιάμεσο κώδικα σε γλώσσα προορισμού
- Σας επιτρέπει να διατηρήσετε την προτεραιότητα της γλώσσας πηγής
- Διατηρεί τον σωστό αριθμό τελεστών της εντολής
Παράδειγμα
Για παράδειγμα,
total = count + rate * 5
Ο ενδιάμεσος κώδικας με τη βοήθεια της μεθόδου κωδικού διεύθυνσης είναι:
t1 := int_to_float(5)t2 := rate * t1t3 := count + t2total := t3
Φάση 5: Βελτιστοποίηση κώδικα
Η επόμενη φάση είναι η βελτιστοποίηση κώδικα ή ο ενδιάμεσος κώδικας. Αυτή η φάση αφαιρεί την περιττή γραμμή κώδικα και τακτοποιεί την ακολουθία των δηλώσεων για να επιταχύνει την εκτέλεση του προγράμματος χωρίς σπατάλη πόρων. Ο κύριος στόχος αυτής της φάσης είναι η βελτίωση του ενδιάμεσου κώδικα για τη δημιουργία ενός κώδικα που τρέχει γρηγορότερα και καταλαμβάνει λιγότερο χώρο.
Οι κύριες λειτουργίες αυτής της φάσης είναι:
- Σας βοηθά να επιτύχετε μια αντιστάθμιση μεταξύ της εκτέλεσης και της ταχύτητας σύνταξης
- Βελτιώνει τον χρόνο εκτέλεσης του προγράμματος-στόχου
- Δημιουργεί βελτιωμένο κώδικα ακόμα σε ενδιάμεση αναπαράσταση
- Αφαίρεση μη προσβάσιμου κώδικα και απαλλαγή από αχρησιμοποίητες μεταβλητές
- Κατάργηση δηλώσεων που δεν έχουν τροποποιηθεί από το βρόχο
Παράδειγμα:
Εξετάστε τον ακόλουθο κώδικα
a = intofloat(10)b = c * ad = e + bf = d
Μπορεί να γίνει
b =c * 10.0f = e+b
Φάση 6: Δημιουργία κώδικα
Η δημιουργία κώδικα είναι η τελευταία και τελευταία φάση ενός μεταγλωττιστή. Παίρνει τις εισόδους από τις φάσεις βελτιστοποίησης κώδικα και παράγει τον κώδικα σελίδας ή τον κώδικα αντικειμένου. Ο στόχος αυτής της φάσης είναι να εκχωρήσει χώρο αποθήκευσης και να δημιουργήσει μετακινούμενο κώδικα μηχανής.
Διαθέτει επίσης θέσεις μνήμης για τη μεταβλητή. Οι οδηγίες στον ενδιάμεσο κώδικα μετατρέπονται σε οδηγίες μηχανής. Αυτή η φάση καλύπτει τον βελτιστοποιημένο ή ενδιάμεσο κώδικα στη γλώσσα-στόχο.
Η γλώσσα στόχος είναι ο κωδικός μηχανήματος. Επομένως, όλες οι θέσεις μνήμης και οι καταχωρητές επιλέγονται και κατανέμονται κατά τη διάρκεια αυτής της φάσης. Ο κώδικας που δημιουργείται από αυτήν τη φάση εκτελείται για τη λήψη εισόδων και τη δημιουργία αναμενόμενων εξόδων.
Παράδειγμα:
α = β + 60,0
Θα μπορούσε ενδεχομένως να μεταφραστεί σε μητρώα.
MOVF a, R1MULF #60.0, R2ADDF R1, R2
Διαχείριση πίνακα συμβόλων
Ένας πίνακας συμβόλων περιέχει μια εγγραφή για κάθε αναγνωριστικό με πεδία για τα χαρακτηριστικά του αναγνωριστικού. Αυτό το στοιχείο διευκολύνει τον μεταγλωττιστή να αναζητήσει την εγγραφή αναγνωριστικού και να την ανακτήσει γρήγορα. Ο πίνακας συμβόλων σας βοηθά επίσης για τη διαχείριση του πεδίου. Ο πίνακας συμβόλων και ο χειριστής σφαλμάτων αλληλεπιδρούν με όλες τις φάσεις και την ενημέρωση του πίνακα συμβόλων αντίστοιχα.
Σφάλμα χειρισμού ρουτίνας:
Στη διαδικασία σχεδιασμού του μεταγλωττιστή μπορεί να προκύψει σφάλμα σε όλες τις παρακάτω φάσεις:
- Λεξικός αναλυτής: Διακριτικά ορθογραφικά διακριτικά
- Αναλυτής σύνταξης: Λείπει παρένθεση
- Ενδιάμεση γεννήτρια κώδικα: Αναντιστοιχία τελεστές για έναν χειριστή
- Code Optimizer: Όταν η δήλωση δεν είναι προσβάσιμη
- Δημιουργία κώδικα: Μη προσπελάσιμες δηλώσεις
- Πίνακες συμβόλων: Σφάλμα πολλαπλών δηλωθέντων αναγνωριστικών
Τα πιο συνηθισμένα σφάλματα είναι μη έγκυρη ακολουθία χαρακτήρων στη σάρωση, μη έγκυρες ακολουθίες διακριτικών σε τύπο, σφάλμα εύρους και ανάλυση σε σημασιολογική ανάλυση.
Το σφάλμα μπορεί να συναντηθεί σε οποιαδήποτε από τις παραπάνω φάσεις. Μετά την εύρεση σφαλμάτων, η φάση πρέπει να αντιμετωπίσει τα σφάλματα για να συνεχίσει τη διαδικασία σύνταξης. Αυτά τα σφάλματα πρέπει να αναφέρονται στον χειριστή σφαλμάτων που χειρίζεται το σφάλμα για την εκτέλεση της διαδικασίας σύνταξης. Γενικά, τα σφάλματα αναφέρονται με τη μορφή μηνύματος.
Περίληψη
- Το πρόγραμμα μεταγλώττισης λειτουργεί σε διάφορες φάσεις, κάθε φάση μετατρέπει το πρόγραμμα προέλευσης από μια αναπαράσταση σε άλλη
- Έξι φάσεις σχεδιασμού μεταγλωττιστή είναι 1) Λεξική ανάλυση 2) Ανάλυση σύνταξης 3) Σημασιολογική ανάλυση 4) Ενδιάμεση γεννήτρια κώδικα 5) Βελτιστοποίηση κώδικα 6) Δημιουργία κώδικα
- Η Λεξική Ανάλυση είναι η πρώτη φάση όταν ο μεταγλωττιστής σαρώνει τον πηγαίο κώδικα
- Η ανάλυση σύνταξης αφορά την ανακάλυψη δομής σε κείμενο
- Η σημασιολογική ανάλυση ελέγχει τη σημασιολογική συνέπεια του κώδικα
- Μόλις ολοκληρωθεί η φάση της σημασιολογικής ανάλυσης, δημιουργήστε ενδιάμεσο κώδικα για τη μηχανή προορισμού
- Η φάση βελτιστοποίησης κώδικα αφαιρεί την περιττή γραμμή κώδικα και τακτοποιεί την ακολουθία των δηλώσεων
- Η φάση δημιουργίας κώδικα λαμβάνει εισόδους από τη φάση βελτιστοποίησης κώδικα και παράγει τον κώδικα σελίδας ή τον κώδικα αντικειμένου
- Ένας πίνακας συμβόλων περιέχει μια εγγραφή για κάθε αναγνωριστικό με πεδία για τα χαρακτηριστικά του αναγνωριστικού
- Σφάλμα χειρισμού ρουτίνας χειρίζεται λάθη και αναφορές σε πολλές φάσεις