Ονόµατα και Εµβέλεια 4

Σχετικά έγγραφα
Ονόματα και Εμβέλεια 6

Εμβέλεια. Παραδείγματα. Παραδείγματα. Μπλοκ (blocks)

Ονόματα και Εμβέλεια 4

Ονόματα και Εμβέλεια. Wassily Kandinsky, Black lines, 1913

Εγγραφές Δραστηριοποίησης

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Εγγραφές Δραστηριοποίησης

Εγγραφές Δραστηριοποίησης. Jackson Pollock, The Key, 1946 (action painting)

Εγγραφές ραστηριοποίησης

Αντικειµενοστρεφής Προγραµµατισµός

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

procedure P ( < pars > ) < type> f( < pars > ) begin { < local vars > < local vars > < procedure body> < procedure body> end; }

- Αναπαράσταση ακέραιας τιµής : - Εύρος ακεραίων : - Ακέραιοι τύποι: - Πράξεις µε ακεραίους (DIV - MOD)

Βασικά Στοιχεία της Java

Βασικά της γλώσσας JAVA

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

2.1 Αντικειµενοστρεφής προγραµµατισµός

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Α. Ερωτήσεις Ανάπτυξης

Τεχνολογία Λογισµικού Ι Κεφάλαιο 5

Κλάσεις και Αντικείµενα

Λογισµικό (Software SW) Γλώσσες

Προγραμματισμός Ι (ΗΥ120)

Βασικά Στοιχεία της Java

Κάποιες γενικές παρατηρήσεις:

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τμήμα Πληροφορικής

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

8. Μέθοδοι (Methods)

Τι είναι; Ο Πίνακας Συμβόλων είναι όπως ένα λεξικό:

Κεφάλαιο 12 : ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

Αντικειμενοστρέφεια. Ορισμοί αντικειμενοστρέφειας. Κάποιες γενικές παρατηρήσεις: Περιεχόμενα. Ποιοι είναι οι ορισμοί των παρακάτω;

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, 1908

Μεταγλωττιστές. Σημασιολογική Ανάλυση. Εργαστήριο 9. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 10 : Εντολές επιλογής και αποφάσεων

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

Γλώσσες προγραµµατισµού. Ανάπτυξη Συστηµάτων Λογισµικού

Οντοκεντρικός Προγραμματισμός

Εισαγωγή στη Γλώσσα ML

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

if(συνθήκη) {... // οµάδα εντολών } C: Από τη Θεωρία στην Εφαρµογή 5 ο Κεφάλαιο

Ορισμός Συναρτήσεων στην ΜL

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 8 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Κεφάλαιο 5ο: Εντολές Επανάληψης

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Αρχές Ανάλυσης Αλγορίθµων Κεφάλαιο 2. Ε. Μαρκάκης Επικ. Καθηγητής

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Εισαγωγή στον Προγραμματισμό

Μέρος 2 Κατασκευή Συντακτικού Αναλυτή

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

ΚΕΦΑΛΑΙΟ 10 ΕΝΤΟΛΕΣ ΕΠΙΛΟΓΗΣ (ή εντολές Ελέγχου και Επιλογής ή εντολές Επιλογής και Απόφασης)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Κεφάλαιο 6: Εµβέλεια και έσµευση Μνήµης. Γιάννης Γαροφαλάκης ΤΜΗΥΠ - Πανεπιστήµιο Πατρών

Εργαστήριο 1: Επανάληψη Βασικών Εννοιών στη Γλώσσα C

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 10 : Εντολές επιλογής και αποφάσεων

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Τεχνολογίες Υλοποίησης Αλγορίθµων

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ιαφάνειες παρουσίασης #5 (β)

Wrapper Classes, Abstract Classes and Interfaces

ΕΠΛ233 Βιβλιοθήκες και Προσδιοριστές Πρόσβασης στην JAVA

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 26/2/2008

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Αντικειμενοστρεφής Προγραμματισμός

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

3 Αλληλεπίδραση Αντικειμένων

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

ΚΕΦΑΛΑΙΟ 5: Αλγόριθµοι

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Δομές ελέγχου ροής προγράμματος

ύο βασικές ιδέες Ενότητες Απόκρυψη Πληροφορίας, Αφηρηµένοι Τύποι εδοµένων 1) ιαχώρισε το πρόβληµα σεµικρότερα καλώς καθορισµένα υπο-προβλήµατα

