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

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

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

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

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

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

Αντικειμενοστρέφεια. 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; }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Κεφάλαιο 7: Υπορουτίνες

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

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

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

Κεφάλαιο 7: Υποπρογράμματα. Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

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

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

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

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

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

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

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

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

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

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

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

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

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

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

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

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

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

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

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

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

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

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL)

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

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

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

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

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

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

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

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

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

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

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

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

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

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

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

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

Αποθηκευμένες Διαδικασίες Stored Routines (Procedures & Functions)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

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

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

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

ΚΥΡΙΑ ΜΟΝΤΕΛΑ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

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

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

ΚΕΦΑΛΑΙΟ 2: Τύποι δεδομένων και εμφάνιση στοιχείων...33

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

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

{ int a = 5; { int b = 7; a = b + 3;

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

Δεδομένα, τελεστές, είσοδος/έξοδος

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

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

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

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

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

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

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

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

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

Δοκιμή και Αποσφαλμάτωση Testing and Debugging

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Προγραμματισμός Αναδρομή

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Transcript:

Ονόματα και Εμβέλεια Wassily Kandinsky, Black lines, 1913 Κωστής Σαγώνας <kostis@cs.ntua.gr>

Ανακύκλωση ονομάτων Η κατανόηση της εμβέλειας είναι άμεση εάν το κάθε τι έχει το δικό του όνομα Αλλά στις μοντέρνες γλώσσες προγραμματισμού, συχνά χρησιμοποιούμε το ίδιο όνομα ξανά και ξανά Τι ακριβώς συμβαίνει; fun square a = a * a; fun double b = b + b; fun square x = x * x; fun double x = x + x; Ονόματα και Εμβέλεια 2

Περιεχόμενα Ορισμοί και εμβέλεια Εμβέλεια μέσω μπλοκ Εμβέλεια με προσδιορισμένους τόπους ονομάτων (labeled namespaces) Εμβέλεια με πρωτογενείς τόπους ονομάτων (primitive namespaces) Στατική και δυναμική εμβέλεια Ξεχωριστή μεταγλώττιση Ονόματα και Εμβέλεια 3

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

Παραδείγματα fun square n = n * n; fun square square = square * square; const Low = 1; High = 42; type Ints = array [Low..High] of Integer; var X: Ints; Ονόματα και Εμβέλεια 5

Εμβέλεια Μπορεί να υπάρχουν περισσότεροι από ένας ορισμοί για κάποιο όνομα Κάθε εμφάνιση του ονόματος (εκτός των ορισμών) πρέπει να είναι δεμένη με κάποιον από τους ορισμούς του ονόματος Λέμε ότι η εμφάνιση ενός ονόματος είναι στην εμβέλεια κάποιου ορισμού του ονόματος όποτε το δέσιμο της συγκεκριμένης εμφάνισης καθορίζεται από αυτόν τον ορισμό Ονόματα και Εμβέλεια 6

Παραδείγματα - fun square square = square * square; val square = fn : int -> int - square 3; val it = 9 : int Κάθε εμφάνιση πρέπει να είναι δεμένη με κάποιον από τους ορισμούς Αλλά με ποιον από όλους; Υπάρχουν πολλοί τρόποι να λύσουμε αυτό το πρόβλημα εμβέλειας Ονόματα και Εμβέλεια 7

Μπλοκ (blocks) Ένα μπλοκ είναι ένα οικοδόμημα των γλωσσών που περιέχει ορισμούς και περικλείει μια περιοχή του προγράμματος στην οποία έχουν εφαρμογή οι ορισμοί let val x = 6 val y = 7 in x * y end Ονόματα και Εμβέλεια 8

Είδη μπλοκ στην ML Ένα let απλώς ορίζει ένα μπλοκ: δεν έχει άλλο σκοπό Ένας ορισμός fun περιλαμβάνει ένα μπλοκ: fun cube x = x * x * x; Οι διαφορετικές εναλλακτικές προτάσεις των συναρτήσεων ορίζουν διαφορετικά μπλοκ: fun f (a::b::_) = a + b f [a] = a f [] = 0; Κάθε κανόνας σε ένα ταίριασμα αποτελεί ένα μπλοκ: case x of (a,0) => a (_,a) => a Ονόματα και Εμβέλεια 9

Μπλοκ στη Java Στη Java και σε άλλες γλώσσες σαν τη C, μπορούμε να συνδυάσουμε εντολές σε μια σύνθετη εντολή (compound statement ) περικλείοντάς τες σε { και } Μια σύνθετη εντολή χρησιμεύει επίσης ως ένα μπλοκ: while (i < 0) { int c = i * i; p += c; q += c; i -= step; } Ονόματα και Εμβέλεια 10

Φωλιασμένα μπλοκ (nested blocks) Τι συμβαίνει όταν ένα μπλοκ περιλαμβάνει ένα άλλο μπλοκ, και τα δύο μπλοκ εμπεριέχουν ορισμούς για το ίδιο όνομα; Παράδειγμα σε ML: ποια είναι η τιμή της διπλανής έκφρασης; let val n = 1 in let val m = n + 2 val n = n + 3 val j = n + m in (2 + n) * j end end Ονόματα και Εμβέλεια 11

Κλασικός κανόνας εμβέλειας σε μπλοκ Η εμβέλεια ενός ορισμού αποτελείται από το μπλοκ που περιέχει τον ορισμό, από το σημείο του ορισμού μέχρι το τέλος του μπλοκ, εκτός από την εμβέλεια των πιθανών ορισμών του ίδιου ονόματος σε εσωτερικά μπλοκ Αυτός είναι ο κανόνας εμβέλειας που χρησιμοποιείται στην ML Οι περισσότερες γλώσσες με δομή μπλοκ και στατική εμβέλεια χρησιμοποιούν αυτόν τον κανόνα ή κάποια μικρή παραλλαγή του Ονόματα και Εμβέλεια 12

Παράδειγμα let val n = 1 in let val m = n + 2 val n = n + 3 val j = n + m in (2 + n) * j end end Η εμβέλεια αυτού του ορισμού είναι A B B A Η έκφραση αποτιμάται ως: m = n + 2 = 1 + 2 = 3 n = n + 3 = 1 + 3 = 4 j = n + m = 4 + 3 = 7 (2 + n) * j = (2 + 4) * 7 = 6 * 7 = 42 Η εμβέλεια αυτού του ορισμού είναι B Ονόματα και Εμβέλεια 13

Προσδιορισμένοι τόποι ονομάτων Ένας προσδιορισμένος τόπος ονομάτων είναι οποιοδήποτε οικοδόμημα της γλώσσας που: 1. περιέχει ορισμούς και μια περιοχή του προγράμματος στην οποία ισχύουν οι ορισμοί 2. έχει ένα όνομα που μπορεί να χρησιμοποιηθεί για προσπέλαση των ορισμών του από έξω από το συγκεκριμένο οικοδόμημα Η ML έχει ένα τέτοιο οικοδόμημα τη δομή (structure) Ονόματα και Εμβέλεια 14

Δομές στην ML (ML structures) Οι δομές είναι περίπου σαν μπλοκ: η τιμήa μπορεί να χρησιμοποιηθεί παντού από τον ορισμό της μέχρι το τέλος της δομής structure Fred = struct val a = 42; fun f x = x + a; end; Αλλά οι ορισμοί μέσα στη δομή είναι προσπελάσιμοι και εκτός της δομής, με χρήση του ονόματός της π.χ. Fred.a και Fred.f Ονόματα και Εμβέλεια 15

Άλλοι προσδιορισμένοι τόποι ονομάτων Τόποι ονομάτων που είναι απλώς τόποι ονομάτων: C++ namespace Modula-3 module Ada package Java package Τόποι ονομάτων που έχουν και άλλους σκοπούς: Ορισμοί κλάσεων σε αντικειμενοστρεφείς γλώσσες προγραμματισμού που είναι βασισμένες σε προσδιορισμένους τόπους ονομάτων Ονόματα και Εμβέλεια 16

Παράδειγμα σε Java public class Month { public static int min = 1; public static int max = 42; } Οι μεταβλητές min και max είναι ορατές σε όλη την υπόλοιπη κλάση Αλλά είναι προσπελάσιμες και εκτός της κλάσης, ως Month.min και Month.max Φυσικά, όπως θα δούμε, οι κλάσεις στη Java έχουν και άλλους σκοπούς Ονόματα και Εμβέλεια 17

Πλεονεκτήματα τόπων ονομάτων Δύο αλληλοσυγκρουόμενοι στόχοι: Χρήση απλών μνημονικών ονομάτων όπως π.χ. max Για ό,τι θέλουμε να είναι απροσπέλαστο από τον υπόλοιπο κόσμο, χρησιμοποιούμε ασυνήθη ονόματα όπως maxsupplierbid, δηλαδή ονόματα που δε θα συγκρούονται με ονόματα σε άλλα μέρη του προγράμματος Με χρήση τόπων ονομάτων, μπορούμε να επιτύχουμε και τους δύο στόχους: Εντός του τόπου ονόματος, μπορούμε να χρησιμοποιήσουμε το όνομα max Από έξω, το όνομα SupplierBid.max Ονόματα και Εμβέλεια 18

Εκλέπτυνση τόπων ονομάτων Οι περισσότεροι τόποι ονομάτων έχουν κάποιο τρόπο να επιτρέπουν μέρος του τόπου ονομάτων να παραμένει ιδιωτικής (δηλ. μη κοινής) χρήσης Με τον τρόπο αυτό κρύβουμε πληροφορία από κάποια μέρη του προγράμματος Τα προγράμματα είναι πιο εύκολα συντηρούμενα όταν χρησιμοποιούν ονόματα με σχετικά μικρή εμβέλεια Για παράδειγμα, οι αφηρημένοι τύποι δεδομένων (abstract data types) αποκαλύπτουν μια αυστηρή διαπροσωπεία και ταυτόχρονα κρύβουν τις λεπτομέρειες της υλοποίησης Ονόματα και Εμβέλεια 19

Παράδειγμα αφηρημένου τύπου δεδομένων namespace dictionary contains a constant definition for initialsize a type definition for hashtable a function definition for hash a function definition for reallocate a function definition for create a function definition for insert a function definition for search a function definition for delete end namespace Οι λεπτομέρειες της υλοποίησης πρέπει να μείνουν κρυφές Οι ορισμοί της διαπροσωπείας όμως πρέπει να είναι ορατοί Ονόματα και Εμβέλεια 20

Δύο προσεγγίσεις Σε κάποιες γλώσσες, όπως η C++, ο τόπος ονομάτων καθορίζει λεπτομερώς την ορατότητα των συστατικών στοιχείων του Σε άλλες γλώσσες, όπως η ML, κάποιο ξεχωριστό οικοδόμημα ορίζει τη διαπροσωπεία του τόπου ονομάτων (π.χ. ένα signature στην ML) Και κάποιες γλώσσες, όπως η Ada και η Java, συνδυάζουν και τις δύο παραπάνω προσεγγίσεις Ονόματα και Εμβέλεια 21

Ο τόπος ονομάτων καθορίζει την ορατότητα namespace dictionary contains private: a constant definition for initialsize a type definition for hashtable a function definition for hash a function definition for reallocate public: a function definition for create a function definition for insert a function definition for search a function definition for delete end namespace Ονόματα και Εμβέλεια 22

Ξεχωριστή διαπροσωπεία interface dictionary contains a function type definition for create a function type definition for insert a function type definition for search a function type definition for delete end interface namespace mydictionary implements dictionary contains a constant definition for initialsize a type definition for hashtable a function definition for hash a function definition for reallocate a function definition for create a function definition for insert a function definition for search a function definition for delete end namespace Ονόματα και Εμβέλεια 23

Μη το δοκιμάσετε στο σπίτι! Επιτρέπεται να ορίσουμε μια μεταβλητή με όνομα int Η ML δε μπερδεύεται - val int = 42; val int = 42 : int Ακόμα και το επόμενο επιτρέπεται (η ML καταλαβαίνει ότι η έκφραση int * int δεν αναφέρεται σε κάποιο τύπο): - fun f int = int * int; val f = fn : int -> int - f 7-7; val it = 42 : int Ονόματα και Εμβέλεια 24

Πρωτογενείς τόποι ονομάτων Η σύνταξη της ML κρατάει ξεχωριστούς τους τύπους και τις εκφράσεις Η ML πάντα ξέρει αν ένα όνομα είναι τύπος ή κάτι άλλο, διότι υπάρχει ξεχωριστός τόπος ονομάτων για τους τύπους fun f(int:int) = (int:int)*(int:int); Τόπος ονομάτων των μεταβλητών Τόπος ονομάτων των τύπων Ονόματα και Εμβέλεια 25

Πρωτογενείς τόποι ονομάτων Είναι τόποι ονομάτων που δε μπορούν να δημιουργηθούν με χρήση της γλώσσας (όπως οι πρωτογενείς τύποι) Είναι μέρος του ορισμού της γλώσσας Κάποιες γλώσσες έχουν αρκετούς διαφορετικούς μεταξύ τους πρωτογενείς τόπους ονομάτων Π.χ. η Java: τα πακέτα (packages), οι τύποι, οι μέθοδοι, τα πεδία, και οι ετικέτες των εντολών βρίσκονται σε διαφορετικούς τόπους ονομάτων Ονόματα και Εμβέλεια 26

Στατική και Δυναμική εμβέλεια Ονόματα και Εμβέλεια 27

Πότε επιλύεται η εμβέλεια; Όλες οι μέθοδοι εμβέλειας που είδαμε μέχρι στιγμής είναι στατικές Απαντούν κατά το χρόνο μεταγλώττισης στην ερώτηση του κατά πόσο μια εμφάνιση κάποιου ονόματος είναι στην εμβέλεια κάποιου ορισμού Κάποιες γλώσσες καθυστερούν την παραπάνω απόφαση μέχρι το χρόνο εκτέλεσης: λέμε ότι οι γλώσσες αυτές υποστηρίζουν δυναμική εμβέλεια Ονόματα και Εμβέλεια 28

Δυναμική εμβέλεια Κάθε συνάρτηση έχει ένα περιβάλλον από ορισμούς Εάν ο ορισμός ενός ονόματος που βρίσκεται σε μια συνάρτηση f δε βρίσκεται στο περιβάλλον της συνάρτησης, τότε ψάχνουμε στο περιβάλλον της συνάρτησης που κάλεσε την f Εάν ο ορισμός δε βρεθεί ούτε εκεί, τότε η αναζήτηση συνεχίζεται ακολουθώντας την αλυσίδα των κλήσεων των συναρτήσεων Στη δυναμική εμβέλεια ο κανόνας είναι κάπως περίεργος Ονόματα και Εμβέλεια 29

Κλασικός κανόνας δυναμικής εμβέλειας Η εμβέλεια ενός ορισμού είναι η συνάρτηση που περιέχει τον ορισμό, από το σημείο του ορισμού μέχρι το τέλος της συνάρτησης, μαζί με όλες τις συναρτήσεις που καλούνται (άμεσα ή έμμεσα) από την εμβέλεια εκτός της εμβέλειας οποιωνδήποτε νέων ορισμών των ίδιων ονομάτων στις καλούμενες συναρτήσεις Ονόματα και Εμβέλεια 30

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

Παράδειγμα fun g x = let val inc = 1 fun f y = y + inc fun h z = let val inc = 2 in f z end in h x end; Ποια θα ήταν η τιμή της κλήσης g 5 αν η γλώσσα χρησιμοποιούσε α) στατική εμβέλεια; β) δυναμική εμβέλεια; Ονόματα και Εμβέλεια 32

