Φάσεις του μεταγλωττιστή με Παράδειγμα: Διαδικασία μεταγλώττισης & Βήματα

Ποιες είναι οι φάσεις του σχεδιασμού μεταγλωττιστή;

Μεταγλωττιστής λειτουργεί σε διάφορες φάσεις, κάθε φάση μετατρέπει το πρόγραμμα πηγής από τη μια αναπαράσταση στην άλλη. Κάθε φάση παίρνει εισόδους από το προηγούμενο στάδιο της και τροφοδοτεί την έξοδο της στην επόμενη φάση του μεταγλωττιστή.
Υπάρχουν 6 φάσεις σε έναν μεταγλωττιστή. Κάθε μία από αυτές τις φάσεις βοηθά στη μετατροπή της γλώσσας υψηλού επιπέδου στον κώδικα μηχανής. Οι φάσεις ενός μεταγλωττιστή είναι:

  1. Λεξική ανάλυση
  2. Συντακτική ανάλυση
  3. Σημασιολογική ανάλυση
  4. Ενδιάμεση γεννήτρια κωδικών
  5. Βελτιστοποιητής κώδικα
  6. Γεννήτρια κώδικα
Φάσεις του μεταγλωττιστή
Φάσεις του μεταγλωττιστή

Όλες αυτές οι φάσεις μετατρέπουν τον πηγαίο κώδικα διαιρώντας σε διακριτικά, δημιουργώντας δέντρα ανάλυσης και βελτιστοποιώντας τον πηγαίο κώδικα κατά διαφορετικές φάσεις.

Φάση 1: Λεξική Ανάλυση

Η Λεξική Ανάλυση είναι η πρώτη φάση κατά την οποία ο μεταγλωττιστής σαρώνει τον πηγαίο κώδικα. Αυτή η διαδικασία μπορεί να μετακινηθεί από αριστερά προς τα δεξιά, χαρακτήρα προς χαρακτήρα, και να ομαδοποιήσει αυτούς τους χαρακτήρες σε διακριτικά.
Εδώ, η ροή χαρακτήρων από το πρόγραμμα πηγής ομαδοποιείται σε αλληλουχίες με νόημα προσδιορίζοντας τα διακριτικά. Κάνει την εισαγωγή των αντίστοιχων εισιτηρίων στον πίνακα συμβόλων και περνά αυτό το διακριτικό στην επόμενη φάση.
Οι κύριες λειτουργίες αυτής της φάσης είναι:

  • Προσδιορίστε τις λεξιλογικές μονάδες σε έναν πηγαίο κώδικα
  • Ταξινομήστε τις λεξικές μονάδες σε κλάσεις όπως σταθερές, δεσμευμένες λέξεις και καταχωρίστε τις σε διαφορετικούς πίνακες. Θα αγνοήσει τα σχόλια στο πρόγραμμα πηγής
  • Προσδιορίστε το διακριτικό που δεν είναι μέρος της γλώσσας

Παράδειγμα:
x = y + 10

κουπόνια

X αναγνωριστικό
= Χειριστής ανάθεσης
Y αναγνωριστικό
+ Χειριστής προσθήκης
10 αριθμός

Φάση 2: Ανάλυση σύνταξης

Η συντακτική ανάλυση έχει να κάνει με την ανακάλυψη δομής στον κώδικα. Καθορίζει εάν ένα κείμενο ακολουθεί ή όχι την αναμενόμενη μορφή. Ο κύριος στόχος αυτής της φάσης είναι να βεβαιωθείτε ότι ο πηγαίος κώδικας που γράφτηκε από τον προγραμματιστή είναι σωστός ή όχι.
Η συντακτική ανάλυση βασίζεται στους κανόνες που βασίζονται στη συγκεκριμένη γλώσσα προγραμματισμού, κατασκευάζοντας το δέντρο ανάλυσης με τη βοήθεια διακριτικών. Καθορίζει επίσης τη δομή της γλώσσας πηγής και τη γραμματική ή τη σύνταξη της γλώσσας.
Εδώ, είναι μια λίστα εργασιών που εκτελούνται σε αυτή τη φάση:

  • Λάβετε μάρκες από τον λεξικό αναλυτή
  • Ελέγχει εάν η έκφραση είναι συντακτικά σωστή ή όχι
  • Αναφορά όλων των συντακτικών σφαλμάτων
  • Κατασκευάστε μια ιεραρχική δομή που είναι γνωστή ως δέντρο ανάλυσης