Pascal - Βασικές Έννοιες

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Διάλεξη 04: Παραδείγματα Ανάλυσης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

1o Φροντιστήριο ΗΥ240

ΕισαγωγήστουςΗ/Υ. PHP Hypertext Preprocessor

Οντοκεντρικός Προγραμματισμός

Δομές Δεδομένων (Data Structures)

Μεταγλωττιστές Βελτιστοποίηση

Αφαίρεση στον FP. Πολυμορφισμός Συναρτήσεις υψηλότερης τάξης Οκνηρός και Άπληστος Υπολογισμός

Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

ΕΙΔΗ,ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙ- ΣΜΟΥ

ΚΕΦΑΛΑΙΟ 7 ΕΙ Η, ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Τι σηµαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγµα επισηµειώσεων τύπων στην ML. Επισηµειώσεις τύπων (type annotations) Σύνταξη ταιριάσµατος

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Εισαγωγή στη Γλώσσα ML. Juan Miró

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

ΠΡΟΤΕΙΝΟΜΕΝΕΣ ΛΥΣΕΙΣ

Προγραμματισμός Ι. Εισαγωγή στην C++ Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Transcript:

Ονόµατα και Εµβέλεια Ανακύκλωση ονοµάτων Η κατανόηση της εµβέλειας είναι άµεση εάν το κάθε τι έχει το δικό του όνοµα fun square a = a * a; fun double b = b + b; Αλλά στις µοντέρνες γλώσσες προγραµµατισµού, συχνά χρησιµοποιούµε το ίδιο όνοµα ξανά και ξανά fun square x = x * x; fun double x = x + x; Wassily Kandsky, Black les, 1913 Τι ακριβώς συµβαίνει; Κωστής Σαγώνας <kostis@cs.ntua.gr> Ονόµατα και Εµβέλεια 2 Περιεχόµενα Ορισµοί Ορισµοί και εµβέλεια Εµβέλεια µέσω µπλοκ Εµβέλεια µε προσδιορισµένους τόπους ονοµάτων (labeled namespaces) Εµβέλεια µε πρωτογενείς τόπους ονοµάτων (primitive namespaces) υναµική εµβέλεια Ξεχωριστή µεταγλώττιση Όταν υπάρχουν διαφορετικές µεταβλητές µε το ίδιο όνοµα, υπάρχουν και διαφορετικά πιθανά δεσίµατα για κάθε συγκεκριµένο όνοµα Το παραπάνω δεν αναφέρεται µόνο σε ονόµατα µεταβλητών, αλλά σε ονόµατα τύπων, ονόµατα σταθερών, ονόµατα συναρτήσεων, κ.λπ. Ένας ορισµός είναι οτιδήποτε εγκαθιστά ένα πιθανό δέσιµο για ένα όνοµα Ονόµατα και Εµβέλεια 3 Ονόµατα και Εµβέλεια 4

Παραδείγµατα fun square n = n * n; fun square square = square * square; const Low = 1; High = 10; type Ints = array [Low..High] of Integer; var X: Ints; Εµβέλεια Μπορεί να υπάρχουν περισσότεροι από ένας ορισµοί για κάποιο όνοµα Κάθε εµφάνιση του ονόµατος (εκτός των ορισµών) πρέπει να είναι δεµένη µε κάποιον από τους ορισµούς του ονόµατος Λέµε ότι η εµφάνιση ενός ονόµατος είναι στην εµβέλεια κάποιου ορισµού του ονόµατος όποτε ο ορισµός κυβερνά το δέσιµο της συγκεκριµένης εµφάνισης Ονόµατα και Εµβέλεια 5 Ονόµατα και Εµβέλεια 6 Παραδείγµατα - fun square square = square * square; val square = fn : t -> t - square 3; val it = 9 : t Μπλοκ (blocks) Ένα µπλοκ είναι ένα οικοδόµηµα των γλωσσών που περιέχει ορισµούς, και περικλείει µια περιοχή του προγράµµατος στην οποία έχουν εφαρµογή οι ορισµοί Κάθε εµφάνιση πρέπει να είναι δεµένη µε κάποιον από τους ορισµούς Αλλά µε ποιόν από όλους; Υπάρχουν πολλοί τρόποι να λύσουµε αυτό το πρόβληµα εµβέλειας val x = 1 val y = 2 x + y Ονόµατα και Εµβέλεια 7 Ονόµατα και Εµβέλεια 8