Στατική εμβέλεια (εμβέλεια μπλοκ) fun g x = let val inc = 1 fun f y = y + inc fun h z = let val inc = 2 in f z end in h x end; Στη στατική εμβέλεια, η μεταβλητή inc δένεται με τον προηγούμενο ορισμό στο ίδιο μπλοκ. Ο ορισμός της inc στο περιβάλλον κλήσης της f είναι μη προσπελάσιμος. g 5 = 6 σε αυτήν την περίπτωση (όπως και στην ML) Ονόματα και Εμβέλεια 33

Δυναμική εμβέλεια fun g x = let val inc = 1 fun f y = y + inc fun h z = let val inc = 2 in f z end in h x end; Στη δυναμική εμβέλεια, η μεταβλητή inc δένεται με τον χρονικά πιο πρόσφατο ορισμό στο περιβάλλον κλήσης της f. g 5 = 7 σε αυτήν την περίπτωση Ονόματα και Εμβέλεια 34

Πού χρησιμοποιείται η δυναμική εμβέλεια Σε λίγες μόνο γλώσσες Σε κάποιες διαλέκτους της Lisp και της APL Υπάρχει διαθέσιμη ως επιλογή στην Common Lisp Μειονεκτήματα: Δυσκολία αποδοτικής υλοποίησης Δημιουργεί μεγάλες και περίπλοκες εμβέλειες (οι εμβέλειες επεκτείνονται στις καλούμενες συναρτήσεις) Η επιλογή του ονόματος κάποιας μεταβλητής στη συνάρτηση κλήσης μπορεί να επηρεάσει τη συμπεριφορά της καλούμενης συνάρτησης Πλεονέκτημα: Δυνατότητα αλλαγής/επιλογής του περιβάλλοντος εκτέλεσης Ονόματα και Εμβέλεια 35

