ΥπολογιστέςΠρογραμματισμός

Ο μεταδότης - είναι ... Τύποι μεταγλωττιστές. Μετατροπή και τα προγράμματα μετάδοσης

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

βασικές έννοιες

Το πρόγραμμα είναι μια γλωσσική αναπαράσταση των υπολογισμών: i → P → P (i). Ένα διερμηνέας είναι ένα πρόγραμμα το οποίο παρέχεται στο πρόγραμμα εισόδου Ρ και κάποια είσοδο x. Εκτελεί σε Ρ x: I (P, x) = P (x). Το γεγονός ότι υπάρχει μόνο ένας μεταφραστής είναι σε θέση να εκτελέσουν όλες τις πιθανές προγράμματα (τα οποία μπορούν να αντιπροσωπεύονται στο επίσημο σύστημα) είναι μια πολύ βαθιά και σημαντική Turing ανακάλυψη.

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

Ορισμένα είδη μεταφραστές έχουν πολύ περίεργα ονόματα:

  • Ο assembler μεταφράζει προγράμματα συναρμολόγηση γλώσσα σε γλώσσα μηχανής.
  • Ο μεταγλωττιστής μεταφράζει μια γλώσσα υψηλού επιπέδου σε χαμηλότερη γλώσσα.

Ο μεταδότης - είναι ένα πρόγραμμα που παίρνει ως δεδομένα εισόδου στο πρόγραμμα σε κάποια γλώσσα S και παράγει το πρόγραμμα T με τέτοιο τρόπο ώστε και οι δύο έχουν τα ίδια σημασιολογία: P → X → Q. Δηλαδή, ∀x. P (x) = Q (x).

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

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

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

Πολλές γλώσσες επιτρέψει να εκτελέσει κώδικα κατά τη μεταγλώττιση και την κατάρτιση του νέου κώδικα κατά το χρόνο εκτέλεσης.

στάδιο της μετάφρασης

Broadcast περιλαμβάνει τα στάδια της ανάλυσης και της σύνθεσης:

Ο αναλυτής πηγαίος κώδικας → → → εννοιολογική γεννήτρια αναπαράσταση (synthesizer) → κώδικα Target.

Αυτό οφείλεται σε αυτούς τους λόγους:

  • Οποιαδήποτε άλλη μέθοδος δεν είναι κατάλληλη. Λόγος μετάφραση απλά δεν λειτουργεί.
  • Καλή μηχανική λύση: αν θέλετε να γράψετε μεταφραστές για τις γλώσσες Μ και Ν πηγή στοχευμένες χρειάζεται να γράψετε μόνο M + N απλά προγράμματα (polukompilyatorov) αντί για M × N συγκρότημα (σύνολο των μεταφραστών).

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

Ρεάλ συντάκτες περνούν από πολλά στάδια. Όταν δημιουργείτε τη δική σας compiler δεν χρειάζεται να επαναλάβετε όλη τη σκληρή δουλειά που οι άνθρωποι έχουν κάνει για να δημιουργήσουν αναπαραστάσεις και γεννήτριες. Μπορείτε να μεταφράσετε γλώσσα σας απευθείας σε JavaScript ή C και να επωφεληθούν από τις υπάρχουσες Javascript για κινητήρα και το C compiler να κάνει τα υπόλοιπα. Μπορείτε επίσης να χρησιμοποιήσετε την υπάρχουσα ενδιάμεση αντιπροσώπευση και εικονικές μηχανές.

ρεκόρ μεταφραστής

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

Υπάρχουν τρεις τύποι των compilers:

  • Ο μεταδότης - είναι samokompilyator αν αντιστοιχεί στην βασική γλώσσα πηγή.
  • Compiler που στοχεύουν γλώσσα είναι η βασική γραμμή, που ονομάζεται samorezidentnym.
  • Ο μεταδότης - ένα cross-compiler, αν στοχευμένες και τις βασικές διάφορες γλώσσες.

Γιατί είναι αυτό σημαντικό;

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

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

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

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