Παράδειγμα

Οποιοδήποτε αναγνωριστικό/αριθμός είναι μια έκφραση
Αν x είναι ένα αναγνωριστικό και το y+10 είναι μια παράσταση, τότε x= y+10 είναι μια πρόταση.
Εξετάστε το δέντρο ανάλυσης για το ακόλουθο παράδειγμα

(a+b)*c

Παράδειγμα Συντακτικής Ανάλυσης

Στο Parse Tree

  • Εσωτερικός κόμβος: εγγραφή με αρχείο χειριστή και δύο αρχεία για παιδιά
  • Φύλλο: εγγραφές με 2/περισσότερα πεδία. ένα για διακριτικό και άλλες πληροφορίες για το διακριτικό
  • Βεβαιωθείτε ότι τα στοιχεία του προγράμματος ταιριάζουν με νόημα
  • Συγκεντρώνει πληροφορίες τύπου και ελέγχει για συμβατότητα τύπου
  • Οι τελεστές ελέγχου επιτρέπονται από τη γλώσσα πηγής

Φάση 3: Σημασιολογική Ανάλυση

Η σημασιολογική ανάλυση ελέγχει τη σημασιολογική συνέπεια του κώδικα. Χρησιμοποιεί το δέντρο σύνταξης της προηγούμενης φάσης μαζί με τον πίνακα συμβόλων για να επαληθεύσει ότι ο δεδομένος πηγαίος κώδικας είναι σημασιολογικά συνεπής. Ελέγχει επίσης εάν ο κώδικας αποδίδει το κατάλληλο νόημα.
Το Semantic Analyzer θα ελέγξει για αναντιστοιχίες τύπου, μη συμβατούς τελεστές, μια συνάρτηση που καλείται με ακατάλληλα ορίσματα, μια μη δηλωμένη μεταβλητή κ.λπ.
Οι λειτουργίες της φάσης των σημασιολογικών αναλύσεων είναι:

  • Σας βοηθά να αποθηκεύσετε πληροφορίες τύπου που συγκεντρώθηκαν και να τις αποθηκεύσετε σε πίνακα συμβόλων ή δέντρο σύνταξης
  • Σας επιτρέπει να πραγματοποιείτε έλεγχο τύπου
  • Στην περίπτωση αναντιστοιχίας τύπου, όπου δεν υπάρχουν ακριβείς κανόνες διόρθωσης τύπου που να ικανοποιούν την επιθυμητή λειτουργία, εμφανίζεται σημασιολογικό σφάλμα
  • Συλλέγει πληροφορίες τύπου και ελέγχει για συμβατότητα τύπου
  • Ελέγχει εάν η γλώσσα πηγής επιτρέπει τους τελεστές ή όχι

Παράδειγμα

float x = 20.2;
float y = x*30;

Στον παραπάνω κώδικα, ο σημασιολογικός αναλυτής θα πληκτρολογήσει τον ακέραιο αριθμό 30 σε float 30.0 πριν από τον πολλαπλασιασμό

Φάση 4: Ενδιάμεση Δημιουργία Κώδικα

Μόλις ολοκληρωθεί η φάση της σημασιολογικής ανάλυσης από τον μεταγλωττιστή, δημιουργείται ενδιάμεσος κώδικας για τη μηχανή-στόχο. Αντιπροσωπεύει ένα πρόγραμμα για κάποια αφηρημένη μηχανή.
Ο ενδιάμεσος κώδικας βρίσκεται ανάμεσα στη γλώσσα υψηλού επιπέδου και σε επίπεδο μηχανής. Αυτός ο ενδιάμεσος κώδικας πρέπει να δημιουργηθεί με τέτοιο τρόπο που να διευκολύνει τη μετάφρασή του στον κώδικα μηχανής-στόχου.
Λειτουργίες στη δημιουργία ενδιάμεσου κώδικα:

  • Θα πρέπει να δημιουργηθεί από τη σημασιολογική αναπαράσταση του προγράμματος πηγής
  • Διατηρεί τις τιμές που υπολογίστηκαν κατά τη διαδικασία της μετάφρασης
  • Σας βοηθά να μεταφράσετε τον ενδιάμεσο κώδικα στη γλώσσα-στόχο
  • Σας επιτρέπει να διατηρείτε τη σειρά προτεραιότητας της γλώσσας πηγής
  • Κρατάει τον σωστό αριθμό τελεστών της εντολής

