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

Συγκεκριμένοι εκτελεστές των γλωσσών προγραμματισμού είναι οι μεταφραστές και οι διερμηνείς.

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

Μεταφράστης- πρόγραμμα ή τεχνικό μέσο που εκτελεί τη μετάδοση του προγράμματος.

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

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

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

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

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

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

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

Μια άλλη μέθοδος υλοποίησης είναι όταν το πρόγραμμα εκτελείται με διερμηνέαςκαθόλου μετάφραση.

Διερμηνέας(Αγγλικά) διερμηνέας- διερμηνέας, διερμηνέας) μεταφράζει και εκτελεί το πρόγραμμα γραμμή προς γραμμή.

Ο διερμηνέας προσομοιώνει μέσω προγραμματισμού μια μηχανή της οποίας ο βρόχος ανάκτησης-εκτέλεσης λειτουργεί με οδηγίες σε γλώσσες υψηλού επιπέδου και όχι με οδηγίες μηχανής. Τέτοια μοντελοποίηση λογισμικού δημιουργεί μια εικονική μηχανή που υλοποιεί τη γλώσσα. Αυτή η προσέγγιση ονομάζεται καθαρή ερμηνεία. Η καθαρή διερμηνεία χρησιμοποιείται συνήθως για γλώσσες με απλή δομή (για παράδειγμα, APL ή Lisp). Διερμηνείς γραμμή εντολώνΕπεξεργασία εντολών σε σενάρια στο UNIX ή σε αρχεία δέσμης (.bat) στο MS-DOS, επίσης συνήθως σε λειτουργία καθαρής ερμηνείας.

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

Υπάρχουν συμβιβασμοί μεταξύ της μεταγλώττισης και της καθαρής ερμηνείας των υλοποιήσεων της γλώσσας προγραμματισμού, όταν ο διερμηνέας, πριν εκτελέσει το πρόγραμμα, το μεταφράζει σε μια ενδιάμεση γλώσσα (για παράδειγμα, σε bytecode ή p-code), η οποία είναι πιο βολική για ερμηνεία (δηλ. μιλάμε για διερμηνέα με ενσωματωμένο μεταφραστή) . Μια τέτοια μέθοδος ονομάζεται μικτή υλοποίηση. Η Perl είναι ένα παράδειγμα εφαρμογής μεικτής γλώσσας. Αυτή η προσέγγιση συνδυάζει τόσο τα πλεονεκτήματα ενός μεταγλωττιστή και ενός διερμηνέα (μεγαλύτερη ταχύτητα εκτέλεσης και ευκολία στη χρήση) όσο και τα μειονεκτήματα (απαιτούνται πρόσθετοι πόροι για τη μετάφραση και αποθήκευση του προγράμματος σε μια ενδιάμεση γλώσσα· πρέπει να παρέχεται διερμηνέας για την εκτέλεση του προγράμματος στην μηχάνημα στόχου). Ακριβώς όπως στην περίπτωση ενός μεταγλωττιστή, μια μικτή υλοποίηση το απαιτεί πριν από την εκτέλεση πηγήδεν περιείχε λάθη (λεξικά, συντακτικά και σημασιολογικά).

Με την αύξηση των πόρων υπολογιστών και την επέκταση των ετερογενών δικτύων (συμπεριλαμβανομένου του Διαδικτύου) που συνδέουν υπολογιστές διαφορετικών τύπων και αρχιτεκτονικών, έχει εμφανιστεί ένας νέος τύπος ερμηνείας, στον οποίο ο πηγαίος (ή ο ενδιάμεσος) κώδικας μεταγλωττίζεται σε κώδικα μηχανής απευθείας κατά το χρόνο εκτέλεσης , «εν πτήσει». Οι ήδη μεταγλωττισμένες ενότητες κώδικα αποθηκεύονται στην κρυφή μνήμη, έτσι ώστε όταν προσπελαστούν ξανά, να λαμβάνουν αμέσως έλεγχο, χωρίς εκ νέου μεταγλώττιση. Αυτή η προσέγγιση έχει ονομαστεί δυναμική συλλογή.

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

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

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

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

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

Για να επιτευχθεί μεγαλύτερη ταχύτητα προγραμμάτων σε ερμηνευμένες γλώσσες προγραμματισμού, μπορεί να χρησιμοποιηθεί η μετάφραση σε έναν ενδιάμεσο bytecode. Οι γλώσσες που επιτρέπουν αυτό το τέχνασμα είναι η Java, η Python και κάποιες άλλες γλώσσες προγραμματισμού.

Ο αλγόριθμος ενός απλού διερμηνέα:

2. Αναλύστε την οδηγία και καθορίστε τις κατάλληλες ενέργειες.

3. Να λάβει τα κατάλληλα μέτρα.

4. Εάν δεν επιτευχθεί η συνθήκη τερματισμού του προγράμματος, διαβάστε την επόμενη οδηγία και μεταβείτε στο βήμα 2

Οι γλώσσες προγραμματισμού μπορούν να χωριστούν σε μεταγλωττισμένες και ερμηνευόμενες.

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

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

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

Η διαίρεση σε μεταγλωττισμένες και διερμηνευμένες γλώσσες είναι κάπως αυθαίρετη. Έτσι, για οποιαδήποτε παραδοσιακά μεταγλωττισμένη γλώσσα, όπως η Pascal, μπορείτε να γράψετε έναν διερμηνέα. Επιπλέον, οι περισσότεροι σύγχρονοι «καθαροί» διερμηνείς δεν εκτελούν δομές γλώσσας απευθείας, αλλά τις συντάσσουν σε κάποια ενδιάμεση αναπαράσταση υψηλού επιπέδου (για παράδειγμα, με μεταβλητή αποαναφορά και μακροεπέκταση).

Για οποιαδήποτε διερμηνευμένη γλώσσα, μπορείτε να δημιουργήσετε έναν μεταγλωττιστή - για παράδειγμα, η γλώσσα Lisp, που αρχικά ερμηνεύτηκε, μπορεί να μεταγλωττιστεί χωρίς περιορισμούς. Ο κώδικας που δημιουργείται κατά το χρόνο εκτέλεσης μπορεί επίσης να μεταγλωττιστεί δυναμικά κατά το χρόνο εκτέλεσης.

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

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

Ωστόσο, τα ερμηνευμένα προγράμματα εκτελούνται αισθητά πιο αργά από τα μεταγλωττισμένα προγράμματα και δεν μπορούν να εκτελεστούν χωρίς πρόσθετο πρόγραμμα διερμηνέα.

Ορισμένες γλώσσες, όπως η Java και η C#, εμπίπτουν μεταξύ μεταγλώττισης και διερμηνείας. Δηλαδή, το πρόγραμμα δεν μεταγλωττίζεται σε γλώσσα μηχανής, αλλά σε κώδικα χαμηλού επιπέδου, ανεξάρτητο από μηχανή, bytecode. Στη συνέχεια, εκτελείται ο bytecode εικονική μηχανή. Για την εκτέλεση του bytecode, χρησιμοποιείται συνήθως η ερμηνεία, αν και ορισμένα από τα μέρη του μπορούν να μεταφραστούν σε κώδικα μηχανής απευθείας κατά την εκτέλεση του προγράμματος, χρησιμοποιώντας τη μεταγλώττιση Just-in-time (JIT) για την επιτάχυνση του προγράμματος. Για Java, ο bytecode εκτελείται από ένα εικονικό Μηχανή Java(Java Virtual Machine, JVM), για C# - Common Language Runtime.

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

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

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

Επί του παρόντος, οι μεταγλωττιστές χωρίζονται σε τρεις κύριες ομάδες: συναρμολογητές, μεταγλωττιστές και διερμηνείς.

Το Assembler είναι ένα βοηθητικό πρόγραμμα συστήματος που μετατρέπει συμβολικές κατασκευές σε οδηγίες γλώσσας μηχανής. Ένα ιδιαίτερο χαρακτηριστικό των assemblers είναι ότι μεταφράζουν κυριολεκτικά μια συμβολική εντολή σε μια εντολή μηχανής. Έτσι, η γλώσσα συναρμολόγησης (ονομάζεται επίσης autocode) έχει σχεδιαστεί για να διευκολύνει την αντίληψη του συνόλου εντολών του υπολογιστή και να επιταχύνει τον προγραμματισμό σε αυτό το σύνολο εντολών. Είναι πολύ πιο εύκολο για έναν προγραμματιστή να θυμάται τη μνημονική ονομασία των εντολών μηχανής παρά τον δυαδικό κώδικα τους.

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