ολοκληρωμένη τεχνολογία

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

  • επίσημη θεωρία της γλώσσας: γραμματική, συντακτική ανάλυση, computability?
  • αρχιτεκτονικής υπολογιστών:. σύνολα οδηγιών, RISC ή CISC, διοχέτευσης πυρήνα επεξεργασίας κύκλους ρολογιού, κλπ?
  • έννοιες των γλωσσών προγραμματισμού, για παράδειγμα, εκτελώντας μια αλληλουχία ελέγχου, η εκτέλεση υπό όρους, επανάληψη, αναδρομικότητα, λειτουργική αποσύνθεση, αρθρωτή, συγχρονισμό, μετα-προγραμματισμό, την έκταση, τη συνεχή υπο-τύπους, τα πρότυπα, τον τύπο εξόδου, πρωτότυπα, σχολιασμούς, ροή, Μονάδες, γραμματοκιβώτια, να συνεχίσει , μπαλαντέρ, κανονική έκφραση, συναλλαγών μνήμης, κληρονομικότητα, πολυμορφισμός, ρυθμίσεις της λειτουργίας, και ούτω καθεξής, κλπ..?
  • αφηρημένη γλώσσα και εικονικές μηχανές?
  • αλγόριθμοι και δομές δεδομένων: κανονικές εκφράσεις, την ανάλυση αλγορίθμων, οι αλγόριθμοι γραφικών, δυναμικός προγραμματισμός, εκπαίδευση?
  • γλώσσες προγραμματισμού: σύνταξη, σημασιολογία (στατική και δυναμική), παραδείγματα στήριξης (διαρθρωτικά, OOP, λειτουργικό, λογικό, στοίβα, παραλληλισμό, μετα-προγραμματισμός)?
  • λογισμικό δημιουργίας (compilers, συνήθως μεγάλα και σύνθετα): εντοπισμός, προσωρινή αποθήκευση, componentize, API-διεπαφές, επαναχρησιμοποίηση, συγχρονισμό.

σχεδιασμός compiler

Μερικά από τα προβλήματα που ανέκυψαν κατά την εξέλιξη του πραγματικού μεταφραστή:

  • Προβλήματα με τη γλώσσα-πηγή. Είναι εύκολο να το υπολογίσουν; Είναι ένα προεπεξεργαστή εκεί; Πώς είναι οι τύποι; Είναι μια βιβλιοθήκη εκεί;
  • Ομαδοποίηση περάσματα compiler: μία ή περισσότερες τρόπο;
  • Ο βαθμός της βελτιστοποίησης επιθυμείται. Γρήγορη και βρώμικα προγράμματα μετάδοσης με ελάχιστη ή καμία βελτιστοποίηση μπορεί να είναι φυσιολογική. Πάνω-βελτιστοποίηση compiler θα επιβραδυνθεί, αλλά καλύτερα κώδικα κατά το χρόνο εκτέλεσης μπορεί να αξίζει τον κόπο.
  • Ο απαιτούμενος βαθμός ανίχνευσης σφαλμάτων. Μπορεί ένας μεταφραστής μόλις σταματήσει στο πρώτο λάθος; Πότε θα πρέπει να σταματήσει; Είτε να εμπιστεύονται τη διόρθωση σφάλματος μεταγλωττιστή;
  • Η διαθεσιμότητα των εργαλείων. Αν η γλώσσα του πρωτοτύπου δεν είναι πολύ μικρό, οι σαρωτή και γεννήτρια αναλυτές που απαιτούνται. Υπάρχουν, επίσης, γεννήτριες, γεννήτριες κώδικα, αλλά δεν είναι τόσο συχνές.
  • Τύπος κωδικού στόχου που πρόκειται να παραχθεί. Να επιλεγεί από καθαρή συμπληρωμένο ή εικονικές κώδικα μηχανής. Ή απλά γράψτε ένα τμήμα εισόδου που δημιουργεί ένα δημοφιλές ενδιάμεση αναπαράσταση, όπως LLVM, RTL, ή JVM. Ή να κάνει μια μετάφραση του αρχικού του πηγαίου κώδικα σε C ή JavaScript.
  • Η μορφή του κωδικού στόχου. Μπορείτε να επιλέξετε μια συμβολική γλώσσα, ένα φορητό κώδικα μηχανής, εικόνα μηχανή κωδικού της μνήμης.
  • Επαναστόχευση. Όταν το σύνολο των γεννητριών είναι καλό να έχουμε ένα κοινό τμήμα εισόδου. Για το λόγο αυτό, το καλύτερο είναι να έχουμε μια γεννήτρια για την είσοδο πολλών τμημάτων.