Παράδειγμα

Για παράδειγμα,

total = count + rate * 5

Ο ενδιάμεσος κώδικας με τη βοήθεια της μεθόδου κώδικα διεύθυνσης είναι:

 
t1 := int_to_float(5) 
t2 := rate * t1 
t3 := count + t2
total := t3

Φάση 5: Βελτιστοποίηση Κώδικα

Η επόμενη φάση είναι η βελτιστοποίηση κώδικα ή ο ενδιάμεσος κώδικας. Αυτή η φάση αφαιρεί την περιττή γραμμή κώδικα και κανονίζει τη σειρά των δηλώσεων για να επιταχύνει την εκτέλεση του προγράμματος χωρίς να σπαταλούνται πόροι. Ο κύριος στόχος αυτής της φάσης είναι να βελτιωθεί ο ενδιάμεσος κώδικας για να δημιουργηθεί ένας κώδικας που εκτελείται πιο γρήγορα και καταλαμβάνει λιγότερο χώρο.
Οι κύριες λειτουργίες αυτής της φάσης είναι:

  • Σας βοηθά να δημιουργήσετε μια αντιστάθμιση μεταξύ της ταχύτητας εκτέλεσης και μεταγλώττισης
  • Βελτιώνει το χρόνο εκτέλεσης του προγράμματος-στόχου
  • Δημιουργεί βελτιωμένο κώδικα που βρίσκεται ακόμα σε ενδιάμεση αναπαράσταση
  • Αφαίρεση μη προσβάσιμου κώδικα και απαλλαγή από αχρησιμοποίητες μεταβλητές
  • Αφαίρεση εντολών που δεν έχουν αλλάξει από τον βρόχο

Παράδειγμα:
Σκεφτείτε τον παρακάτω κώδικα

a = intofloat(10)
b = c * a
d = e + b
f = d

Μπορεί να γίνει

b =c * 10.0
f = e+b

Φάση 6: Δημιουργία Κώδικα

Η δημιουργία κώδικα είναι η τελευταία και τελευταία φάση ενός μεταγλωττιστή. Λαμβάνει εισόδους από τις φάσεις βελτιστοποίησης κώδικα και ως αποτέλεσμα παράγει τον κώδικα σελίδας ή τον κώδικα αντικειμένου. Ο στόχος αυτής της φάσης είναι να εκχωρήσει αποθηκευτικό χώρο και να δημιουργήσει μετατοπιζόμενο κώδικα μηχανής.
Εκχωρεί επίσης θέσεις μνήμης για τη μεταβλητή. Οι οδηγίες στον ενδιάμεσο κώδικα μετατρέπονται σε οδηγίες μηχανής. Αυτή η φάση καλύπτει τον βελτιστοποιημένο ή ενδιάμεσο κώδικα στη γλώσσα-στόχο.
Η γλώσσα-στόχος είναι ο κωδικός μηχανής. Επομένως, όλες οι θέσεις και οι καταχωρητές μνήμης επιλέγονται και κατανέμονται κατά τη διάρκεια αυτής της φάσης. Ο κώδικας που δημιουργείται από αυτή τη φάση εκτελείται για να λάβει εισόδους και να δημιουργήσει αναμενόμενες εξόδους.

Παράδειγμα

a = b + 60.0
Θα μεταφραζόταν ενδεχομένως σε μητρώα.

MOVF a, R1
MULF #60.0, R2
ADDF R1, R2

Διαχείριση πίνακα συμβόλων