Ο μεταγλωττιστής είναι ένα βοηθητικό πρόγραμμα που μεταφράζει σε γλώσσα μηχανής ένα πρόγραμμα γραμμένο σε γλώσσα προγραμματισμού πηγής. Ακριβώς όπως ένας assembler, ένας μεταγλωττιστής μετατρέπει ένα πρόγραμμα από μια γλώσσα σε άλλη (τις περισσότερες φορές, στη γλώσσα ενός συγκεκριμένου υπολογιστή). Ωστόσο, οι εντολές της γλώσσας πηγής διαφέρουν σημαντικά ως προς την οργάνωση και την ισχύ από τις εντολές της γλώσσας μηχανής. Υπάρχουν γλώσσες στις οποίες μία οδηγία της γλώσσας πηγής μεταφράζεται σε 7-10 οδηγίες μηχανής. Ωστόσο, υπάρχουν επίσης γλώσσες στις οποίες κάθε εντολή μπορεί να αντιστοιχεί σε 100 ή περισσότερες οδηγίες μηχανής (για παράδειγμα, Prolog). Επιπλέον, στις γλώσσες πηγής χρησιμοποιείται συχνά αυστηρή πληκτρολόγηση δεδομένων, η οποία πραγματοποιείται μέσω της προκαταρκτικής περιγραφής τους. Ο προγραμματισμός μπορεί να μην βασίζεται στην κωδικοποίηση ενός αλγορίθμου, αλλά στην προσεκτική σκέψη σχετικά με τις δομές δεδομένων ή τις κλάσεις. Η διαδικασία μετάφρασης από τέτοιες γλώσσες συνήθως ονομάζεται μεταγλώττιση και οι γλώσσες πηγής αναφέρονται συνήθως ως γλώσσες προγραμματισμού υψηλού επιπέδου (ή γλώσσες υψηλού επιπέδου). Η αφαίρεση της γλώσσας προγραμματισμού από το σύστημα εντολών του υπολογιστή οδήγησε στην ανεξάρτητη δημιουργία μιας μεγάλης ποικιλίας γλωσσών που επικεντρώθηκαν στην επίλυση συγκεκριμένων προβλημάτων. Οι γλώσσες εμφανίστηκαν για επιστημονικούς υπολογισμούς, οικονομικούς υπολογισμούς, πρόσβαση σε βάσεις δεδομένων και άλλα.

Ο διερμηνέας είναι ένα πρόγραμμα ή μια συσκευή που εκτελεί τη μετάφραση και την εκτέλεση του αρχικού προγράμματος από χειριστή προς χειριστή. Σε αντίθεση με έναν μεταγλωττιστή, ένας διερμηνέας δεν παράγει ένα πρόγραμμα γλώσσας μηχανής ως έξοδο. Έχοντας αναγνωρίσει την εντολή της γλώσσας πηγής, την εκτελεί αμέσως. Τόσο οι μεταγλωττιστές όσο και οι διερμηνείς χρησιμοποιούν τις ίδιες μεθόδους ανάλυσης του πηγαίου κώδικα ενός προγράμματος. Αλλά ο διερμηνέας σας επιτρέπει να ξεκινήσετε την επεξεργασία δεδομένων αφού γράψετε έστω και μία εντολή. Αυτό καθιστά τη διαδικασία ανάπτυξης και εντοπισμού σφαλμάτων προγραμμάτων πιο ευέλικτη. Επιπλέον, η έλλειψη κωδικού μηχανής εξόδου σας επιτρέπει να μην "σκουπίζετε" εξωτερικές συσκευές επιπλέον αρχεία, και ο ίδιος ο διερμηνέας μπορεί να προσαρμοστεί πολύ εύκολα σε οποιαδήποτε αρχιτεκτονική μηχανής αναπτύσσοντάς τον μόνο μία φορά σε μια ευρέως χρησιμοποιούμενη γλώσσα προγραμματισμού. Ως εκ τούτου, οι ερμηνευτικές γλώσσες όπως η Java Script, η VB Script έχουν γίνει ευρέως διαδεδομένες. Το μειονέκτημα των διερμηνέων είναι η χαμηλή ταχύτητα εκτέλεσης του προγράμματος. Συνήθως, τα ερμηνευμένα προγράμματα εκτελούνται 50 έως 100 φορές πιο αργά από τα προγράμματα που είναι γραμμένα σε κώδικα μηχανής.

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

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

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

Transcoder - ένα πρόγραμμα ή μια συσκευή λογισμικού που μεταφράζει προγράμματα γραμμένα στη γλώσσα μηχανής ενός υπολογιστή σε προγράμματα στη γλώσσα μηχανής ενός άλλου υπολογιστή. Εάν ο εξομοιωτής είναι ένα λιγότερο έξυπνο ανάλογο του διερμηνέα, τότε ο μετακωδικοποιητής ενεργεί με την ίδια ικανότητα σε σχέση με τον μεταγλωττιστή. Ομοίως, ο πηγαίος (και συνήθως δυαδικός) κώδικας μηχανής ή μια ενδιάμεση αναπαράσταση μετατρέπεται σε άλλον παρόμοιο κώδικα σε μία εντολή και χωρίς καμία γενική ανάλυση της δομής του προγράμματος πηγής. Οι μετακωδικοποιητές είναι χρήσιμοι κατά τη μεταφορά προγραμμάτων από μια αρχιτεκτονική υπολογιστή σε άλλη. Μπορούν επίσης να χρησιμοποιηθούν για την ανασύνθεση του κειμένου ενός γλωσσικού προγράμματος υψηλού επιπέδου από τον διαθέσιμο δυαδικό κώδικα.

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

Οι μακροεπεξεργαστές χρησιμοποιούνται επίσης με γλώσσες υψηλού επιπέδου. Αυξάνουν τη λειτουργικότητα γλωσσών όπως PL/1, C, C++. Οι μακροεπεξεργαστές χρησιμοποιούνται ευρέως σε C και C++, καθιστώντας ευκολότερη τη σύνταξη προγραμμάτων. Οι μακροεπεξεργαστές αυξάνουν την αποτελεσματικότητα του προγραμματισμού χωρίς να αλλάζουν τη σύνταξη και τη σημασιολογία της γλώσσας.

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

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

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

Οποιοσδήποτε μεταφραστής εκτελεί τις ακόλουθες κύριες εργασίες:

  • - αναλύει το πρόγραμμα εκπομπής, ειδικότερα, προσδιορίζει εάν περιέχει συντακτικά λάθη.
  • - δημιουργεί ένα πρόγραμμα εξόδου (συχνά ονομάζεται πρόγραμμα αντικειμένου) στη γλώσσα των εντολών μηχανής.
  • - εκχωρεί μνήμη για το πρόγραμμα αντικειμένων.1.1 Διερμηνείς

Ένα συχνά αναφερόμενο πλεονέκτημα της εφαρμογής διερμηνέα είναι ότι επιτρέπει την "άμεση λειτουργία". Η άμεση λειτουργία σάς επιτρέπει να ζητάτε από τον υπολογιστή μια εργασία όπως το PRINT 3.14159*3/2.1 και σας επιστρέφει την απάντηση μόλις πατήσετε το ENTER (αυτό σας επιτρέπει να χρησιμοποιήσετε έναν υπολογιστή 3.000 $ ως αριθμομηχανή $10). Επιπλέον, οι διερμηνείς έχουν ειδικά χαρακτηριστικά που διευκολύνουν τον εντοπισμό σφαλμάτων. Μπορείτε, για παράδειγμα, να διακόψετε την επεξεργασία ενός προγράμματος διερμηνέα, να εμφανίσετε τα περιεχόμενα ορισμένων μεταβλητών, να περάσετε το πρόγραμμα και στη συνέχεια να συνεχίσετε την εκτέλεση.

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

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

Ένα λεπτό μειονέκτημα των διερμηνέων είναι ότι τείνουν να αποθαρρύνουν το καλό στυλ προγραμματισμού. Επειδή τα σχόλια και άλλες λεπτομέρειες που μπορούν να επισημοποιηθούν καταλαμβάνουν πολλή μνήμη προγράμματος, οι άνθρωποι τείνουν να μην τα χρησιμοποιούν. Ο διάβολος είναι λιγότερο έξαλλος από έναν προγραμματιστή BASIC διερμηνέα που προσπαθεί να βάλει ένα πρόγραμμα 120K σε μνήμη 60K. αλλά το χειρότερο από όλα είναι ότι οι διερμηνείς είναι αργοί.

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

Εξετάστε το πρόγραμμα: στον διερμηνέα BASIC 10 FOR N=1 TO 1000 20 PRINT N,SQR(N) 30 NEXT N κατά την πρώτη μετάβαση μέσω αυτού του προγράμματος, ο BASIC Interpreter πρέπει να μαντέψει τι σημαίνει η γραμμή 20:

  • 1. μετατρέψτε την αριθμητική μεταβλητή N σε συμβολοσειρά
  • 2. στείλτε μια συμβολοσειρά στην οθόνη
  • 3. μεταβείτε στην επόμενη περιοχή εκτύπωσης
  • 4. Να υπολογίσετε την τετραγωνική ρίζα του Ν
  • 5. μετατρέψτε το αποτέλεσμα σε συμβολοσειρά
  • 6. στείλτε μια συμβολοσειρά στην οθόνη

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