Αρχιτεκτονική compiler: εξαρτήματα

Αυτά είναι τα κύρια λειτουργικά συστατικά ενός compiler που δημιουργεί εγγενή κώδικα (αν το πρόγραμμα εξόδου είναι ένα πρόγραμμα σε C ή μια εικονική μηχανή, δεν χρειάζεται τόσα πολλά στάδια):

  • Το πρόγραμμα εισόδου (σήματα ροής) τροφοδοτείται στο σαρωτή (λεξιλογικό αναλυτή), η οποία το μετατρέπει σε ένα ρεύμα των μαρκών.
  • Parser (parser) κατασκευάζοντας ένα αφηρημένο συντακτικό δέντρο.
  • Σημασιολογικός Αναλυτής αποσυνθέτει τη σημασιολογική πληροφορία και ελέγχει τους κόμβους δέντρο για σφάλματα. Ως αποτέλεσμα, χτισμένο σημασιολογικό γράφο - αφηρημένο συντακτικό δέντρο με πρόσθετες ιδιότητες και τις καθιερωμένες συνδέσεις.
  • Ενδιάμεσο γεννήτρια κώδικα χτίζει ένα γράφημα ροής (Οι πλειάδες ομαδοποιούνται σε κύριο μπλοκ).
  • Machine-ανεξάρτητη κώδικα βελτιστοποίησης διεξάγει τόσο τη βελτιστοποίηση των τοπικών (εντός της μονάδας βάσης) και παγκόσμια (σε όλα τα τμήματα) ουσιαστικά παραμένει εντός ρουτίνες. Μειώνει περιττό κώδικα και απλοποιεί τους υπολογισμούς. Το αποτέλεσμα είναι ένα τροποποιημένο διάγραμμα ροής.
  • Γεννήτρια δεσμεύει κώδικας στόχου βασικά μπλοκ σε μια ευθύγραμμη κωδικό ελέγχου μετάδοσης, δημιουργώντας ένα αρχείο αντικείμενο συναρμολογητή εικονική μητρώα (ενδεχομένως αναποτελεσματική).
  • Machine-εξαρτώμενη βελτιστοποίησης, συνδετήρας διαθέτει μνήμη μεταξύ των μητρώων και κάνει τον προγραμματισμό ομάδων. Εκτελεί το πρόγραμμα μετατροπής σε συμβολική γλώσσα σε αυτό το συγκρότημα με μια καλή χρήση των αγωγών.

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

Λεξική ανάλυση (σαρώσεως)

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

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

Λάθη που μπορεί να προκύψουν κατά τη διάρκεια της σάρωσης, που ονομάζεται λεξιλογικά και περιλαμβάνουν:

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

Parsing (ανάλυσης)

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

Τα σφάλματα που βρέθηκαν σε αυτό το στάδιο ονομάζεται σύνταξη. Για παράδειγμα:

  • k = 5 * (7 - y?
  • j = / 5?
  • 56 = x * 4.

σημασιολογική ανάλυση

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

Προφανώς, το σύνολο του παραδεκτού των κανόνων σε διαφορετικές γλώσσες διαφορετικές. Αν συγκεντρώνει τα Java-όπως γλώσσες, μεταγλωττιστές μπορούν να βρουν:

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

γενεά

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

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

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 el.delachieve.com. Theme powered by WordPress.