Μεταγλωττιστής

Μεταγλωττιστής ή μεταφραστής (compiler) ονομάζεται ένα πρόγραμμα υπολογιστή που διαβάζει κώδικα γραμμένο σε μια γλώσσα προγραμματισμού (την πηγαία γλώσσα) και τον μεταφράζει σε ισοδύναμο κώδικα σε μια άλλη γλώσσα προγραμματισμού (τη γλώσσα στόχο). Το κείμενο της εισόδου ονομάζεται πηγαίος κώδικας (source code), ενώ η έξοδος του προγράμματος, η οποία συχνά έχει δυαδική μορφή, αντικειμενικός κώδικας (object code).
Ο όρος «μεταγλωττιστής» χρησιμοποιείται κυρίως για προγράμματα που μεταφράζουν μια γλώσσα προγραμματισμού υψηλού επιπέδου σε μια γλώσσα χαμηλότερου επιπέδου (όπως η συμβολική γλώσσα ή η γλώσσα μηχανής). Αν το μεταγλωττισμένο πρόγραμμα πρόκειται να εκτελεστεί σε έναν υπολογιστή που έχει διαφορετικό επεξεργαστή ή λειτουργικό σύστημα σε σχέση με την πλατφόρμα που εκτελείται ο μεταγλωττιστής, ο τελευταίος τότε ονομάζεται cross-compiler. Ένα πρόγραμμα που μεταφράζει από μια γλώσσα χαμηλού επιπέδου σε μια υψηλότερου επιπέδου ονομάζεται decompiler. Ένα πρόγραμμα που μεταφράζει από μια γλώσσα υψηλού επιπέδου σε μια άλλη, επίσης υψηλού επιπέδου, ονομάζεται συνήθως γλωσσικός μεταφραστής, μεταφραστής από πηγαίο κώδικα σε πηγαίο κώδικα (source to source translator) ή μετατροπέας γλωσσών. Ένα πρόγραμμα που μεταφράζει τη μορφή εκφράσεων σε άλλη μορφή, διατηρώντας την ίδια γλώσσα, ονομάζεται language rewriter.
Ένας μεταγλωττιστής μπορεί να περιλαμβάνει οποιαδήποτε από τις εξής λειτουργίες: λεκτική ανάλυση, προεπεξεργασία, συντακτική ανάλυση, σημασιολογική ανάλυση (μετάφραση καθοδηγούμενη από τη σύνταξη), παραγωγή κώδικα και βελτιστοποίηση κώδικα.
Τα σφάλματα προγραμμάτων που προκύπτουν από λανθασμένη μεταγλώττιση είναι πολύ δύσκολο να εντοπιστούν και να αντιμετωπιστούν. Για αυτόν τον λόγο οι κατασκευαστές μεταγλωττιστών κάνουν σημαντικές προσπάθειες για να βεβαιώσουν την ορθότητα λειτουργίας του λογισμικού τους.
Ο όρος μεταγλωττιστής μεταγλωττιστών (compiler-compiler) χρησιμοποιείται συχνά για τις γεννήτριες συντακτικών αναλυτών, που είναι εργαλεία που βοηθούν στην κατασκευή λεκτικών και συντακτικών αναλυτών.

Μεταγλώττιση

Οι μεταγλωττιστές επέτρεψαν τη δημιουργία προγραμμάτων που είναι ανεξάρτητα από τη μηχανή. Πριν από την ανάπτυξη της FORTRAN (FORmula TRANslator), της πρώτης γλώσσας υψηλού επιπέδου, τη δεκαετία του 1950, γινόταν χρήση συμβολικής γλώσσας, που είχε εξαρτήσεις από τον εκάστοτε υπολογιστή. Αν και η συμβολική γλώσσα παράγει προγράμματα που μπορούν να επαναχρησιμοποιηθούν και να τοποθετηθούν σε διαφορετικές θέσεις μνήμης, στην ίδια αρχιτεκτονική, πρέπει να τροποποιηθεί ή να ξαναγραφτεί αν το πρόγραμμα πρέπει να εκτελεστεί σε διαφορετική αρχιτεκτονική υπολογιστή.
Με τις γλώσσες προγραμματισμού υψηλού επιπέδου που ακολούθησαν τη FORTRAN, όπως η COBOL, η C και η BASIC, ο προγραμματιστής μπορούσε να γράφει πηγαίο κώδικα που να είναι ανεξάρτητος από τη μηχανή. Ο μεταγλωττιστής αναλάμβανε να μεταφράσει τον πηγαίο κώδικα υψηλού επιπέδου σε τελικά προγράμματα σε γλώσσα μηχανής για κάθε πλατφόρμα υλικού. Όταν το τελικό πρόγραμμα παραχθεί, ο χρήστης μπορεί να το εκτελέσει.

Έξοδος του μεταγλωττιστή

Οι μεταγλωττιστές μπορούν να χωριστούν σε κατηγορίες ανάλογα με την πλατφόρμα στην οποία πρόκειται να εκτελεστεί ο παραγόμενος κώδικας (target platform).
Ένας μεταγλωττιστής ονομάζεται native ή hosted αν παράγει κώδικα που πρόκειται να εκτελεστεί στον ίδιο τύπο υπολογιστή και λειτουργικού συστήματος με αυτά στα οποία εκτελείται ο ίδιος ο μεταγλωττιστής. Αν ο παραγόμενος κώδικας πρόκειται να εκτελεστεί σε διαφορετική πλατφόρμα, τότε αναφερόμαστε σε cross compiler. Οι cross-compilers χρησιμοποιούνται συχνά στην ανάπτυξη λογισμικού για ενσωματωμένα συστήματα, τα οποία δεν προτίθεντε τα ίδια να υποστηρίξουν κάποιο περιβάλλον ανάπτυξης λογισμικού.
Η έξοδος ενός μεταγλωττιστή που παράγει κώδικα για μια εικονική μηχανή (virtual machine - VM) μπορεί να εκτελεστεί ή να μην εκτελεστεί στην ίδια πλατφόρμα με το μεταγλωττιστή που την παρήγαγε. Για αυτόν τον λόγο, οι μεταγλωττιστές αυτού του τύπου δεν θεωρείται ότι ανήκουν σε μια από τις προηγούμενες κατηγορίες.
Η γλώσσα χαμηλού επιπέδου στην οποία παράγει κώδικα ο μεταγλωττιστής μπορεί η ίδια να είναι μια γλώσσα υψηλού επιπέδου. Η C, η οποία συχνά θεωρείται ένα είδος φορητής συμβολικής γλώσσας, μπορεί επίσης να είναι η γλώσσα στόχος του μεταγλωττιστή. Για παράδειγμα, το Cfront, ο πρωτότυπος μεταγλωττιστής της C++, χρησιμοποιούσε τη C σαν γλώσσα παραγόμενου κώδικα. Ο κώδικας C που παράγεται από μεταγλωττιστές αυτού του τύπου συνήθως δεν προορίζεται για ανάγνωση και συντήρηση από ανθρώπους. Αυτό σημαίνει ότι μπορεί να μην ακολουθεί κανόνες στοίχισης ή άλλου τύπου για ευανάγνωστο κώδικα. Κάποια χαρακτηριστικά της C την κάνουν καλή γλώσσα στόχο, για παράδειγμα μπορεί να παραχθεί κώδικας C με οδηγίες #line ώστε να βοηθήσει στην αποσφαλμάτωση του αρχικού πηγαίου κώδικα.