Είδη µπλοκ στην ML Ένα απλώς ορίζει ένα µπλοκ: δεν έχει άλλο σκοπό Ένας fun ορισµός περιλαµβάνει ένα µπλοκ: fun cube x = x * x * x; Οι διαφορετικές εναλλακτικές προτάσεις των συναρτήσεων ορίζουν διαφορετικά µπλοκ: fun f (a::b::_) = a + b f [a] = a f [] = 0; Κάθε κανόνας σε ένα ταίριασµα αποτελεί ένα µπλοκ: case x of (a,0) => a (_,b) => b Ονόµατα και Εµβέλεια 9 Μπλοκ στη Java Στη Java και σε άλλες γλώσσες σαν τη C, µπορούµε να συνδυάσουµε εντολές σε µια σύνθετη εντολή (compound statement ) περικλείοντάς τες σε { και } Μια σύνθετη εντολή χρησιµεύει επίσης σαν ένα µπλοκ: while (i < 0) { t c = i * i; p += c; q += c; i -= step; } Ονόµατα και Εµβέλεια 10 Φωλιασµένα µπλοκ (nested blocks) Κλασικός κανόνας εµβέλειας σε µπλοκ Τι συµβαίνει όταν ένα µπλοκ περιλαµβάνει ένα άλλο µπλοκ, και τα δύο µπλοκ εµπεριέχουν ορισµούς για το ίδιο όνοµα; Παράδειγµα σε ML: ποια είναι η τιµή της διπλανής έκφρασης; val n = 1 val m = n + 2 val n = n + 3 val j = n + m n * j Η εµβέλεια ενός ορισµού αποτελείται από το µπλοκ που περιέχει τον ορισµό, από το σηµείο του ορισµού µέχρι το τέλος του µπλοκ, εκτός από την εµβέλεια των πιθανών ορισµών του ίδιου ονόµατος σε εσωτερικά µπλοκ Αυτός είναι ο κανόνας εµβέλειας που χρησιµοποιείται στην ML Οι περισσότερες γλώσσες µε δοµή µπλοκ και στατική εµβέλεια χρησιµοποιούν αυτόν τον κανόνα ή κάποια µικρή παραλλαγή του Ονόµατα και Εµβέλεια 11 Ονόµατα και Εµβέλεια 12

Παράδειγµα val n = 1 val m = n + 2 val n = n + 3 val j = n + m n * j Η εμβέλεια αυτού του ορισμού είναι A-B B A Η έκφραση αποτιµάται ως: m = n + 2 = 1 + 2 = 3 n = n + 3 = 1 + 3 = 4 j = n + m = 4 + 3 = 7 n * j = 4 * 7 = 28 Προσδιορισµένοι τόποι ονοµάτων Ένας προσδιορισµένος τόπος ονοµάτων είναι οτιδήποτε οικοδόµηµα της γλώσσας περιέχει ορισµούς και µια περιοχή του προγράµµατος στην οποία ισχύουν οι ορισµοί Ο προσδιορισµένος τόπος έχει ένα όνοµα που µπορεί να χρησιµοποιηθεί για προσπέλαση των ορισµών του από έξω από το συγκεκριµένο οικοδόµηµα Η ML έχει ένα τέτοιο οικοδόµηµα τη δοµή (structure structure) Η εμβέλεια αυτού του ορισμού είναιb Ονόµατα και Εµβέλεια 13 Ονόµατα και Εµβέλεια 14 οµές στην ML (ML structures) structure Fred = struct val a = 1; fun f x = x + a; ; Οι δοµές είναι περίπου σα µπλοκ: η τιµή a µπορεί να χρησιµοποιηθεί παντού από τον ορισµό της µέχρι το τέλος της δοµής Αλλά οι ορισµοί µέσα στη δοµή είναι προσπελάσιµοι και από εκτός της δοµής, µε χρήση του ονόµατός της: Fred.a και Fred.f Άλλοι προσδιορισµένοι τόποι ονοµάτων Τόποι ονοµάτων που είναι απλώς τόποι ονοµάτων: C++ namespace Modula-3 module Ada package Java package Τόποι ονοµάτων που έχουν και άλλους σκοπούς: Ορισµοί κλάσεων σε αντικειµενοστρεφείς γλώσσες προγραµµατισµού που είναι βασισµένες σε κλάσεις Ονόµατα και Εµβέλεια 15 Ονόµατα και Εµβέλεια 16