Πιθανή χρήση της δυναμικής εμβέλειας program messages; var message : string; procedure complain; begin writeln(message); end; procedure out_of_mem; var message : string; begin message := "Out of memory"; complain; end; procedure timeout; var message : string; begin message := "Timeout"; complain; end; Ονόματα και Εμβέλεια 36

Αμοιβαία αναδρομή μέσω δηλώσεων forward Γλώσσες όπως η C, C++ και η Pascal χρειάζονται δηλώσεις forward για αμοιβαία αναδρομικούς ορισμούς int foo(); int bar() {... foo();... } int foo() {... bar();... } Εν μέρει, το παραπάνω είναι παρενέργεια της διαδικασίας που ακολουθείται από το μεταγλωττιστή: επιτρέπει τη μετάφραση του προγράμματος με ένα μόνο πέρασμα Ονόματα και Εμβέλεια 37

Αμοιβαία αναδρομικές συναρτήσεις στην 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 : int -> bool val odd = fn : int -> bool - even 42; val it = true : bool - odd 42; val it = false : bool Ονόματα και Εμβέλεια 38

Ξεχωριστή μεταγλώττιση Μέρη του προγράμματος μεταγλωττίζονται ξεχωριστά, και στη συνέχεια συνδέονται (linked) μαζί Τα θέματα εμβέλειας επεκτείνονται από το μεταγλωττιστή (compiler) στο συνδέτη (linker) ο οποίος χρειάζεται να συνδέσει αναφορές σε ορισμούς που έχουν προκύψει από ξεχωριστή μεταγλώττιση Οι περισσότερες γλώσσες έχουν κάποια ειδική υποστήριξη για το πώς γίνεται η σύνδεση των κομματιών του προγράμματος που έχουν μεταγλωττιστεί ξεχωριστά Ονόματα και Εμβέλεια 39