Ένας πίνακας συμβόλων περιέχει μια εγγραφή για κάθε αναγνωριστικό με πεδία για τα χαρακτηριστικά του αναγνωριστικού. Αυτό το στοιχείο διευκολύνει τον μεταγλωττιστή να αναζητήσει την εγγραφή αναγνωριστικού και να την ανακτήσει γρήγορα. Ο πίνακας συμβόλων σας βοηθά επίσης για τη διαχείριση του πεδίου εφαρμογής. Ο πίνακας συμβόλων και ο χειριστής σφαλμάτων αλληλεπιδρούν με όλες τις φάσεις και την ενημέρωση του πίνακα συμβόλων αντίστοιχα.

Ρουτίνα χειρισμού σφαλμάτων

Στη διαδικασία σχεδιασμού του μεταγλωττιστή ενδέχεται να προκύψει σφάλμα σε όλες τις παρακάτω φάσεις:

  • Λεξιλογικός αναλυτής: Λανθασμένα ορθογραφικά διακριτικά
  • Αναλυτής σύνταξης: Λείπει παρένθεση
  • Ενδιάμεσος γεννήτρια κώδικα: Ασυμφωνία τελεστών για έναν τελεστή
  • Code Optimizer: Όταν η δήλωση δεν είναι προσβάσιμη
  • Κώδικας Generator: Όταν η μνήμη είναι πλήρης ή δεν εκχωρούνται οι κατάλληλοι καταχωρητές
  • Πίνακες συμβόλων: Σφάλμα πολλαπλών δηλωμένων αναγνωριστικών

Τα πιο συνηθισμένα σφάλματα είναι η μη έγκυρη ακολουθία χαρακτήρων στη σάρωση, οι μη έγκυρες ακολουθίες διακριτικών στον τύπο, το σφάλμα εύρους και η ανάλυση στη σημασιολογική ανάλυση.
Το σφάλμα μπορεί να παρουσιαστεί σε οποιαδήποτε από τις παραπάνω φάσεις. Μετά την εύρεση σφαλμάτων, η φάση πρέπει να αντιμετωπίσει τα σφάλματα για να συνεχιστεί η διαδικασία μεταγλώττισης. Αυτά τα σφάλματα πρέπει να αναφέρονται στον διαχειριστή σφαλμάτων που χειρίζεται το σφάλμα για να εκτελέσει τη διαδικασία μεταγλώττισης. Γενικά, τα σφάλματα αναφέρονται με τη μορφή μηνύματος.

Περίληψη

  • Ο μεταγλωττιστής λειτουργεί σε διάφορες φάσεις, κάθε φάση μετατρέπει το πρόγραμμα πηγής από τη μια αναπαράσταση στην άλλη
  • Έξι φάσεις του σχεδιασμός μεταγλωττιστή είναι 1) Λεξιλογική ανάλυση 2) ​​Συντακτική ανάλυση 3) Σημασιολογική ανάλυση 4) Ενδιάμεσος γεννήτρια κώδικα 5) Βελτιστοποιητής κώδικα 6) Κώδικας Generator
  • Η Λεξική Ανάλυση είναι η πρώτη φάση κατά την οποία ο μεταγλωττιστής σαρώνει τον πηγαίο κώδικα
  • Η συντακτική ανάλυση έχει να κάνει με την ανακάλυψη της δομής στο κείμενο
  • Η σημασιολογική ανάλυση ελέγχει τη σημασιολογική συνέπεια του κώδικα
  • Μόλις ολοκληρωθεί η φάση της σημασιολογικής ανάλυσης από τον μεταγλωττιστή, δημιουργήστε ενδιάμεσο κώδικα για τη μηχανή-στόχο
  • Η φάση βελτιστοποίησης κώδικα αφαιρεί την περιττή γραμμή κώδικα και τακτοποιεί την ακολουθία των δηλώσεων
  • Η φάση δημιουργίας κώδικα λαμβάνει εισόδους από τη φάση βελτιστοποίησης κώδικα και παράγει τον κώδικα σελίδας ή τον κώδικα αντικειμένου ως αποτέλεσμα
  • Ένας πίνακας συμβόλων περιέχει μια εγγραφή για κάθε αναγνωριστικό με πεδία για τα χαρακτηριστικά του αναγνωριστικού
  • Η ρουτίνα χειρισμού σφαλμάτων χειρίζεται σφάλματα και αναφορές σε πολλές φάσεις