Παράδειγµα σε Java public class Month { public static t m = 1; public static t max = 12; } Οι µεταβλητές m και max είναι ορατές σε όλη την υπόλοιπη κλάση Αλλά είναι προσπελάσιµες και εκτός της κλάσης, ως Month.m και Month.max Φυσικά οι κλάσεις έχουν και άλλους σκοπούς Πλεονεκτήµατα τόπων ονοµάτων ύο αλληλοσυγκρουόµενοι στόχοι: Χρησιµοποίηση ενός απλού µνηµονικού ονόµατος όπως π.χ. max Για ότι θέλουµε να είναι απροσπέλαστο από τον υπόλοιπο κόσµο, χρησιµοποιούµε ασυνήθη ονόµατα όπως maxsupplierbid, δηλαδή ονόµατα που δε θα συγκρούονται µε ονόµατα σε άλλα µέρη του προγράµµατος Με χρήση τόπων ονοµάτων, µπορούµε να επιτύχουµε και τους δύο στόχους: Εντός του τόπου ονόµατος, µπορούµε να χρησιµοποιήσουµε το όνοµα max Από έξω, το όνοµα SupplierBid.max Ονόµατα και Εµβέλεια 17 Ονόµατα και Εµβέλεια 18 Εκλέπτυνση τόπων ονοµάτων Οι περισσότεροι τόποι ονοµάτων έχουν κάποιο τρόπο να επιτρέπουν µέρος του τόπου ονοµάτων να παραµένει ιδιωτικής (δηλ. µη κοινής) χρήσης Με τον τρόπο αυτό κρύβουµε πληροφορία από κάποια µέρη του προγράµµατος Τα προγράµµατα είναι εύκολα συντηρούµενα όταν χρησιµοποιούν ονόµατα µε σχετικά µικρή εµβέλεια Για παράδειγµα, οι αφηρηµένοι τύποι δεδοµένων (abstract data types) αποκαλύπτουν µια αυστηρή διαπροσωπεία και ταυτόχρονα κρύβουν τις λεπτοµέρειες της υλοποίησης Παράδειγµα αφηρηµένου τύπου δεδοµένων namespace dictionary contas a constant defition for itialsize a type defition for hashtable a function defition for hash a function defition for reallocate a function defition for create a function defition for sert a function defition for search a function defition for dee namespace Οι ορισµοί της διαπροσωπείας όµως πρέπει να είναι ορατοί Οι λεπτοµέρειες της υλοποίησης πρέπει να µείνουν κρυφές Ονόµατα και Εµβέλεια 19 Ονόµατα και Εµβέλεια 20