Η προσέγγιση της C: η μεριά του μεταγλωττιστή Δύο διαφορετικά είδη ορισμών ονομάτων: Πλήρης ορισμός (definition) Όνομα και τύπος μόνο: μια δήλωση (declaration) κατά τη C Εάν πολλές διαφορετικές μεταγλωττίσεις/αρχεία θέλουν να χρησιμοποιήσουμε την ίδια ακέραια μεταβλητή x: Μόνο ένα αρχείο θα έχει τον ορισμό (με αρχικοποίηση): int x = 42; Όλα τα άλλα αρχεία θα έχουν τη δήλωση της μεταβλητής: extern int x; Ονόματα και Εμβέλεια 40

Η προσέγγιση της C: η μεριά του συνδέτη Όταν τρέχει ο συνδέτης, θεωρεί κάθε δήλωση ως μια αναφορά σε ένα όνομα που ορίζεται σε κάποιο άλλο αρχείο Περιμένει να βρει ακριβώς έναν πλήρη ορισμό του κάθε ονόματος (σε κάποιο αρχείο) Προσέξτε ότι οι δηλώσεις δεν αναφέρουν σε ποιο σημείο βρίσκεται ο πλήρης ορισμός και πώς αυτός θα βρεθεί αντίθετα, απλώς αξιώνουν από το συνδέτη να ψάξει να τον βρει κάπου Ονόματα και Εμβέλεια 41

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

Συμπερασματικά Τέσσερεις διαφορετικές προσεγγίσεις για εμβέλεια Υπάρχουν πολλές διαφοροποιήσεις στις προσεγγίσεις Οι περισσότερες γλώσσες χρησιμοποιούν τουλάχιστον κάποιες από αυτές Ονόματα και Εμβέλεια 43