4. Βασικές αρχές κατασκευής μεταφραστών. Μεταφραστές, μεταγλωττιστές και διερμηνείς - το γενικό σχήμα εργασίας. Σύγχρονοι μεταγλωττιστές και διερμηνείς.

Βασικές αρχές κατασκευής μεταφραστών.

Μεταφραστές, μεταγλωττιστές, διερμηνείς - το γενικό σχήμα εργασίας.

Ορισμός μεταφραστή, μεταγλωττιστή, διερμηνέα

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

Επίσημος ορισμός του μεταφραστή

Μεταφράστηςείναι ένα πρόγραμμα που μεταφράζει ένα πρόγραμμα εισόδου στη γλώσσα πηγής (εισόδου) σε ένα ισοδύναμο πρόγραμμα εξόδου στη γλώσσα που προκύπτει (εξόδου). Σε αυτόν τον ορισμό, η λέξη "πρόγραμμα" εμφανίζεται τρεις φορές, και αυτό δεν είναι σφάλμα ή ταυτολογία. Πράγματι, στο έργο του μεταφραστή συμμετέχουν πάντα τρία προγράμματα.

Πρώτον, ο ίδιος ο μεταφραστής είναι ένα πρόγραμμα 1 - συνήθως περιλαμβάνεται στο λογισμικό συστήματος ενός συστήματος υπολογιστή. Δηλαδή, ο μεταφραστής είναι ένα κομμάτι λογισμικού (λογισμικό), είναι ένα σύνολο εντολών και δεδομένων μηχανής και εκτελείται από έναν υπολογιστή, όπως όλα τα άλλα προγράμματα ενός λειτουργικού συστήματος (OS). Όλα τα στοιχεία του μεταφραστή είναι τμήματα ή ενότητες του προγράμματος με τα δικά τους δεδομένα εισόδου και εξόδου.

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

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