ύο προσεγγίσεις Σε κάποιες γλώσσες, όπως η C++, ο τόπος ονοµάτων καθορίζει λεπτοµερώς την ορατότητα των συστατικών στοιχείων του Σε άλλες γλώσσες, όπως η ML, κάποιο ξεχωριστό οικοδόµηµα ορίζει τη διαπροσωπεία του τόπου ονοµάτων (π.χ. ένα signature στην ML) Και κάποιες γλώσσες, όπως η Ada και η Java, συνδυάζουν και τις δύο παραπάνω προσεγγίσεις Ο τόπος ονοµάτων καθορίζει την ορατότητα namespace dictionary contas private: a constant defition for itialsize a type defition for hashtable a function defition for hash a function defition for reallocate public: a function defition for create a function defition for sert a function defition for search a function defition for dee namespace Ονόµατα και Εµβέλεια 21 Ονόµατα και Εµβέλεια 22 Ξεχωριστή διαπροσωπεία terface dictionary contas a function type defition for create a function type defition for sert a function type defition for search a function type defition for dee terface namespace mydictionary implements dictionary contas a constant defition for itialsize a type defition for hashtable a function defition for hash a function defition for reallocate a function defition for create a function defition for sert a function defition for search a function defition for dee namespace Μη το δοκιµάσετε στο σπίτι! Είναι επιτρεπτό να ορίσουµε µια µεταβλητή µε όνοµα t Η ML δε µπερδεύεται - val t = 3; val t = 3 : t Ακόµα και το επόµενο επιτρέπεται (η ML καταλαβαίνει ότι η έκφραση t * t δεν αναφέρεται σε κάποιο τύπο): - fun f t = t * t; val f = fn : t -> t - f 3; val it = 9 : t Ονόµατα και Εµβέλεια 23 Ονόµατα και Εµβέλεια 24

Πρωτογενείς τόποι ονοµάτων Η σύνταξη της ML κρατάει ξεχωριστούς τους τύπους και τις εκφράσεις Η ML πάντα ξέρει κατά πόσο κάτι είναι ένας τύπος ή κάτι άλλο, διότι υπάρχει ξεχωριστός τόπος ονοµάτων για τους τύπους fun f(t:t) = (t:t)*(t:t); Τόπος ονοµάτων των µεταβλητών Τόπος ονοµάτων των τύπων Πρωτογενείς τόποι ονοµάτων Είναι τόποι ονοµάτων που δε µπορούν να δηµιουργηθούν µε χρήση της γλώσσας (όπως οι πρωτογενείς τύποι) Είναι µέρος του ορισµού της γλώσσας Κάποιες γλώσσες έχουν αρκετούς διαφορετικούς µεταξύ τους πρωτογενείς τόπους ονοµάτων Π.χ. η Java: τα πακέτα (packages), οι τύποι, οι µέθοδοι, τα πεδία, και οι ετικέτες των εντολών βρίσκονται σε διαφορετικούς τόπους ονοµάτων Ονόµατα και Εµβέλεια 25 Ονόµατα και Εµβέλεια 26 Πότε επιλύεται η εµβέλεια; υναµική εµβέλεια Όλες οι µέθοδοι εµβέλειας που είδαµε µέχρι στιγµής είναι στατικές Απαντούν κατά το χρόνο µεταγλώττισης στην ερώτηση του κατά πόσο µια εµφάνιση κάποιου ονόµατος είναι στην εµβέλεια κάποιου ορισµού Κάποιες γλώσσες καθυστερούν την παραπάνω απόφαση µέχρι το χρόνο εκτέλεσης: λέµε ότι οι γλώσσες αυτές υποστηρίζουν δυναµική εµβέλεια Ονόµατα και Εµβέλεια 27 Ονόµατα και Εµβέλεια 28

