Τι είναι ο σχεδιασμός μεταγλωττιστή; Τύποι, Εργαλεία Κατασκευής, Παράδειγμα

⚡ Έξυπνη Σύνοψη

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

  • 🔤 Λεξιλογική Ανάλυση: Ο σαρωτής ομαδοποιεί τους χαρακτήρες σε διακριτικά και τους καταγράφει στον πίνακα συμβόλων.
  • 🌳 Ανάλυση σύνταξης: Ο αναλυτής ελέγχει τη γραμματική και δημιουργεί ένα ιεραρχικό δέντρο ανάλυσης από τα tokens.
  • Σημασιολογική Ανάλυση: Αυτή η φάση επαληθεύει τη συμβατότητα και τη σημασία των τύπων χρησιμοποιώντας το δέντρο σύνταξης.
  • ⚙️ Code Γενιά: Ο ενδιάμεσος κώδικας παράγεται, βελτιστοποιείται και τελικά μεταφράζεται σε κώδικα μηχανής-στόχο.
  • 📋 Ρουτίνες υποστήριξης: Ένας πίνακας συμβόλων και μια ρουτίνα χειρισμού σφαλμάτων αλληλεπιδρούν με κάθε φάση μεταγλώττισης.

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

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

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

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

Φάσεις του μεταγλωττιστή

Φάσεις του μεταγλωττιστή

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

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

Η Λεξιλογική Ανάλυση είναι η πρώτη φάση, κατά την οποία ο μεταγλωττιστής σαρώνει τον πηγαίο κώδικα. Αυτή η διαδικασία μπορεί να εκτελεστεί από αριστερά προς τα δεξιά, χαρακτήρα προς χαρακτήρα, και να ομαδοποιήσει αυτούς τους χαρακτήρες σε διακριτικά (tokens).

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

Οι κύριες λειτουργίες αυτής της φάσης είναι:

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

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

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

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

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

Η ανάλυση σύνταξης βασίζεται στους κανόνες της συγκεκριμένης γλώσσας προγραμματισμού, κατασκευάζοντας το δέντρο ανάλυσης με τη βοήθεια διακριτικών (tokens). Επίσης, καθορίζει τη δομή της γλώσσας πηγής και τη γραμματική ή σύνταξη της γλώσσας.

Ακολουθεί μια λίστα με τις εργασίες που εκτελούνται σε αυτό το στάδιο:

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

Παράδειγμα

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

(a+b)*c

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

Στο Δέντρο Ανάλυσης:

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

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

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

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

Οι λειτουργίες της φάσης σημασιολογικής ανάλυσης είναι:

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

Παράδειγμα

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

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

Φάση 4: Ενδιάμεση Code Γενεά

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

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

Λειτουργίες του Ενδιάμεσου Code παραγωγή:

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

Παράδειγμα

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

total = count + rate * 5

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

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

Φάση 5: Code Απόδοσης

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

Οι κύριες λειτουργίες αυτής της φάσης είναι:

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

Παράδειγμα: Σκεφτείτε τον ακόλουθο κώδικα:

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

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

b = c * 10.0
f = e + b

Φάση 6: Code Γενεά

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

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

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

Παράδειγμα

Το a = b + 60.0 θα μπορούσε πιθανώς να μεταφραστεί σε καταχωρητές ως:

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

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

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

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

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

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

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

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

Συχνές Ερωτήσεις

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

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

Το front end χειρίζεται λεξιλογική, συντακτική και σημασιολογική ανάλυση καθώς και ενδιάμεσο κώδικα και εξαρτάται από τη γλώσσα πηγής. Το back end χειρίζεται τη βελτιστοποίηση και τη δημιουργία κώδικα και εξαρτάται από τον υπολογιστή-στόχο. Αυτός ο διαχωρισμός απλοποιεί την επαναστόχευση.

Όχι. Η λεξιλογική ανάλυση (σάρωση) ομαδοποιεί τους χαρακτήρες σε διακριτικά (tokens), ενώ η ανάλυση (συντακτική ανάλυση) ταξινομεί αυτά τα διακριτικά σε ένα δέντρο ανάλυσης σύμφωνα με τους γραμματικούς κανόνες. Η λεξιλογική ανάλυση εκτελείται πρώτα και τροφοδοτεί τα διακριτικά της στον αναλυτή.

Συνοψίστε αυτήν την ανάρτηση με: