ΕΝΑ μεταγλωττιστής είναι ένα πρόγραμμα που μεταφράζεται σε αναγνώσιμη από άνθρωπο πηγαίου κώδικα σε κώδικα μηχανής εκτελέσιμο από υπολογιστή. Για να γίνει αυτό με επιτυχία, ο αναγνώσιμος από άνθρωπο κώδικας πρέπει να συμμορφώνεται με τον κώδικα σύνταξη κανόνες οποιασδήποτε γλώσσας προγραμματισμού είναι γραμμένο σε. Ο μεταγλωττιστής είναι μόνο ένα πρόγραμμα και δεν μπορεί να διορθώσει τον κωδικό σας για εσάς. Εάν κάνετε λάθος, πρέπει να διορθώσετε τη σύνταξη ή δεν θα μεταγλωττιστεί.
Τι συμβαίνει κατά την συμπλήρωση κώδικα;
Η πολυπλοκότητα του μεταγλωττιστή εξαρτάται από τη σύνταξη της γλώσσας και την ποσότητα της αφαίρεσης αυτή τη γλώσσα προγραμματισμού παρέχει. Ο μεταγλωττιστής Γ είναι πολύ πιο απλός από έναν μεταγλωττιστή για C ++ ή C #.
Λεξική ανάλυση
Κατά τη σύνταξη, ο μεταγλωττιστής διαβάζει πρώτα ένα ρεύμα χαρακτήρων από ένα αρχείο πηγαίου κώδικα και δημιουργεί μια ροή λεξικών μαρκών. Για παράδειγμα, ο κώδικας C ++:
int C = (Α * Β) + 10.
μπορεί να αναλυθεί ως αυτά τα μάρκες:
- πληκτρολογήστε "int"
- μεταβλητή "C"
- ισούται με
- leftbracket
- μεταβλητή "A"
- φορές
- μεταβλητή "B"
- rightbracket
- συν
- γράμμα "10"
Συντακτική Ανάλυση
Η λεξική έξοδος πηγαίνει στο τμήμα του συντάκτου αναλυτή του μεταγλωττιστή, ο οποίος χρησιμοποιεί τους κανόνες της γραμματικής για να αποφασίσει εάν η είσοδος είναι έγκυρη ή όχι. Εκτός μεταβλητές A και B είχαν δηλωθεί στο παρελθόν και ήταν στο πεδίο εφαρμογής, ο μεταγλωττιστής θα μπορούσε να πει:
- 'Α': μη δηλωμένο αναγνωριστικό.
Εάν είχαν δηλωθεί αλλά δεν είχαν αρχικοποιηθεί. ο μεταγλωττιστής εκδίδει μια προειδοποίηση:
- τοπική μεταβλητή "Α" που χρησιμοποιείται χωρίς να προετοιμαστεί.
Δεν πρέπει ποτέ να αγνοήσετε τις προειδοποιήσεις του μεταγλωττιστή. Μπορούν να σπάσουν τον κώδικά σας με περίεργους και απροσδόκητους τρόπους. Να διορθώνετε πάντα τις προειδοποιήσεις του μεταγλωττιστή
Ένα πέρασμα ή δύο;
Ορισμένες γλώσσες προγραμματισμού γράφονται έτσι ώστε ο μεταγλωττιστής να μπορεί να διαβάσει τον πηγαίο κώδικα μόνο μία φορά και να δημιουργήσει τον κωδικό της μηχανής. Pascal είναι μια τέτοια γλώσσα. Πολλά μεταγλωττιστές απαιτούν τουλάχιστον δύο περάσματα. Μερικές φορές, οφείλεται σε μελλοντικές δηλώσεις του λειτουργίες ή τάξεις.
Στην C ++, μια κλάση μπορεί να δηλωθεί αλλά δεν ορίζεται αργότερα. Ο μεταγλωττιστής δεν μπορεί να υπολογίσει πόση μνήμη χρειάζεται η τάξη μέχρι να συγκεντρώσει το σώμα της τάξης. Πρέπει να ξαναδιαβάσει τον πηγαίο κώδικα πριν από τη δημιουργία του σωστού κώδικα μηχανής.
Δημιουργία κώδικα μηχανής
Υποθέτοντας ότι ο μεταγλωττιστής ολοκληρώνει με επιτυχία τις λεξικές και συντακτικές αναλύσεις, το τελικό στάδιο είναι η δημιουργία κώδικα μηχανής. Πρόκειται για μια περίπλοκη διαδικασία, ειδικά με σύγχρονους επεξεργαστές.
Η ταχύτητα της σύνταξης εκτελέσιμο ο κωδικός πρέπει να είναι όσο το δυνατόν γρηγορότερος και μπορεί να ποικίλει σε μεγάλο βαθμό ανάλογα με την ποιότητα του παραγόμενου κώδικα και την απαιτούμενη βελτιστοποίηση.
Οι περισσότεροι μεταγλωττιστές σάς επιτρέπουν να καθορίσετε το μέγεθος της βελτιστοποίησης - συνήθως γνωστό για τις σύντομες αποσφαλμάτωσεις και την πλήρη βελτιστοποίηση του απελευθερωμένου κώδικα.
Η δημιουργία κώδικα είναι πρόκληση
Ο συγγραφέας του μεταγλωττιστή αντιμετωπίζει προκλήσεις όταν γράφει μια γεννήτρια κώδικα. Πολλοί επεξεργαστές επιταχύνουν την επεξεργασία χρησιμοποιώντας
- Οδηγίες σωληνώσεων
- Εσωτερικός κρυφές μνήμες.
Αν όλες οι οδηγίες μέσα σε έναν κώδικα βρόχος μπορεί να κρατηθεί στο ΕΠΕΞΕΡΓΑΣΤΗΣ cache, τότε αυτός ο βρόχος τρέχει πολύ πιο γρήγορα από ό, τι όταν η CPU πρέπει να πάρει οδηγίες από την κύρια μνήμη RAM. Η προσωρινή μνήμη CPU είναι ένα μπλοκ μνήμης ενσωματωμένο στο τσιπ της CPU, το οποίο είναι προσπελάσιμο πολύ πιο γρήγορα από τα δεδομένα στην κύρια μνήμη RAM.
Cache και ουρές
Οι περισσότερες CPU έχουν μια σειρά προ-παραλαβής όπου η CPU διαβάζει οδηγίες στην κρυφή μνήμη πριν την εκτέλεση τους. Εάν συμβαίνει ένα υποκατάστημα υπό όρους, η CPU πρέπει να φορτώσει εκ νέου την ουρά. Ο κώδικας πρέπει να δημιουργηθεί για να ελαχιστοποιηθεί αυτό.
Πολλές CPU έχουν ξεχωριστά μέρη για:
- Αριθμητική ακεραιότητα (ολόκληροι αριθμοί)
- Αριθμητική μεταβλητό αριθμητικό σημείο (κλασματικοί αριθμοί)
Αυτές οι λειτουργίες μπορούν συχνά να τρέξουν παράλληλα για να αυξήσουν την ταχύτητα.
Οι μεταγλωττιστές συνήθως δημιουργούν κώδικα μηχανής σε αρχεία αντικειμένων που είναι στη συνέχεια συνδέονται μαζί με ένα πρόγραμμα συνδέσμων.