υναµική εµβέλεια Κάθε συνάρτηση έχει ένα περιβάλλον από ορισµούς Εάν ο ορισµός ενός ονόµατος που βρίσκεται σε µια συνάρτηση f δε βρίσκεται στο περιβάλλον της συνάρτησης, τότε ψάχνουµε στο περιβάλλον της συνάρτησης που κάλεσε την f Εάν ο ορισµός δε βρεθεί ούτε εκεί, τότε η αναζήτηση συνεχίζεται ακολουθώντας την αλυσίδα των κλήσεων των συναρτήσεων Στη δυναµική εµβέλεια ο κανόνας είναι κάπως περίεργος Κλασικός κανόνας δυναµικής εµβέλειας Η εµβέλεια ενός ορισµού είναι η συνάρτηση που περιέχει τον ορισµό, από το σηµείο του ορισµού µέχρι το τέλος της συνάρτησης, µαζί µε όλες τις συναρτήσεις που καλούνται (άµεσα ή έµµεσα) από την εµβέλεια εκτός της εµβέλειας οποιωνδήποτε νέων ορισµών των ίδιων ονοµάτων στις καλούµενες συναρτήσεις Ονόµατα και Εµβέλεια 29 Ονόµατα και Εµβέλεια 30 Στατική εµβέλεια έναντι δυναµικής Παράδειγµα Οι κανόνες εµβέλειας είναι παρόµοιοι Και οι δύο µιλάνε για τρύπες εµβέλειας µέρη στα οποία η εµβέλεια διακόπτεται εξαιτίας νέων ορισµών Αλλά ο κανόνας της στατικής εµβέλειας αναφέρεται µόνο σε κοµµάτια του κειµένου του προγράµµατος, και κατά συνέπεια µπορεί να προσδιοριστεί κατά το χρόνο µεταγλώττισης του προγράµµατος Ο κανόνας της δυναµικής εµβέλειας αναφέρεται σε γεγονότα χρόνου εκτέλεσης, συγκεκριµένα σε ακολουθίες κλήσεων συναρτήσεων fun g x = val c = 1 fun f y = y + c fun h z = h x ; val c = 2 f z Ποια θα ήταν η τιµή της κλήσης g 5 αν η γλώσσα χρησιµοποιούσε α) στατική εµβέλεια; β) δυναµική εµβέλεια; Ονόµατα και Εµβέλεια 31 Ονόµατα και Εµβέλεια 32

Στατική εµβέλεια (εµβέλεια µπλοκ) υναµική εµβέλεια fun g x = val c = 1 fun f y = y + c fun h z = h x ; val c = 2 f z Στη στατική εµβέλεια, η µεταβλητή c δένεται µε τον προηγούµενο ορισµό στο ίδιο µπλοκ. Ο ορισµός στο περιβάλλον κλήσης της f είναι µη προσπελάσιµος. g 5 = 6 σε αυτήν την περίπτωση (όπως και στην ML) fun g x = val c = 1 fun f y = y + c fun h z = h x ; val c = 2 f z Στη δυναµική εµβέλεια, η µεταβλητή c δένεται µε τον ορισµό στο περιβάλλον κλήσης της f. g 5 = 7 σε αυτήν την περίπτωση Ονόµατα και Εµβέλεια 33 Ονόµατα και Εµβέλεια 34 Που χρησιµοποιείται η δυναµική εµβέλεια Σε λίγες µόνο γλώσσες: σε κάποιες διαλέκτους της Lisp και της APL Υπάρχει διαθέσιµη ως επιλογή στην Common Lisp Μειονεκτήµατα: υσκολία αποδοτικής υλοποίησης ηµιουργεί µεγάλες και περίπλοκες εµβέλειες (οι εµβέλειες επεκτείνονται στις καλούµενες συναρτήσεις) Η επιλογή του ονόµατος κάποιας µεταβλητής στη συνάρτηση κλήσης µπορεί να επηρεάσει τη συµπεριφορά της καλούµενης συνάρτησης Πλεονέκτηµα: υνατότητα αλλαγής/επιλογής του περιβάλλοντος εκτέλεσης Ονόµατα και Εµβέλεια 35 Πιθανή χρήση της δυναµικής εµβέλειας program messages; var message : strg; procedure compla; beg writeln(message); ; procedure out_of_mem; var message : strg; beg message := "Out of memory"; compla; ; procedure timeout; var message : strg; beg message := "Timeout"; compla; ; Ονόµατα και Εµβέλεια 36