Έτσι, για να δημιουργήσετε έναν μεταφραστή, πρέπει πρώτα να επιλέξετε τις γλώσσες εισόδου και εξόδου. Από την άποψη της μετατροπής προτάσεων στη γλώσσα εισόδου σε ισοδύναμες προτάσεις στη γλώσσα εξόδου, ο μεταφραστής ενεργεί ως μεταφραστής. Για παράδειγμα, η μετάφραση ενός προγράμματος από το C σε γλώσσα συναρμολόγησης ουσιαστικά δεν διαφέρει από τη μετάφραση, ας πούμε, από τα ρωσικά στα αγγλικά, με τη μόνη διαφορά ότι η πολυπλοκότητα των γλωσσών είναι κάπως διαφορετική (γιατί δεν υπάρχουν μεταφραστές από φυσικές γλώσσες ​- δείτε την ενότητα "Ταξινόμηση γλωσσών και γραμματικών, κεφάλαιο 9). Επομένως, η ίδια η λέξη «translator» (αγγλικά: translator) σημαίνει «μεταφραστής».

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

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

ορισμός μεταγλωττιστή.

Η διαφορά μεταξύ μεταγλωττιστή και μεταφραστή

Εκτός από την έννοια του "μεταφραστή", χρησιμοποιείται ευρέως και η έννοια "μεταγλωττιστής", που είναι κοντά σε αυτήν.

Μεταγλωττιστής -είναι ένας μεταφραστής που μεταφράζει ένα πρόγραμμα πηγής στο αντίστοιχο πρόγραμμα αντικειμένων στη γλώσσα μηχανής ή στη γλώσσα συναρμολόγησης.

Έτσι, ένας μεταγλωττιστής διαφέρει από έναν μεταφραστή μόνο στο ότι το πρόγραμμα που προκύπτει πρέπει πάντα να είναι γραμμένο σε κώδικα μηχανής ή γλώσσα συναρμολόγησης. Το πρόγραμμα μεταφραστή που προκύπτει, γενικά, μπορεί να γραφτεί σε οποιαδήποτε γλώσσα - είναι δυνατόν, για παράδειγμα, να μεταφραστούν προγράμματα από Pascal σε C. Συνεπώς, κάθε μεταγλωττιστής είναι μεταφραστής, αλλά όχι το αντίστροφο - δεν θα είναι κάθε μεταφραστής μεταγλωττιστής . Για παράδειγμα, ο μεταφραστής από το Pascal στο C που αναφέρεται παραπάνω δεν θα είναι 1 .

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

Το πρόγραμμα μεταγλωττιστή που προκύπτει ονομάζεται "πρόγραμμα αντικειμένου" ή "κώδικας αντικειμένου". Το αρχείο στο οποίο γράφεται συνήθως ονομάζεται "αρχείο αντικειμένου". Ακόμη και όταν το πρόγραμμα που προκύπτει δημιουργείται σε γλώσσα μηχανής, υπάρχει σημαντική διαφορά μεταξύ ενός προγράμματος αντικειμένου (αρχείο αντικειμένου) και ενός εκτελέσιμου προγράμματος (εκτελέσιμο αρχείο). Το πρόγραμμα που δημιουργείται από τον μεταγλωττιστή δεν μπορεί να εκτελεστεί απευθείας σε υπολογιστή, καθώς δεν συνδέεται με μια συγκεκριμένη περιοχή μνήμης όπου θα πρέπει να βρίσκονται ο κώδικας και τα δεδομένα του (για περισσότερες λεπτομέρειες, βλ. ενότητα "Αρχές λειτουργίας συστημάτων προγραμματισμού", Κεφάλαιο 15 ) 2.

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

Φυσικά, οι μεταφραστές και οι μεταγλωττιστές, όπως όλα τα άλλα προγράμματα, αναπτύσσονται από ένα άτομο (άτομα) - συνήθως μια ομάδα προγραμματιστών. Κατ' αρχήν, θα μπορούσαν να το δημιουργήσουν απευθείας στη γλώσσα των εντολών μηχανής, αλλά η ποσότητα του κώδικα και των δεδομένων των σύγχρονων μεταγλωττιστών είναι τέτοια που η δημιουργία τους στη γλώσσα των οδηγιών μηχανής είναι σχεδόν αδύνατη σε εύλογο χρόνο με λογικό κόστος εργασίας. Επομένως, σχεδόν όλοι οι σύγχρονοι μεταγλωττιστές δημιουργούνται επίσης χρησιμοποιώντας μεταγλωττιστές (συνήθως, προηγούμενες εκδόσεις μεταγλωττιστών από τον ίδιο κατασκευαστή ενεργούν σε αυτόν τον ρόλο). Και με αυτήν την ιδιότητα, ο μεταγλωττιστής είναι ήδη το πρόγραμμα εξόδου για έναν άλλο μεταγλωττιστή, ο οποίος δεν είναι καλύτερος και χειρότερος από όλα τα άλλα προγράμματα εξόδου που δημιουργούνται 2 .

Ορισμός διερμηνέα. Η διαφορά μεταξύ διερμηνέων και μεταφραστών

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

Διερμηνέας -είναι ένα πρόγραμμα που παίρνει ένα πρόγραμμα εισαγωγής σε μια γλώσσα πηγής και το εκτελεί.

Σε αντίθεση με τους μεταφραστές, οι διερμηνείς δεν δημιουργούν το πρόγραμμα που προκύπτει (ή οποιονδήποτε κώδικα που προκύπτει γενικά) - και αυτή είναι η θεμελιώδης διαφορά μεταξύ τους. Ο διερμηνέας, όπως και ο μεταφραστής, αναλύει το κείμενο του προγράμματος πηγής. Ωστόσο, δεν δημιουργεί το πρόγραμμα που προκύπτει, αλλά εκτελεί αμέσως το αρχικό πρόγραμμα σύμφωνα με το νόημά του που δίνεται από τη σημασιολογία της γλώσσας εισόδου. Έτσι, το αποτέλεσμα του διερμηνέα θα είναι το αποτέλεσμα που δίνεται από τη σημασία του προγράμματος πηγής, εάν αυτό το πρόγραμμα είναι σωστό, ή ένα μήνυμα σφάλματος εάν το πρόγραμμα πηγής είναι λανθασμένο.

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

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

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

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

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

Τα πρώτα προγράμματα που δημιουργήθηκαν για υπολογιστές πρώτης γενιάς γράφτηκαν απευθείας στη γλώσσα των κωδικών μηχανής. Ήταν πραγματικά μια κόλαση δουλειά. Αμέσως έγινε σαφές ότι ένα άτομο δεν πρέπει και δεν μπορεί να μιλήσει τη γλώσσα των εντολών της μηχανής, ακόμα κι αν είναι ειδικός υπολογιστών. O; Ωστόσο, όλες οι προσπάθειες να διδάξουμε έναν υπολογιστή να μιλάει τις γλώσσες των ανθρώπων έχουν στεφθεί με επιτυχία και είναι απίθανο να στεφθούν ποτέ (για τους οποίους υπάρχουν ορισμένοι θετικοί λόγοι που συζητούνται στο πρώτο κεφάλαιο αυτού του εγχειριδίου).

Έκτοτε, η όλη ανάπτυξη του λογισμικού υπολογιστών είναι άρρηκτα συνδεδεμένη με την εμφάνιση και την ανάπτυξη μεταγλωττιστών.

Οι πρώτοι μεταγλωττιστές ήταν μεταγλωττιστές από γλώσσες assembly ή, όπως ονομάζονταν, μνημονικοί κώδικες. Οι Mnemocodes έχουν μετατρέψει το "filkin's letter" των εντολών της μηχανής σε μια λίγο πολύ κατανοητή γλώσσα για έναν ειδικό - τους μονολεκτικούς (κυρίως αγγλικούς) χαρακτηρισμούς αυτών των εντολών. (Έχει ήδη γίνει πολύ πιο εύκολο να δοθούν προγράμματα, αλλά ούτε ένας υπολογιστής δεν είναι ικανός να εκτελεί mnems (γλώσσα συναρμολόγησης), επομένως, υπήρχε ανάγκη να δημιουργηθούν μεταγλωττιστές. Αυτοί οι μεταγλωττιστές είναι στοιχειώδεις, αλλά συνεχίζουν να παίζουν σημαντικό ρόλο στο συστήματα προγραμματισμού σήμερα Περισσότερες λεπτομέρειες σχετικά με τη γλώσσα assembly και τους μεταγλωττιστές από την ιστορία της: περαιτέρω στην αντίστοιχη ενότητα.

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

Η έλευση των γλωσσών υψηλού επιπέδου απλοποίησε πολύ τη διαδικασία προγραμματισμού, αν και δεν την μείωσε στο "επίπεδο νοικοκυράς", όπως ικέτησαν αλαζονικά ορισμένοι συγγραφείς στην αυγή της γέννησης των γλωσσών προγραμματισμού 1 . Υπήρχαν λίγες τέτοιες γλώσσες, τότε δεκάδες, τώρα, πιθανώς, υπάρχουν περισσότερες από εκατό από αυτές. Δεν υπάρχει τέλος σε αυτή τη διαδικασία. Ωστόσο, οι υπολογιστές της παραδοσιακής αρχιτεκτονικής "Neumann", που μπορούν να κατανοήσουν μόνο οδηγίες μηχανής, εξακολουθούν να κυριαρχούν, επομένως το ζήτημα της δημιουργίας μεταγλωττιστών εξακολουθεί να είναι σχετικό.

Από τη στιγμή που υπήρξε τεράστια ανάγκη δημιουργίας μεταγλωττιστών, άρχισε να αναπτύσσεται μια εξειδικευμένη θεωρία. Με τον καιρό, βρήκε μια πρακτική εφαρμογή σε μια ποικιλία δημιουργημένων μεταγλωττιστών. Μεταγλωττιστές έχουν δημιουργηθεί και συνεχίζουν να δημιουργούνται όχι μόνο για νέες, αλλά και για πολύ γνωστές γλώσσες. Πολλοί κατασκευαστές από γνωστές, αξιόπιστες εταιρείες (όπως η Microsoft ή η Inprise) έως ελάχιστα γνωστές ομάδες συγγραφέων κυκλοφορούν όλο και περισσότερα νέα δείγματα μεταγλωττιστών στην αγορά. Αυτό οφείλεται σε διάφορους λόγους, οι οποίοι θα συζητηθούν παρακάτω.

Τέλος, δεδομένου ότι οι περισσότερες από τις θεωρητικές πτυχές στον τομέα των μεταγλωττιστών έχουν λάβει την πρακτική εφαρμογή τους (και αυτό, πρέπει να ειπωθεί, συνέβη αρκετά γρήγορα, στα τέλη της δεκαετίας του '60), η ανάπτυξη των μεταγλωττιστών έχει ακολουθήσει το μονοπάτι της φιλικότητας τους προς άτομο - χρήστης, προγραμματιστής προγραμμάτων σε γλώσσες υψηλού επιπέδου. Το λογικό συμπέρασμα αυτής της διαδικασίας ήταν η δημιουργία συστημάτων προγραμματισμού - συστήματα λογισμικού, που συνδυάζουν, εκτός από απευθείας μεταγλωττιστές, πολλά σχετικά στοιχεία λογισμικού. Έχοντας εμφανιστεί, τα συστήματα προγραμματισμού κατέκτησαν γρήγορα την αγορά και πλέον κυριαρχούν ως επί το πλείστον (στην πραγματικότητα, οι ξεχωριστοί μεταγλωττιστές είναι σπάνιο μεταξύ των σύγχρονων εργαλείων λογισμικού). Για πληροφορίες σχετικά με το τι είναι τα σύγχρονα συστήματα προγραμματισμού και πώς είναι οργανωμένα, ανατρέξτε στο κεφάλαιο Σύγχρονα Συστήματα Προγραμματισμού. Τώρα οι μεταγλωττιστές αποτελούν αναπόσπαστο μέρος κάθε υπολογιστικού συστήματος. Χωρίς την ύπαρξή τους, ο προγραμματισμός οποιασδήποτε εφαρμοσμένης εργασίας θα ήταν δύσκολος, αν όχι αδύνατος. Και ο προγραμματισμός εξειδικευμένων εργασιών συστήματος, κατά κανόνα, πραγματοποιείται εάν όχι σε μια γλώσσα υψηλού επιπέδου (το C χρησιμοποιείται συχνότερα σε αυτόν τον ρόλο), τότε στη γλώσσα συναρμολόγησης, επομένως, χρησιμοποιείται ένας κατάλληλος μεταγλωττιστής. Ο απευθείας προγραμματισμός σε γλώσσες κώδικα μηχανής είναι εξαιρετικά σπάνιος και μόνο για την επίλυση πολύ στενών προβλημάτων. Λίγα λόγια για παραδείγματα υλοποιήσεων μεταγλωττιστών και διερμηνέων, καθώς και για το πώς σχετίζονται με άλλα υπάρχοντα εργαλεία λογισμικού. Οι μεταγλωττιστές, όπως θα φανεί αργότερα, είναι συνήθως κάπως ευκολότεροι στην εφαρμογή από τους διερμηνείς. Από πλευράς αποτελεσματικότητας, τα ξεπερνούν επίσης - είναι προφανές ότι ο μεταγλωττισμένος κώδικας θα εκτελείται πάντα πιο γρήγορα από την ερμηνεία ενός παρόμοιου προγράμματος πηγής. Επιπλέον, δεν επιτρέπει κάθε γλώσσα προγραμματισμού την κατασκευή ενός απλού διερμηνέα. Ωστόσο, οι διερμηνείς έχουν ένα σημαντικό πλεονέκτημα - ο μεταγλωττισμένος κώδικας συνδέεται πάντα με την αρχιτεκτονική του συστήματος υπολογιστή στο οποίο είναι προσανατολισμένος και το πρόγραμμα πηγής συνδέεται μόνο με τη σημασιολογία της γλώσσας προγραμματισμού, η οποία είναι πολύ πιο εύκολο να τυποποιηθεί. Αυτή η πτυχή αρχικά αγνοήθηκε. Οι πρώτοι μεταγλωττιστές ήταν μνημονικοί μεταγλωττιστές. Οι απόγονοί τους - σύγχρονοι μεταγλωττιστές από γλώσσες συναρμολόγησης - υπάρχουν για όλα σχεδόν τα γνωστά υπολογιστικά συστήματα. Είναι εξαιρετικά άκαμπτα εστιασμένα στην αρχιτεκτονική. Στη συνέχεια υπήρχαν μεταγλωττιστές από γλώσσες όπως FORTRAN, ALGOL-68, PL/1. Επικεντρώθηκαν σε μεγάλους υπολογιστές με ομαδική επεξεργασία εργασιών. Από τα παραπάνω, μόνο το FORTRAN, ίσως, συνεχίζει να χρησιμοποιείται μέχρι σήμερα, αφού διαθέτει τεράστιο αριθμό βιβλιοθηκών για διάφορους σκοπούς. Πολλές γλώσσες, αφού γεννήθηκαν, δεν έγιναν ευρέως διαδεδομένες - οι ADA, Modula, Simula είναι γνωστές μόνο σε έναν στενό κύκλο ειδικών. Ταυτόχρονα, η αγορά συστήματα λογισμικούκυριαρχείται από μεταγλωττιστές γλωσσών που δεν προβλεπόταν ότι θα είχαν λαμπρό μέλλον. Πρώτα απ 'όλα, τώρα είναι C και C ++. Ο πρώτος από αυτούς γεννήθηκε με λειτουργικά συστήματαόπως το UNIX, μαζί με αυτό κέρδισε τη "θέση στον ήλιο" και στη συνέχεια μετακόμισε σε λειτουργικά συστήματα άλλων τύπων. Το δεύτερο ενσωμάτωσε με επιτυχία από μόνο του ένα παράδειγμα εφαρμογής των ιδεών του αντικειμενοστρεφούς προγραμματισμού σε μια καλά εδραιωμένη πρακτική βάση 1 . Μπορείτε επίσης να αναφέρετε το αρκετά κοινό Pascal, το οποίο, απροσδόκητα για πολλούς, έχει ξεφύγει από τα όρια μιας καθαρά εκπαιδευτικής γλώσσας για πανεπιστημιακό περιβάλλον.

Η ιστορία των διερμηνέων δεν είναι τόσο πλούσια (ακόμα!). Όπως ήδη αναφέρθηκε, αρχικά δεν τους δόθηκε σημαντική σημασία, αφού σχεδόν από όλες τις απόψεις είναι κατώτεροι από τους μεταγλωττιστές. Από τις γνωστές γλώσσες που υποδηλώνουν διερμηνεία, μπορεί κανείς να αναφέρει μόνο τη Basic, αν και οι περισσότεροι γνωρίζουν πλέον τη μεταγλωττισμένη εφαρμογή της Visual Basic, κατασκευασμένη από τη Microsoft. Ωστόσο, τώρα η κατάσταση έχει αλλάξει κάπως, αφού το ζήτημα της φορητότητας λογισμικού και της ανεξαρτησίας του υλικού-πλατφόρμας γίνεται όλο και πιο σημαντικό με την ανάπτυξη του Διαδικτύου. Το πιο γνωστό παράδειγμα σήμερα είναι η γλώσσα Java (η οποία συνδυάζει τη μεταγλώττιση και την ερμηνεία) και το σχετικό JavaScript. Εξάλλου, η γλώσσα HTML, η οποία στηρίζει το πρωτόκολλο HTTP που οδήγησε σε μια τόσο γρήγορη ανάπτυξη του Παγκόσμιου Ιστού, είναι επίσης μια ερμηνευτική γλώσσα. Σύμφωνα με τον συγγραφέα, όλοι περιμένουν εκπλήξεις στον τομέα της εμφάνισης νέων διερμηνέων και οι πρώτοι από αυτούς έχουν ήδη εμφανιστεί - για παράδειγμα, η γλώσσα C # ("C-sharp", αλλά το όνομα είναι παντού σαν "C sharp"), που ανακοίνωσε η Microsoft.

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

στάδια της μετάφρασης. Γενικό σχήμα του μεταφραστή

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

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

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

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

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

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

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

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

Τεχνολογίαείναι το κύριο μέρος του μεταγλωττιστή στο στάδιο της ανάλυσης. Το O εκτελεί την εξαγωγή συντακτικών κατασκευών στο κείμενο του προγράμματος πηγής, που επεξεργάζεται ο λεξικός αναλυτής. Στην ίδια φάση της μεταγλώττισης ελέγχεται η συντακτική ορθότητα του προγράμματος. Ο αναλυτής παίζει σημαντικό ρόλο - ο ρόλος του αναγνωριστικού κειμένου της γλώσσας προγραμματισμού εισόδου (δείτε την ενότητα "Αναλυτές. Συντακτικά ελεγχόμενη μετάφραση" αυτού του κεφαλαίου).

Σημασιολογική ανάλυσηείναι το τμήμα του μεταγλωττιστή που ελέγχει το σωστό* κείμενο του προγράμματος πηγής ως προς τη σημασιολογία της γλώσσας εισόδου. CRS απευθείας επικύρωση, σημασιολογική ανάλυση πρέπει να εκτελέσει τη μετατροπή? Ορισμοί κειμένου που απαιτούνται από τη σημασιολογία της γλώσσας πηγής (όπως η προσθήκη σιωπηρών συναρτήσεων μετατροπής τύπου). Σε διάφορες υλοποιήσεις του συγγρ. Tori, η σημασιολογική ανάλυση μπορεί εν μέρει να εισέλθει στη φάση της συντακτικής * ανάλυσης, εν μέρει - στη φάση της προετοιμασίας για τη δημιουργία κώδικα.

Προετοιμασία για δημιουργία κώδικαείναι η φάση κατά την οποία ο μεταγλωττιστής εκτελεί προκαταρκτικές ενέργειες που σχετίζονται άμεσα με τη σύνθεση του κειμένου του προγράμματος που προκύπτει, αλλά δεν οδηγούν ακόμη στη δημιουργία κειμένου στη γλώσσα εξόδου. Τυπικά, αυτή η φάση περιλαμβάνει δραστηριότητες που σχετίζονται με την αναγνώριση γλωσσικών στοιχείων, την κατανομή μνήμης κ.λπ. (βλ. ενότητα «Σημασιολογική ανάλυση και προετοιμασία για δημιουργία κώδικα», Κεφάλαιο 14).

Δημιουργία κώδικα- αυτή είναι η φάση που σχετίζεται άμεσα με τη δημιουργία του κώματος των συστατικών προτάσεων της γλώσσας στόχου και του κειμένου που προκύπτει ως σύνολο

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

Ο μεταγλωττιστής στο σύνολό του, από την άποψη της θεωρίας των τυπικών γλωσσών, ενεργεί σε «δύο ρόλους», εκτελεί δύο κύριες λειτουργίες. προγράμματα. Αυτή είναι η κύρια φάση στο στάδιο της σύνθεσης του προγράμματος που προκύπτει. Εκτός από την άμεση δημιουργία του κειμένου του προγράμματος που προκύπτει, η δημιουργία συνήθως περιλαμβάνει επίσης βελτιστοποίηση - μια διαδικασία που σχετίζεται με την επεξεργασία του ήδη δημιουργημένου κειμένου. Μερικές φορές η βελτιστοποίηση ξεχωρίζει ως ξεχωριστή φάση μεταγλώττισης, καθώς έχει σημαντικό αντίκτυπο στην ποιότητα και την αποτελεσματικότητα του προγράμματος που προκύπτει (βλ. ενότητες "Δημιουργία κώδικα. Μέθοδοι δημιουργίας κώδικα" και "Βελτιστοποίηση κώδικα. Βασικές μέθοδοι βελτιστοποίησης", Κεφάλαιο 14 ).

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

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

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

Έννοια του περάσματος. Μεταγλωττιστές πολλαπλών και μονοπερασμάτων

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

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

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

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

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

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

Ωστόσο, δεν είναι πάντα δυνατό να μειωθεί ο αριθμός των περασμάτων. Ο αριθμός των απαραίτητων περασμάτων καθορίζεται κυρίως από τους γραμματικούς και σημασιολογικούς κανόνες της γλώσσας πηγής. Όσο πιο περίπλοκη είναι η γραμματική της γλώσσας και όσο περισσότερες επιλογές προτείνουν οι σημασιολογικοί κανόνες, τόσο περισσότερα περάσματα θα εκτελεί ο μεταγλωττιστής (φυσικά παίζουν ρόλο και τα προσόντα των προγραμματιστών του μεταγλωττιστή). Για παράδειγμα, αυτός είναι ο λόγος που οι μεταγλωττιστές Pascal είναι συνήθως πιο γρήγοροι από τους μεταγλωττιστές C - η γραμματική του Pascal είναι πιο απλή και οι σημασιολογικοί κανόνες είναι πιο αυστηροί. Οι μεταγλωττιστές με ένα πέρασμα είναι σπάνιοι, είναι δυνατοί μόνο για πολύ απλές γλώσσες. Οι πραγματικοί μεταγλωττιστές συνήθως εκτελούν δύο έως πέντε περάσματα. Έτσι οι πραγματικοί μεταγλωττιστές είναι πολλαπλών περασμάτων. Οι πιο συνηθισμένοι είναι οι μεταγλωττιστές δύο και τριών περασμάτων, για παράδειγμα: το πρώτο πέρασμα είναι λεξιλογική ανάλυση, το δεύτερο είναι η ανάλυση και η σημασιολογική ανάλυση, το τρίτο είναι η δημιουργία κώδικα και η βελτιστοποίηση (οι επιλογές εκτέλεσης, φυσικά, εξαρτώνται από τον προγραμματιστή). Στα σύγχρονα συστήματα προγραμματισμού, το πρώτο πέρασμα του μεταγλωττιστή (λεξική ανάλυση του κώδικα) εκτελείται συχνά παράλληλα με την επεξεργασία του κώδικα του προγράμματος πηγής (αυτή η παραλλαγή της κατασκευής μεταγλωττιστών συζητείται αργότερα σε αυτό το κεφάλαιο).

Διερμηνείς. Χαρακτηριστικά διερμηνέων κτιρίων

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

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

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

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

Η απουσία βήματος βελτιστοποίησης ορίζει ένα άλλο χαρακτηριστικό που είναι χαρακτηριστικό για πολλούς διερμηνείς: η αντίστροφη πολωνική σημείωση χρησιμοποιείται πολύ συχνά ως εσωτερική αναπαράσταση του προγράμματος (βλ. ενότητα "Δημιουργία κώδικα. Μέθοδοι δημιουργίας κώδικα", Κεφάλαιο 14). Αυτή η βολική μορφή αναπαράστασης λειτουργιών έχει μόνο ένα σημαντικό μειονέκτημα - είναι δύσκολο να βελτιστοποιηθεί. Αλλά στους διερμηνείς, αυτό ακριβώς δεν απαιτείται.

Δεν επιτρέπουν όλες οι γλώσσες προγραμματισμού την κατασκευή διερμηνέων που θα μπορούσαν να εκτελέσουν το πρόγραμμα πηγής καθώς φτάνουν οι εντολές. Για να γίνει αυτό, η γλώσσα πρέπει να επιτρέπει την ύπαρξη ενός μεταγλωττιστή που αναλύει το πρόγραμμα πηγής με ένα πέρασμα. Επιπλέον, μια γλώσσα δεν μπορεί να ερμηνευτεί ως λήψη εντολών εάν επιτρέπει την εμφάνιση κλήσεων σε συναρτήσεις και δομές δεδομένων πριν από την άμεση περιγραφή τους. Επομένως, γλώσσες όπως η C και η Pascal δεν μπορούν να ερμηνευθούν με αυτήν τη μέθοδο.

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

Το πλεονέκτημα του διερμηνέα είναι η ανεξαρτησία της εκτέλεσης του προγράμματος από την αρχιτεκτονική του συστήματος του υπολογιστή-στόχου. Ως αποτέλεσμα της μεταγλώττισης, λαμβάνεται ένας κώδικας αντικειμένου, ο οποίος είναι πάντα προσανατολισμένος σε μια συγκεκριμένη αρχιτεκτονική. Για να μεταβείτε σε άλλη αρχιτεκτονική των στοχευόμενων υπολογιστικών συστημάτων], το πρόγραμμα πρέπει να μεταγλωττιστεί εκ νέου. Και για να ερμηνεύσετε προγράμματα] είναι απαραίτητο να έχετε μόνο τον πηγαίο κώδικα του και έναν διερμηνέα από την κατάλληλη γλώσσα.

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

Μια νέα ώθηση στην ανάπτυξη των διερμηνέων έδωσε η εξάπλωση του παγκόσμιου δίκτυα υπολογιστών. Τέτοια δίκτυα μπορούν να περιλαμβάνουν υπολογιστές προσωπικής αρχιτεκτονικής και τότε η απαίτηση για ομοιόμορφη υλοποίηση του κειμένου του προγράμματος πηγής σε καθένα από αυτά καθίσταται καθοριστική. Ως εκ τούτου, με την ανάπτυξη των παγκόσμιων δικτύων και την εξάπλωση του παγκόσμιου Διαδικτύου,
Στα σύγχρονα συστήματα προγραμματισμού, υπάρχουν εφαρμογές λογισμικού που συνδυάζουν τόσο τις λειτουργίες ενός μεταγλωττιστή όσο και τις λειτουργίες ενός διερμηνέα - ανάλογα με τις απαιτήσεις του χρήστη, το πρόγραμμα πηγής είτε μεταγλωττίζεται είτε εκτελείται (ερμηνεύεται). Επιπλέον, ορισμένες σύγχρονες γλώσσες προγραμματισμού περιλαμβάνουν δύο στάδια ανάπτυξης: πρώτον, το πρόγραμμα πηγής μεταγλωττίζεται σε ενδιάμεσο κώδικα (κάποια γλώσσα χαμηλού επιπέδου) και στη συνέχεια αυτό το αποτέλεσμα μεταγλώττισης εκτελείται χρησιμοποιώντας τον διερμηνέα αυτής της ενδιάμεσης γλώσσας. Πιο αναλυτικά, οι επιλογές για τέτοια συστήματα συζητούνται στο κεφάλαιο "Σύγχρονα Συστήματα Προγραμματισμού".

Ένα ευρέως χρησιμοποιούμενο παράδειγμα ερμηνευμένης γλώσσας είναι η HTML (Hypertext Markup Language), μια γλώσσα περιγραφής υπερκειμένου. Σχεδόν ολόκληρη η δομή του Διαδικτύου λειτουργεί επί του παρόντος στη βάση του. Ενα άλλο παράδειγμα - Γλώσσες Javaκαι JavaScript - συνδυάζουν τις λειτουργίες της μεταγλώττισης και της ερμηνείας. Το κείμενο του προγράμματος πηγής μεταγλωττίζεται σε κάποιο ενδιάμεσο δυαδικό κώδικα που δεν εξαρτάται από την αρχιτεκτονική του συστήματος υπολογιστή στόχου, αυτός ο κώδικας διανέμεται στο δίκτυο και εκτελείται στην πλευρά λήψης - ερμηνεύεται.

Μεταφραστές γλώσσας συναρμολόγησης ("assemblers")

Συμβολική γλώσσα -είναι γλώσσα χαμηλού επιπέδου. Η δομή και η διασύνδεση των αλυσίδων αυτής της γλώσσας είναι κοντά στις οδηγίες μηχανής του συστήματος υπολογιστή στόχου, όπου θα πρέπει να εκτελεστεί το πρόγραμμα που προκύπτει. Η χρήση της γλώσσας assembly επιτρέπει στον προγραμματιστή να διαχειρίζεται τους πόρους (επεξεργαστής, μνήμη RAM, εξωτερικές συσκευές, κ.λπ.) του συστήματος υπολογιστή-στόχου σε επίπεδο οδηγιών μηχανής. Κάθε εντολή του προγράμματος πηγής στη γλώσσα συναρμολόγησης μετατρέπεται σε μία εντολή μηχανής ως αποτέλεσμα της μεταγλώττισης.

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

Υλοποίηση μεταγλωττιστών από γλώσσα assembly

Η γλώσσα συναρμολόγησης, κατά κανόνα, περιέχει μνημονικούς κώδικες για οδηγίες μηχανής. Τις περισσότερες φορές, χρησιμοποιούνται μνημονικά εντολών στην αγγλική γλώσσα, αλλά υπάρχουν και άλλες παραλλαγές γλωσσών συναρμολόγησης (συμπεριλαμβανομένων των εκδόσεων ρωσικής γλώσσας). Αυτός είναι ο λόγος για τον οποίο η γλώσσα συναρμολόγησης ονομαζόταν «γλώσσα mnemocode» (τώρα αυτό το όνομα ουσιαστικά δεν χρησιμοποιείται πλέον). Όλες οι πιθανές εντολές σε κάθε γλώσσα συναρμολόγησης μπορούν να χωριστούν σε δύο ομάδες: η πρώτη ομάδα περιλαμβάνει συνηθισμένες γλωσσικές οδηγίες, οι οποίες μετατρέπονται σε οδηγίες μηχανής κατά τη μετάφραση. η δεύτερη ομάδα αποτελείται από ειδικές γλωσσικές εντολές που δεν μετατρέπονται σε εντολές μηχανής, αλλά χρησιμοποιούνται από τον μεταγλωττιστή για την εκτέλεση εργασιών μεταγλώττισης (όπως, για παράδειγμα, η εργασία εκχώρησης μνήμης). Η σύνταξη της γλώσσας είναι εξαιρετικά απλή. Οι εντολές του προγράμματος πηγής είναι συνήθως γραμμένες με τέτοιο τρόπο ώστε να υπάρχει μία εντολή ανά γραμμή του προγράμματος. Κάθε εντολή γλώσσας συναρμολόγησης, κατά κανόνα, μπορεί να χωριστεί σε τρία στοιχεία, ακολουθώντας διαδοχικά το ένα μετά το άλλο: ετικέτες, έναν κωδικό λειτουργίας και ένα πεδίο τελεστών. Ο μεταγλωττιστής από τη γλώσσα assembly συνήθως παρέχει επίσης τη δυνατότητα να υπάρχουν σχόλια στο πρόγραμμα εισόδου που διαχωρίζονται από τις εντολές με έναν δεδομένο οριοθέτη.

Το πεδίο ετικέτας περιέχει ένα αναγνωριστικό που αντιπροσωπεύει την ετικέτα ή είναι κενό. Κάθε αναγνωριστικό ετικέτας μπορεί να εμφανιστεί μόνο μία φορά σε ένα πρόγραμμα γλώσσας συναρμολόγησης. Η ετικέτα θεωρείται ότι περιγράφεται όπου βρίσκεται στογνώρισε μέτρια στο πρόγραμμα (απαιτείται προκαταρκτική περιγραφή των ετικετών). Μια ετικέτα μπορεί να χρησιμοποιηθεί για τη μεταφορά ελέγχου στην εντολή που στέλνει. Δεν είναι ασυνήθιστο για μια ετικέτα να διαχωρίζεται από την υπόλοιπη εντολή με έναν διαχωριστικό χαρακτήρα (συνήθως άνω και κάτω τελεία ":").

Ο κώδικας λειτουργίας είναι πάντα μια αυστηρά καθορισμένη μνημονική μιας από τις πιθανές εντολές του επεξεργαστή ή επίσης μια αυστηρά καθορισμένη εντολή (του μεταγλωττιστή μου. Ο κωδικός λειτουργίας είναι γραμμένος με αλφαβητικούς χαρακτήρες της μητρικής γλώσσας. Τις περισσότερες φορές, το μήκος του είναι 3-4, λιγότερο συχνά - 5 ή 6 χαρακτήρες.

Το πεδίο τελεστών είναι είτε κενό είτε είναι μια λίστα με έναν, δύο, λιγότερο συχνά τρεις τελεστές. Ο αριθμός των τελεστών είναι αυστηρά καθορισμένος και εξαρτάται από τον κώδικα λειτουργίας - κάθε λειτουργία γλώσσας συγκρότησης παρέχει έναν σταθερό αριθμό από τους τελεστές της. Αντίστοιχα, καθεμία από αυτές τις επιλογές αντιστοιχεί σε οδηγίες χωρίς διεύθυνση, μονοδιεύθυνση, δύο διευθύνσεις ή τρεις διευθύνσεις (μεγαλύτερος αριθμός τελεστών ουσιαστικά δεν χρησιμοποιείται· στους σύγχρονους υπολογιστές, ακόμη και οι οδηγίες τριών διευθύνσεων είναι σπάνιες). Ως όπερες? Το dov μπορεί να είναι αναγνωριστικά ή σταθερές.

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

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

Για παράδειγμα, η ακόλουθη σειρά εντολών

Αυτό είναι ένα παράδειγμα μιας ακολουθίας εντολών γλώσσας συναρμολόγησης n; επεξεργαστές της οικογένειας Intel 80x86. Εδώ υπάρχει μια εντολή για την περιγραφή ενός συνόλου (δεδομένα (db), μια ετικέτα (loops), τους κωδικούς opcodes (mov, dec και jnz).Οι τελεστές είναι το αναγνωριστικό συνόλου δεδομένων (data), οι ονομασίες καταχωρητών διεργασίας

(bx και cx), ετικέτα (βρόχοι) και σταθερά (4). Ο σύνθετος τελεστής δεδομένων αντιστοιχίζει την έμμεση διευθυνσιοδότηση των δεδομένων στον καταχωρητή βάσης bx στη μετατόπιση 4.

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

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

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

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

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

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

Ορισμοί μακροεντολών και εντολές μακροεντολών

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

Για να διευκολυνθεί το έργο του προγραμματιστή, δημιουργήθηκαν οι λεγόμενες μακροεντολές.

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

Η διαδικασία εκτέλεσης μακροεντολών συνίσταται στη διαδοχική αναθεώρηση του κειμένου του προγράμματος πηγής, στην ανίχνευση ορισμένων αναγνωριστικών σε αυτό και στην αντικατάστασή τους με τις αντίστοιχες σειρές χαρακτήρων. Επιπλέον, είναι η κειμενική αντικατάσταση μιας αλυσίδας χαρακτήρων (αναγνωριστικό) με μια άλλη αλυσίδα χαρακτήρων (string). Μια τέτοια αντικατάσταση ονομάζεται μακροεντολή.

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

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

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

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

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

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

Για παράδειγμα, το ακόλουθο κείμενο ορίζει τη μακροεντολή push_0 στη γλώσσα συναρμολόγησης ενός επεξεργαστή τύπου Intel 8086:

Γουρούνι αχ, αχ ■ σπρώξτε τσεκούρι τέλοςμ

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

Θα αντικατασταθεί ως αποτέλεσμα αντικατάστασης μακροεντολών με μια ακολουθία εντολών:

Γουρούνι αχ, αχ ■ σπρώξτε τσεκούρι

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

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

σπρώξτε τσεκούρι
τελ

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

Το Add_abx4,8 θα αντικατασταθεί από μια ακολουθία εντολών ως αποτέλεσμα της αντικατάστασης της μακροεντολής:

Προσθέστε τσεκούρι,4 προσθέστε bx.4 προσθέστε ex,8 ώθηση τσεκούρι

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

Loop_ax macro xl,x2,yl

Hog bx.bx loopax: προσθήκη bx.yl

Εδώ η ετικέτα 1 oopax είναι τοπική και ορίζεται μόνο σε αυτήν τη μακροεντολή. Σε αυτήν την περίπτωση, μια απλή αντικατάσταση κειμένου της εντολής μακροεντολής στο κείμενο του προγράμματος δεν μπορεί πλέον να εκτελεστεί, καθώς εάν αυτή η εντολή μακροεντολής εκτελεστεί δύο φορές, αυτό θα οδηγήσει στην εμφάνιση δύο πανομοιότυπων ετικετών στο κείμενο του προγράμματος. Σε αυτήν την περίπτωση, η μακρογεννήτρια πρέπει να χρησιμοποιεί πιο σύνθετες μεθόδους αντικατάστασης κειμένου, παρόμοιες με αυτές που χρησιμοποιούνται από τους μεταγλωττιστές κατά τον εντοπισμό λεξικών στοιχείων του προγράμματος εισόδου, προκειμένου να δώσει σε όλες τις πιθανές τοπικές μεταβλητές και στις ετικέτες μακροεντολών μοναδικά ονόματα σε ολόκληρο το πρόγραμμα. Οι ορισμοί μακροεντολών και οι εντολές μακροεντολών έχουν βρει χρήση όχι μόνο σε γλώσσες συναρμολόγησης, αλλά και σε πολλές γλώσσες υψηλού επιπέδου. Εκεί υποβάλλονται σε επεξεργασία από μια ειδική ενότητα που ονομάζεται προεπεξεργαστής γλώσσας (για παράδειγμα, ο προεπεξεργαστής της γλώσσας C είναι ευρέως γνωστός). Η αρχή της επεξεργασίας παραμένει η ίδια όπως και για τα προγράμματα γλώσσας συναρμολόγησης - ο προεπεξεργαστής εκτελεί αντικαταστάσεις κειμένου απευθείας στις γραμμές του ίδιου του προγράμματος πηγής. Σε γλώσσες υψηλού επιπέδου, οι ορισμοί μακροεντολών πρέπει να διαχωρίζονται από το κείμενο του ίδιου του προγράμματος πηγής, έτσι ώστε ο προεπεξεργαστής να μην μπορεί να τους συγχέει με τη σύνταξη της γλώσσας εισόδου. Για να γίνει αυτό, είτε χρησιμοποιούνται ειδικοί χαρακτήρες και εντολές (εντολές προεπεξεργαστή), που δεν μπορούν ποτέ να εμφανιστούν στο κείμενο του προγράμματος προέλευσης, είτε βρίσκονται ορισμοί μακροεντολών

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

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

Εξετάστε ένα παράδειγμα σε γλώσσα C. Εάν περιγράφεται μια συνάρτηση

Int fKint a) (επιστρέφει a + a: ) και μια παρόμοια μακροεντολή

#define f2(a) ((a) + (a)) τότε το αποτέλεσμα της κλήσης τους δεν θα είναι πάντα το ίδιο.

Πράγματι, οι κλήσεις j=fl(i) και j=f2(i) (όπου i και j είναι μερικές ακέραιες μεταβλητές) θα οδηγήσουν στο ίδιο αποτέλεσμα. Αλλά οι κλήσεις j=fl(++i) και j=f2(++i) θα δώσουν διαφορετικές έννοιεςμεταβλητή j. Το γεγονός είναι ότι εφόσον το f2 είναι ένας μακροορισμός, στη δεύτερη περίπτωση θα πραγματοποιηθεί μια αντικατάσταση κειμένου, η οποία θα οδηγήσει σε μια ακολουθία τελεστών j=((++i) + (++i)). Μπορεί να φανεί ότι σε αυτή τη σειρά η λειτουργία ++i θα εκτελεστεί δύο φορές, σε αντίθεση με την κλήση της συνάρτησης fl(++i), όπου εκτελείται μόνο μία φορά.

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

Υπάρχουν δύο είδη μεταφραστών: διερμηνείς και μεταγλωττιστές.

Διερμηνέαςονομάζεται μεταφραστής που εκτελεί τη μετάφραση χειριστή προς τελεστή (εντολή προς εντολή) και την επακόλουθη εκτέλεση του μεταφρασμένου τελεστή του προγράμματος πηγής. Δύο μειονεκτήματα της μεθόδου ερμηνείας:

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

2. Η διαδικασία μετάφρασης της ίδιας πρότασης επαναλαμβάνεται τόσες φορές όσες φορές πρέπει να εκτελεστεί αυτή η εντολή στο πρόγραμμα.

Μεταγλωττιστήςείναι ένα πρόγραμμα που μετατρέπει (μεταφράζει) το πρόγραμμα πηγής σε πρόγραμμα (module) στη γλώσσα μηχανής. Μετά από αυτό, το πρόγραμμα εγγράφεται στη μνήμη του υπολογιστή και μόνο τότε εκτελείται.

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

Οποιοσδήποτε μεταφραστής επιλύει τις ακόλουθες κύριες εργασίες:

1. Αναλύει το πρόγραμμα εκπομπής και προσδιορίζει εάν περιέχει συντακτικά σφάλματα.

2. Δημιουργεί ένα πρόγραμμα εξόδου στη γλώσσα εντολών του υπολογιστή.

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

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

Διερμηνέας(Αγγλικά) διερμηνέας- διερμηνέας, διερμηνέας) μεταφράζει και εκτελεί το πρόγραμμα γραμμή προς γραμμή.

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

Κάθε συγκεκριμένη γλώσσα επικεντρώνεται είτε στη συλλογή είτε στην ερμηνεία, ανάλογα με τον σκοπό για τον οποίο δημιουργήθηκε. Για παράδειγμα, Πασκάλσυνήθως χρησιμοποιείται για την επίλυση μάλλον πολύπλοκων προβλημάτων στα οποία η ταχύτητα των προγραμμάτων είναι σημαντική. Επομένως, αυτή η γλώσσα συνήθως υλοποιείται χρησιμοποιώντας μεταγλωττιστής. Στην άλλη πλευρά, ΒΑΣΙΚΟΣδημιουργήθηκε ως γλώσσα για αρχάριους προγραμματιστές, για τους οποίους η εκτέλεση προγράμματος γραμμή προς γραμμή έχει αναμφισβήτητα πλεονεκτήματα. Μερικές φορές για μια γλώσσα υπάρχει και μεταγλωττιστής, και διερμηνέας. Σε αυτήν την περίπτωση, μπορείτε να χρησιμοποιήσετε έναν διερμηνέα για να αναπτύξετε και να δοκιμάσετε το πρόγραμμα και, στη συνέχεια, να μεταγλωττίσετε το πρόγραμμα εντοπισμού σφαλμάτων για να επιταχύνετε την εκτέλεσή του.

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

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

Επί του παρόντος, οι μεταγλωττιστές χωρίζονται σε τρεις κύριες ομάδες: συναρμολογητές, μεταγλωττιστές και διερμηνείς.

Το Assembler είναι ένα βοηθητικό πρόγραμμα συστήματος που μετατρέπει συμβολικές κατασκευές σε οδηγίες γλώσσας μηχανής. Ένα ιδιαίτερο χαρακτηριστικό των assemblers είναι ότι μεταφράζουν κυριολεκτικά μια συμβολική εντολή σε μια εντολή μηχανής. Έτσι, η γλώσσα συναρμολόγησης (ονομάζεται επίσης autocode) έχει σχεδιαστεί για να διευκολύνει την αντίληψη του συνόλου εντολών του υπολογιστή και να επιταχύνει τον προγραμματισμό σε αυτό το σύνολο εντολών. Είναι πολύ πιο εύκολο για έναν προγραμματιστή να θυμάται τη μνημονική ονομασία των εντολών μηχανής παρά τον δυαδικό κώδικα τους.

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

Ο μεταγλωττιστής είναι ένα βοηθητικό πρόγραμμα που μεταφράζει σε γλώσσα μηχανής ένα πρόγραμμα γραμμένο σε γλώσσα προγραμματισμού πηγής. Ακριβώς όπως ένας assembler, ένας μεταγλωττιστής μετατρέπει ένα πρόγραμμα από μια γλώσσα σε άλλη (τις περισσότερες φορές, στη γλώσσα ενός συγκεκριμένου υπολογιστή). Ωστόσο, οι εντολές της γλώσσας πηγής διαφέρουν σημαντικά ως προς την οργάνωση και την ισχύ από τις εντολές της γλώσσας μηχανής. Υπάρχουν γλώσσες στις οποίες μία οδηγία της γλώσσας πηγής μεταφράζεται σε 7-10 οδηγίες μηχανής. Ωστόσο, υπάρχουν επίσης γλώσσες στις οποίες κάθε εντολή μπορεί να αντιστοιχεί σε 100 ή περισσότερες οδηγίες μηχανής (για παράδειγμα, Prolog). Επιπλέον, στις γλώσσες πηγής χρησιμοποιείται συχνά αυστηρή πληκτρολόγηση δεδομένων, η οποία πραγματοποιείται μέσω της προκαταρκτικής περιγραφής τους. Ο προγραμματισμός μπορεί να μην βασίζεται στην κωδικοποίηση ενός αλγορίθμου, αλλά στην προσεκτική σκέψη σχετικά με τις δομές δεδομένων ή τις κλάσεις. Η διαδικασία μετάφρασης από τέτοιες γλώσσες συνήθως ονομάζεται μεταγλώττιση και οι γλώσσες πηγής αναφέρονται συνήθως ως γλώσσες προγραμματισμού υψηλού επιπέδου (ή γλώσσες υψηλού επιπέδου). Η αφαίρεση της γλώσσας προγραμματισμού από το σύστημα εντολών του υπολογιστή οδήγησε στην ανεξάρτητη δημιουργία μιας μεγάλης ποικιλίας γλωσσών που επικεντρώθηκαν στην επίλυση συγκεκριμένων προβλημάτων. Οι γλώσσες εμφανίστηκαν για επιστημονικούς υπολογισμούς, οικονομικούς υπολογισμούς, πρόσβαση σε βάσεις δεδομένων και άλλα.

Ο διερμηνέας είναι ένα πρόγραμμα ή μια συσκευή που εκτελεί τη μετάφραση και την εκτέλεση του αρχικού προγράμματος από χειριστή προς χειριστή. Σε αντίθεση με έναν μεταγλωττιστή, ένας διερμηνέας δεν παράγει ένα πρόγραμμα γλώσσας μηχανής ως έξοδο. Έχοντας αναγνωρίσει την εντολή της γλώσσας πηγής, την εκτελεί αμέσως. Τόσο οι μεταγλωττιστές όσο και οι διερμηνείς χρησιμοποιούν τις ίδιες μεθόδους ανάλυσης του πηγαίου κώδικα ενός προγράμματος. Αλλά ο διερμηνέας σας επιτρέπει να ξεκινήσετε την επεξεργασία δεδομένων αφού γράψετε έστω και μία εντολή. Αυτό καθιστά τη διαδικασία ανάπτυξης και εντοπισμού σφαλμάτων προγραμμάτων πιο ευέλικτη. Επιπλέον, η απουσία κωδικού μηχανής εξόδου καθιστά δυνατή τη μη «στρωμάτωση» εξωτερικών συσκευών με πρόσθετα αρχεία και ο ίδιος ο διερμηνέας μπορεί να προσαρμοστεί πολύ εύκολα σε οποιαδήποτε αρχιτεκτονική μηχανής, έχοντας αναπτύξει μόνο μία φορά σε μια ευρέως χρησιμοποιούμενη γλώσσα προγραμματισμού. Ως εκ τούτου, οι ερμηνευτικές γλώσσες όπως η Java Script, η VB Script έχουν γίνει ευρέως διαδεδομένες. Το μειονέκτημα των διερμηνέων είναι η χαμηλή ταχύτητα εκτέλεσης του προγράμματος. Συνήθως, τα ερμηνευμένα προγράμματα εκτελούνται 50 έως 100 φορές πιο αργά από τα προγράμματα που είναι γραμμένα σε κώδικα μηχανής.

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

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

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

Transcoder - ένα πρόγραμμα ή μια συσκευή λογισμικού που μεταφράζει προγράμματα γραμμένα στη γλώσσα μηχανής ενός υπολογιστή σε προγράμματα στη γλώσσα μηχανής ενός άλλου υπολογιστή. Εάν ο εξομοιωτής είναι ένα λιγότερο έξυπνο ανάλογο του διερμηνέα, τότε ο μετακωδικοποιητής ενεργεί με την ίδια ικανότητα σε σχέση με τον μεταγλωττιστή. Ομοίως, ο πηγαίος (και συνήθως δυαδικός) κώδικας μηχανής ή μια ενδιάμεση αναπαράσταση μετατρέπεται σε άλλον παρόμοιο κώδικα σε μία εντολή και χωρίς καμία γενική ανάλυση της δομής του προγράμματος πηγής. Οι μετακωδικοποιητές είναι χρήσιμοι κατά τη μεταφορά προγραμμάτων από μια αρχιτεκτονική υπολογιστή σε άλλη. Μπορούν επίσης να χρησιμοποιηθούν για την ανασύνθεση του κειμένου ενός γλωσσικού προγράμματος υψηλού επιπέδου από τον διαθέσιμο δυαδικό κώδικα.

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

Οι μακροεπεξεργαστές χρησιμοποιούνται επίσης με γλώσσες υψηλού επιπέδου. Αυξάνουν τη λειτουργικότητα γλωσσών όπως PL/1, C, C++. Οι μακροεπεξεργαστές χρησιμοποιούνται ευρέως σε C και C++, καθιστώντας ευκολότερη τη σύνταξη προγραμμάτων. Οι μακροεπεξεργαστές αυξάνουν την αποτελεσματικότητα του προγραμματισμού χωρίς να αλλάζουν τη σύνταξη και τη σημασιολογία της γλώσσας.

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

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

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

Οποιοσδήποτε μεταφραστής εκτελεί τις ακόλουθες κύριες εργασίες:

Αναλύει το πρόγραμμα που μεταφράζεται, συγκεκριμένα, καθορίζει εάν περιέχει συντακτικά σφάλματα.

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

Εκχωρεί μνήμη για το πρόγραμμα αντικειμένων.