ΠΙΝΑΚΑΣ ΣΥΜΒΟΛΩΝ
Τι είναι; Ο Πίνακας Συμβόλων είναι όπως ένα λεξικό: πρέπει να υποστηρίζει την εισαγωγή, αναζήτηση και εγγραφή ονομάτων με τις ιδιότητές τους να αναπαριστά τις συνδέσεις τους στις δηλώσεις. Ένα σύμβολο μπορεί να υλοποιείται από έναν οποιοδήποτε αριθμό δομών δεδμένων, για αποδοτική προσπέλαση, όπως π.χ. πίνακες hash, δυαδικά δέντρα αναζήτησης κλπ.
Πίνακας συμβόλων & εμβέλεια Σε γλώσσες με δομή block και στατική (λεξική) εμβέλεια απαιτείται η επεξεργασία των δηλώσεων να γίνεται όπως σε μία στοίβα.! με την είσοδο σ ένα block, γίνεται επεξεργασία όλων των δηλώσεων του block και προστίθενται στον πίνακα συμβόλων οι συνδέσεις τους.! με την έξοδο από το block, αφαιρούνται οι συνδέσεις των δηλώσεων και αποκαθιστώνται οι προηγούμενες συνδέσεις που μπορεί να υπήρχαν. Αυτή η διαδικασία λέγεται ανάλυση εμβέλειας.
Πίνακας συμβόλων & εμβέλεια Πίνακας συμβόλων στη γραμμή 5 Πίνακας συμβόλων στη γραμμή 7
Πίνακας συμβόλων & εμβέλεια Πίνακας συμβόλων στη γραμμή 10 Πίνακας συμβόλων στη γραμμή 13
Πίνακας συμβόλων & εμβέλεια Πίνακας συμβόλων στη γραμμή 14 Πίνακας συμβόλων στη γραμμή 17
Πίνακας συμβόλων & εμβέλεια Αυτή η διαδικασία διατηρεί την κατάλληλη πληροφορία εμβέλειας, συμπεριλαμβανομένων των τρυπών στην εμβέλεια των καθολικών μεταβλητών. Αυτή η αναπραστάση υποθέτει ότι ο πίνακας συμβόλων επεξεργάζεται τις δηλώσεις στατικά, δηλ. πριν από την εκτέλεση: η διαχείριση του πίνακα συμβόλων γίνεται κατά τη μεταγλώττιση και όλες οι συνδέσεις είναι στατικές. Αν η διαχείριση του πίνακα συμβόλων γίνεται δυναμικά, δηλ. Κατά την εκτέλεση, τότε η επεξεργασία των δηλώσεων γίνεται όταν τις προσεγγίζει το μονοπάτι εκτέλεσης του προγράμματος. Τότε έχουμε ένα διαφορετικό κανόνα εμβέλειας, που λέγεται δυναμική εμβέλεια σε αντίθεση με την προηγούμενη περίπτωση που λέγεται στατική εμβέλεια.
Πίνακας συμβόλων & δυναμική εμβέλεια Πίνακας συμβόλων στη γραμμή 17
Πίνακας συμβόλων & δυναμική εμβέλεια Πίνακας συμβόλων στη γραμμή 12
Πίνακας συμβόλων & δυναμική εμβέλεια Πίνακας συμβόλων στη γραμμή 6 Έξοδος προγράμματος με στατική εμβέλεια Έξοδος προγράμματος με δυναμική εμβέλεια
Δυναμική εμβέλεια Στη δυναμική εμβέλεια, όταν χρησιμοποιείται ένα μη τοπικό όνομα σε έκφραση ή εντολή, η δήλωση που ισχύει γι αυτό δε μπορεί να βρεθεί με απλή ανάγνωση του προγράμματος (όπως στη στατική εμβέλεια). Το πρόγραμμα πρέπει να εκτελεστεί ή πρέπει να ιχνηλατηθεί η εκτέλεσή του με το χέρι και μπορεί διαφορετικές εκτελέσεις να οδηγούν σε διαφορετικά αποτελέσματα. Στο παράδειγμα, η αναφορά στην y στην εντολή printf της γραμμής 6 δε μπορεί να είναι γνωστή μέχρι τη στιγμή της εκτέλεσης και θα μπορούσε να εξαρτάται από την είσοδο του χρήστη.
Δυναμική εμβέλεια Καθώς οι αναφορές σε μη τοπικές μεταβλητές δε μπορούν να προβλεφθούν πριν από την εκτέλεση, δε γίνεται επίσης να προβλεφθούν και οι τύποι των δεδομένων τους. Στο παράδειγμα, η αναφορά στην y στην εντολή printf της γραμμής 6 υποτίθεται ότι αντιστοιχεί σ ένα χαρακτήρα. Όμως με δυναμική εμβέλεια, η μεταβλητή y θα μπορούσε να έχει οποιονδήποτε τύπο κατά την εκτέλεση της p και άρα η φόρμα θα μπορούσε να αποδειψθεί λάθος. Η στατική σύνδεση των τύπων δεδομένων (στατικό σύστημα τύπων) και η δυναμική εμβέλεια είναι εγγενώς ασύμβατες.
Δυναμική εμβέλεια Η δυναμική εμβέλεια παραμένει πιθανή επιλογή σε διερμηνεύσιμες γλώσσες, όπου το μέγεθος των προγραμμάτων δεν αναμένεται μεγάλο. Ο λόγος είναι ότι το περιβάλλον εκτέλεσης είναι σημαντικά απλούστερο, όταν χρησιμοποιούμε σ ένα διερμηνευτή δυναμική εμβέλεια. Γλώσσες όπως οι APL, Snobol και Perl (όλες διερμηνεύσιμες) υλοποιούν παραδοσιακά δυναμική εμβέλεια. Οι πρώτες διάλεκτοι της Lisp στηρίζονται επίσης σε δυναμική εμβέλεια. Η δημοφιλής διάλεκτος Scheme χρησιμοποιήσε από την αρχή λεξική εμβέλεια, όπως είναι και η προκαθορισμένη επιλογή για την Common Lisp.
Πολλοί πίνακες συμβόλων Πίνακας συμβόλων στη γραμμή 12
Πολλοί πίνακες συμβόλων Πίνακας συμβόλων στη γραμμή 12