Αµοιβαία αναδροµή µέσω δηλώσεων forward Γλώσσες όπως η C, C++ και η Pascal χρειάζονται δηλώσεις forward για αµοιβαία αναδροµικούς ορισµούς t foo(); t bar() {... foo();... } t foo() {... bar();... } Εν µέρει, το παραπάνω είναι παρενέργεια της διαδικασίας που ακολουθείται από το µεταγλωττιστή: επιτρέπει τη µετάφραση του προγράµµατος µε ένα µόνο πέρασµα Αµοιβαία αναδροµικές συναρτήσεις στην ML Οι αµοιβαία αναδροµικές συναρτήσεις στην ML πρέπει να γραφούν µαζί, µε χρήση ενός συνδετικού and: - fun even x = = if (x <= 0) then true else odd (x-1) = and odd x = = if (x <= 0) then false else even (x-1); val even = fn : t -> bool val odd = fn : t -> bool - even 42; val it = true : bool - odd 42; val it = false : bool Ονόµατα και Εµβέλεια 37 Ονόµατα και Εµβέλεια 38 Ξεχωριστή µεταγλώττιση Μέρη του προγράµµατος µεταγλωττίζονται ξεχωριστά, και στη συνέχεια συνδέονται (lked) µαζί Τα θέµατα εµβέλειας επεκτείνονται από το µεταγλωττιστή (compiler) στο συνδέτη (lker) ο οποίος χρειάζεται να συνδέσει αναφορές σε ορισµούς που έχουν προκύψει από ξεχωριστή µεταγλώττιση Οι περισσότερες γλώσσες έχουν κάποια ειδική υποστήριξη για το πως γίνεται η σύνδεση των κοµµατιών του προγράµµατος που έχουν µεταγλωττιστεί ξεχωριστά Η προσέγγιση της C: η µεριά του µεταγλωττιστή ύο διαφορετικά είδη ορισµών ονοµάτων: Πλήρης ορισµός (defition) Όνοµα και τύπος µόνο: µια δήλωση (declaration declaration) κατά τη C Εάν πολλές διαφορετικές µεταγλωττίσεις/αρχεία θέλουν να χρησιµοποιήσουµε την ίδια ακέραια µεταβλητή x: Μόνο ένα αρχείο θα έχει τον ορισµό: t x = 3; Όλα τα άλλα αρχεία θα έχουν τη δήλωση: extern t x; Ονόµατα και Εµβέλεια 39 Ονόµατα και Εµβέλεια 40

Η προσέγγιση της C:η µεριά του συνδέτη Όταν τρέχει ο συνδέτης, θεωρεί κάθε δήλωση ως µια αναφορά σε ένα όνοµα που ορίζεται σε κάποιο άλλο αρχείο Περιµένει να βρει ακριβώς έναν πλήρη ορισµό του κάθε ονόµατος (σε κάποιο αρχείο) Προσέξτε ότι οι δηλώσεις δεν αναφέρουν σε ποιο σηµείο βρίσκεται ο πλήρης ορισµός και πως αυτός θα βρεθεί αντιθετα, απλώς αξιώνουν από το συνδέτη να ψάξει να τον βρει κάπου Τάσεις ξεχωριστής µεταγλώττισης Στις σύγχρονες γλώσσες, η ξεχωριστή µεταγλώττιση είναι λιγότερο ξεχωριστή από ότι ήταν πριν από κάποια χρόνια Οι κλάσεις της Java µπορεί να εξαρτώνται κυκλικά µεταξύ τους, και ο µεταγλωττιστής της Java πρέπει να είναι σε θέση να µεταφράσει πολλές ξεχωριστές κλάσεις ταυτόχρονα Η ML δεν προσφέρεται καθόλου για ξεχωριστή µεταγλώττιση, αλλά υπάρχει ο CM (Compilation Manager, ένα ξεχωριστό εργαλείο του συστήµατος SML/NJ) µπορεί να το κάνει για τα περισσότερα προγράµµατα σε ML Ονόµατα και Εµβέλεια 41 Ονόµατα και Εµβέλεια 42 Συµπερασµατικά Τέσσερεις διαφορετικές προσεγγίσεις για εµβέλεια Υπάρχουν πολλές διαφοροποιήσεις στις προσεγγίσεις Οι περισσότερες γλώσσες χρησιµοποιούν τουλάχιστον κάποιες από αυτές Ονόµατα και Εµβέλεια 43