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

Σχετικά έγγραφα
Εγγραφές Δραστηριοποίησης

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

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

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

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

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

Σχεδίαση Γλωσσών Προγραμματισμού. Εαρινό Εξάμηνο Lec03 18/02/2019

Ανάπτυξη και Σχεδίαση Λογισμικού

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

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

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

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

Αναδρομή. ΗΥ 232 Οργάνωση και Σχεδίαση Υπολογιστών. Διάλεξη 6. Νίκος Μπέλλας Τμήμα Μηχανικών Η/Υ, Τηλεπικοινωνιών και Δικτύων

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

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

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

Δομημένος Προγραμματισμός

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

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

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

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

Ευφυής Προγραμματισμός

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

Δομημένος Προγραμματισμός (ΤΛ1006)

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

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

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

Pascal. 15 Νοεμβρίου 2011

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

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

Παράμετροι 19/9/2007. Πέρασμα παραμέτρων. Περιεχόμενα. Θέσεις και ονόματα στο ταίριασμα παραμέτρων. Ταίριασμα παραμέτρων μέσω ονομάτων

Προγραμματισμός Η/Υ. Ενότητα 7: Συναρτήσεις

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

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

Ανάπτυξη και Σχεδίαση Λογισμικού

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

Γλώσσες Προγραμματισμού Μεταγλωττιστές

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

int plus(int a, int b) { return a+b; } int x = plus(1, 2); Πως περνιούνται οι παράμετροι; Αλλά θα δούμε επτά διαφορετικές μεταξύ τους τεχνικές

Συναρτήσεις-Διαδικασίες

Σε γενικές γραμμές, είναι καλή πρακτική να γράϕουμε προγράμματα C που αποτελούνται από πολλές και μικρές συναρτήσεις, παρά από λίγες και μεγάλες.

Η γλώσσα προγραμματισμού C

Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

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

Εισαγωγή στον Προγραμματισμό (με. τη C)

Παράμετροι. Νίκος Παπασπύρου. Claude Monet, Poppies, 1873

Προγραμματισμός Ι. Συναρτήσεις. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Προηγμένοι Μικροεπεξεργαστές. Έλεγχος Ροής Προγράμματος

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

Διαδικασιακός Προγραμματισμός

- Το πρόγραµµα σας δίνει τα αναµενόµενα αποτελέσµατα.

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

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

Κεφάλαιο 10 ο Υποπρογράµµατα

Αρχές Γλωσσών Προγραμματισμου Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2015 Χρήστος Νομικός ( Τμήμα Μηχανικών Αρχές

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

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

Διαδικασιακός Προγραμματισμός

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Διαδικασίες και συναρτήσεις. 22 Νοε 2008 Ανάπτυξη εφαρμογών/ Υποπρογράμματα 1

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

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Έστω συμβολοσειρά Το σύνολο FIRST περιέχει τα τερματικά σύμβολα από τα οποία αρχίζουν οι συμβολοσειρές που παράγονται από την

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

Προγραμματισμός ΙI (Θ)

Εισαγωγή στον δομημένο προγραμματισμό

Εισαγωγή στον δομημένο προγραμματισμό

Διαδικαστικός Προγραμματισμός

ΣΧΕΔΙΑΣΗ ΚΑΙ ΥΛΟΠΟΙΗΣΗ ΛΟΓΙΣΜΙΚΟΥ

Κεφάλαιο 4: Μεταβλητές, Εκφράσεις, Εντολές. Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών

Φροντιστήριο. Παραγωγή τελικού κώδικα. Παραγωγή τελικού κώδικα

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

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

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

Γιάννης Σαμωνάκης. 1 ο ΣΧΟΛΕΙΟ ΚΩΔΙΚΑ «Βασικά Θέματα Προγραμματισμού στην Ανάπτυξη Δυναμικών Διαδικτυακών Εφαρμογών» (Part 4 - PHP)

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

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

Η βασική συνάρτηση προγράμματος main()

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

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

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

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

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

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

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης

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

Ορισμός μεταβλητών δεικτών και αρχικοποίηση

Στοίβες με Δυναμική Δέσμευση Μνήμης

ΔΕΙΚΤΕΣ ΚΑΙ ΔΙΕΥΘΥΝΣΕΙΣ

Transcript:

Εγγραφές Δραστηριοποίησης Ερώτηση για δέσιμο Κατά την εκτέλεση του προγράμματος, οι μεταβλητές δένονται (δυναμικά) με τιμές Οι τιμές αυτές πρέπει να αποθηκευτούν κάπου Κατά συνέπεια, οι μεταβλητές πρέπει κάπως να δεθούν με θέσεις μνήμης Πώς γίνεται αυτό; Jackson Pollock, The Key, 1946 (action patg) Κωστής Σαγώνας <kostis@cs.ntua.gr> Νίκος Παπασπύρου <nickie@softlab.ntua.gr> Εγγραφές δραστηριοποίησης 2 Συναρτησιακές γλώσσες συναντούν προστακτικές Οι προστακτικές γλώσσες κάνουν εμφανή την έννοια των θέσεων μνήμης: a := 42 Αποθήκευσε τον αριθμό 42 στη θέση μνήμης της μεταβλητής a Οι συναρτησιακές γλώσσες τις κρύβουν: val a = 42 Δέσε το όνομα a με την τιμή 42 Και τα δύο είδη γλωσσών πρέπει να ενώσουν μεταβλητές με τιμές που αναπαρίστανται στη μνήμη Άρα και οι δύο πρέπει να αντιμετωπίσουν την ίδια ερώτηση δεσίματος Περιεχόμενα Εγγραφές δραστηριοποίησης (s) Στατική δέσμευση εγγραφών δραστηριοποίησης Στοίβες από εγγραφές δραστηριοποίησης Χειρισμός φωλιασμένων ορισμών συναρτήσεων Συναρτήσεις ως παράμετροι Μακρόβιες εγγραφές δραστηριοποίησης Εγγραφές δραστηριοποίησης 3 Εγγραφές δραστηριοποίησης 4

Δραστηριοποιήσεις συναρτήσεων Ο χρόνος ζωής της εκτέλεσης μιας συνάρτησης, από τη στιγμή της κλήσης μέχρι την αντίστοιχη επιστροφή, ονομάζεται δραστηριοποίηση (activation) της συνάρτησης Όταν κάθε δραστηριοποίηση έχει το δικό της δέσιμο μεταβλητών σε θέσεις μνήμης, λέμε ότι έχουμε μεταβλητές ειδικές για κάθε δραστηριοποίηση Οι μεταβλητές αυτές ονομάζονται επίσης δυναμικές (dynamic) ή αυτόματες (automatic) μεταβλητές Μεταβλητές ειδικές για κάθε δραστηριοποίηση Στις περισσότερες μοντέρνες γλώσσες προγραμματισμού, οι πιο συνήθεις αυτόματες μεταβλητές είναι αυτές που είναι βοηθητικές για κάθε δραστηριοποίηση συνάρτησης: fun days2ms days = val hours = days * 24.0 val mutes = hours * 60.0 val seconds = mutes * 60.0 seconds * 1000.0 Εγγραφές δραστηριοποίησης 5 Εγγραφές δραστηριοποίησης 6 Δραστηριοποίηση των μπλοκ Για μπλοκ που περιέχουν κώδικα, μιλάμε για Τη δραστηριοποίηση του μπλοκ Το χρόνο ζωής μιας εκτέλεσης του μπλοκ Μια μεταβλητή μπορεί να είναι ειδική για κάποια μόνο δραστηριοποίηση ενός συγκεκριμένου μπλοκ μιας συνάρτησης: fun fact n = if n = 0 then 1 else val fac = fact (n-1) n*fac Χρόνοι ζωής για τις μεταβλητές Οι περισσότερες προστακτικές γλώσσες έχουν κάποιο τρόπο να δηλώσουν ότι κάποιες μεταβλητές δένονται με μια συγκεκριμένη θέση μνήμης για όλη τη διάρκεια της εκτέλεσης του προγράμματος Προφανής λύση δέσμευσης: στατική δέσμευση (ο φορτωτής δεσμεύει χώρο για αυτές τις μεταβλητές) t count = 0; t nextcount() { count = count + 1; return count; Εγγραφές δραστηριοποίησης 7 Εγγραφές δραστηριοποίησης 8

Η εμβέλεια και ο χρόνος ζωής διαφέρουν Άλλοι χρόνοι ζωής για τις μεταβλητές Στις περισσότερες μοντέρνες γλώσσες, οι μεταβλητές με τοπική εμβέλεια έχουν χρόνο ζωής που συνήθως ταυτίζεται με τη δραστηριοποίηση του μπλοκ Όμως, οι δύο έννοιες είναι διαφορετικές μεταξύ τους, όπως π.χ. μπορεί να γίνει στη C μέσω του προσδιοριστή static: t nextcount() { static t count = 0; count = count + 1; return count; Οι γλώσσες αντικειμενοστρεφούς προγραμματισμού χρησιμοποιούν μεταβλητές των οποίων ο χρόνος ζωής είναι συσχετισμένος με το χρόνο ζωής των αντίστοιχων αντικειμένων Κάποιες γλώσσες έχουν μεταβλητές των οποίων οι τιμές είναι επίμονες (persistent): με άλλα λόγια οι μεταβλητές διατηρούν τις τιμές τους για πολλαπλές εκτελέσεις του ίδιου προγράμματος Εγγραφές δραστηριοποίησης 9 Εγγραφές δραστηριοποίησης 10 Εγγραφές δραστηριοποίησης Εγγραφές δραστηριοποίησης για μπλοκ Οι υλοποιήσεις των γλωσσών συνήθως συσκευάζουν όλες τις μεταβλητές που αναφέρονται σε μια συγκεκριμένη δραστηριοποίηση της συνάρτησης σε μια εγγραφή δραστηριοποίησης () Οι εγγραφές δραστηριοποίησης περιέχουν επίσης και όλα τα άλλα δεδομένα που σχετίζονται με δραστηριοποιήσεις, όπως: Τη διεύθυνση επιστροφής () της δραστηριοποίησης: δείχνει σε ποιο σημείο του προγράμματος πρέπει να πάει ο έλεγχος όταν επιστρέψει η συγκεκριμένη δραστηριοποίηση Ένα σύνδεσμο πρόσβασης (access lk) που δείχνει την εγγραφή δραστηριοποίησης της καλούσας συνάρτησης (callg function) Όταν εκτελείται ένα μπλοκ κώδικα, χρειαζόμαστε χώρο για τις τοπικές μεταβλητές του συγκεκριμένου μπλοκ Υπάρχουν διάφοροι τρόποι δέσμευσης αυτού του χώρου: Δεσμεύουμε από πριν χώρο στην εγγραφή δραστηριοποίησης της περικλείουσας συνάρτησης Επεκτείνουμε την εγγραφή δραστηριοποίησης της συνάρτησης όταν η εκτέλεση εισέλθει στο μπλοκ (και τη μειώνουμε ξανά όταν εξέλθουμε του μπλοκ) Δεσμεύουμε κάποια ξεχωριστή εγγραφή δραστηριοποίησης για το μπλοκ Θα δούμε τον πρώτο από αυτούς τους τρόπους Εγγραφές δραστηριοποίησης 11 Εγγραφές δραστηριοποίησης 12

Στατική δέσμευση (static allocation) Παράδειγμα Η απλούστερη προσέγγιση: δέσμευση μίας εγγραφής δραστηριοποίησης για κάθε μια συνάρτηση, στατικά Οι παλιές διάλεκτοι της Fortran και της Cobol χρησιμοποιούσαν (μόνο) αυτό το σύστημα δέσμευσης Αποτελεί απλό και πολύ γρήγορο τρόπο υλοποίησης FUNCTION AVG (ARR, N) DIMENSION ARR(N) SUM = 0.0 DO 100 I = 1, N SUM = SUM + ARR(I) 100 CONTINUE AVG = SUM / FLOAT(N) RETURN END N address ARR address I SUM AVG Εγγραφές δραστηριοποίησης 13 Εγγραφές δραστηριοποίησης 14 Μειονέκτημα στατικής δέσμευσης Στοίβες από εγγραφές δραστηριοποίησης (1) Κάθε συνάρτηση έχει μία εγγραφή δραστηριοποίησης Μπορεί να υπάρξει μία μόνο δραστηριοποίηση συνάρτησης ζωντανή κάθε χρονική στιγμή Οι μοντέρνες γλώσσες (συμπεριλαμβανομένων των μοντέρνων διαλέκτων της Cobol και της Fortran) δεν υπακούν σε αυτόν τον περιορισμό λόγω: Αναδρομής Πολυνηματικότητας (multithreadg) Για την υποστήριξη αναδρομής, πρέπει να δεσμεύσουμε μια νέα εγγραφή δραστηριοποίησης για κάθε δραστηριοποίηση της συνάρτησης Δυναμική δέσμευση: η εγγραφή δραστηριοποίησης δεσμεύεται όταν η συνάρτηση καλείται Σε πολλές γλώσσες, όπως η C, η εγγραφή αυτή αποδεσμεύεται όταν η συνάρτηση επιστρέψει Εγγραφές δραστηριοποίησης 15 Εγγραφές δραστηριοποίησης 16

Στοίβες από εγγραφές δραστηριοποίησης (2) Με άλλα λόγια, η εκτέλεση δημιουργεί μια στοίβα από εγγραφές δραστηριοποίησης, όπου πλαίσια (frames) σπρώχνονται στη στοίβα κατά την κλήση των συναρτήσεων, και απομακρύνονται από τη στοίβα κατά την επιστροφή των συναρτήσεων Τρέχουσα εγγραφή δραστηριοποίησης Στη στατική δέσμευση η θέση κάθε εγγραφής δραστηριοποίησης καθορίζεται πριν την έναρξη εκτέλεσης του προγράμματος Στη δυναμική δέσμευση η θέση της τρέχουσας εγγραφής δραστηριοποίησης ( ) δεν είναι γνωστή παρά μόνο κατά το χρόνο εκτέλεσης Κάθε συνάρτηση πρέπει να ξέρει πως θα βρει τη διεύθυνση της τρέχουσας εγγραφής δραστηριοποίησης Συχνά, ένας καταχωρητής της μηχανής δεσμεύεται για να περιέχει/κρατάει τη συγκεκριμένη τιμή Εγγραφές δραστηριοποίησης 17 Εγγραφές δραστηριοποίησης 18 Παράδειγμα σε C Αποτιμούμε την κλήση fact(3). Ηεικόνα δείχνει τα περιεχόμενα της στοίβας ακριβώς πριν την αναδρομική κλήση της fact(2) που θα δημιουργήσει τη δεύτερη εγγραφή δραστηριοποίησης. t fact(t n) { t result; if (n < 2) result = 1; else result = n * fact(n-1); return result; activation record n: 3 Τα περιεχόμενα της μνήμης ακριβώς πριν την τρίτη δραστηριοποίηση. t fact(t n) { t result; if (n < 2) result = 1; else result = n * fact(n-1); return result; n: 2 n: 3 result:? result:? result:? Εγγραφές δραστηριοποίησης 19 Εγγραφές δραστηριοποίησης 20

Τα περιεχόμενα της μνήμης ακριβώς πριν επιστρέψει η τρίτη δραστηριοποίηση. t fact(t n) { t result; if (n < 2) result = 1; else result = n * fact(n-1); return result; Η δεύτερη δραστηριοποίηση ακριβώς πριν επιστρέψει. t fact(t n) { t result; if (n < 2) result = 1; else result = n * fact(n-1); return result; n: 1 n: 2 n: 3 n: 1 n: 2 n: 3 result: 1 result:? result:? result: 1 result: 2 result:? Εγγραφές δραστηριοποίησης 21 Εγγραφές δραστηριοποίησης 22 Ηπρώτη δραστηριοποίηση ακριβώς πριν επιστρέψει με το αποτέλεσμα fact(3) = 6. n: 1 result: 1 t fact(t n) { t result; if (n < 2) result = 1; else result = n * fact(n-1); return result; n: 2 result: 2 n: 3 result: 6 Παράδειγμα σε ML Αποτιμούμε την κλήση halve [1,2,3,4] Η εικόνα δείχνει τα περιεχόμενα της μνήμης ακριβώς πριν την αναδρομική κλήση που δημιουργεί τη δεύτερη δραστηριοποίηση. fun halve nil = (nil, nil) halve [a] = ([a], nil) halve (a::b::cs) = val (x, y) = halve cs (a::x, b::y) Οι εικόνες περιλαμβάνουν μια μικρή απλοποίηση όσον αφορά στο τι πράγματι αποθηκεύεται στη στοίβα activation record [1,2,3,4] a: 1 b: 2 cs: [3,4] x:? y:? value to return:? Εγγραφές δραστηριοποίησης 23 Εγγραφές δραστηριοποίησης 24

Τα περιεχόμενα της μνήμης ακριβώς πριν την τρίτη δραστηριοποίηση. [3,4] [1,2,3,4] [] Τα περιεχόμενα της μνήμης ακριβώς πριν επιστρέψει η τρίτη δραστηριοποίηση. [3,4] [1,2,3,4] a: 3 a: 1 value to return: ([], []) a: 3 a: 1 fun halve nil = (nil, nil) halve [a] = ([a], nil) halve (a::b::cs) = val (x, y) = halve cs (a::x, b::y) b: 4 cs: [] x:? y:? b: 2 cs: [3,4] x:? y:? value to return:? value to return:? fun halve nil = (nil, nil) halve [a] = ([a], nil) halve (a::b::cs) = val (x, y) = halve cs (a::x, b::y) b: 4 cs: [] x:? y:? b: 2 cs: [3,4] x:? y:? value to return:? value to return:? Εγγραφές δραστηριοποίησης 25 Εγγραφές δραστηριοποίησης 26 Η δεύτερη δραστηριοποίηση ακριβώς πριν επιστρέψει. Η πρώτη δραστηριοποίηση ακριβώς πριν επιστρέψει με το αποτέλεσμα halve [1,2,3,4] = ([1,3],[2,4]) [] value to return: ([], []) fun halve nil = (nil, nil) halve [a] = ([a], nil) halve (a::b::cs) = val (x, y) = halve cs (a::x, b::y) [3,4] a: 3 b: 4 cs: [] x: [] y: [] value to return: ([3], [4]) [1,2,3,4] a: 1 b: 2 cs: [3,4] x:? y:? value to return:? Εγγραφές δραστηριοποίησης 27 [] value to return: ([], []) fun halve nil = (nil, nil) halve [a] = ([a], nil) halve (a::b::cs) = val (x, y) = halve cs (a::x, b::y) [3,4] a: 3 b: 4 cs: [] x: [] y: [] value to return: ([3], [4]) [1,2,3,4] a: 1 b: 2 cs: [3,4] x: [3] y: [4] value to return: ([1,3],[2,4]) Εγγραφές δραστηριοποίησης 28

Φωλιασμένες συναρτήσεις Ό,τι είδαμε μέχρι στιγμής επαρκεί για πολλές γλώσσες, συμπεριλαμβανομένης της C Χειρισμός φωλιασμένων συναρτήσεων Αλλά όχι για γλώσσες που επιτρέπουν το ακόλουθο τρικ: Οι ορισμοί των συναρτήσεων μπορεί να είναι φωλιασμένες μέσα σε άλλους ορισμούς συναρτήσεων Οι εσωτερικές συναρτήσεις μπορεί να αναφέρονται σε τοπικές μεταβλητές των εξωτερικών συναρτήσεων (ακολουθώντας τους συνήθεις κανόνες εμβέλειας όταν υπάρχουν μπλοκ) Δηλαδή δεν επαρκεί για γλώσσες όπως η ML, η Ada, η Pascal, κ.α. Εγγραφές δραστηριοποίησης 29 Εγγραφές δραστηριοποίησης 30 Παράδειγμα Το πρόβλημα fun quicksort nil = nil quicksort (pivot::rest) = fun split nil = (nil, nil) split (x::xs) = val (below, above) = split xs if x < pivot then (x::below, above) else (below, x::above) val (below, above) = split rest quicksort below @ [pivot] @ quicksort above Πώς μπορεί η δραστηριοποίηση της εσωτερικής συνάρτησης (split) να βρει την εγγραφή δραστηριοποίησης της εξωτερικής συνάρτησης (quicksort); Παρατηρήστε ότι δεν είναι απαραίτητα η προηγούμενη εγγραφή δραστηριοποίησης, επειδή η συνάρτηση που κάλεσε την εσωτερική συνάρτηση: μπορεί να είναι μια άλλη εσωτερική συνάρτηση, ή μπορεί να είναι μια αναδρομική κλήση συνάρτησης, όπως συμβαίνει με τη split Εγγραφές δραστηριοποίησης 31 Εγγραφές δραστηριοποίησης 32

Σύνδεσμος φωλιάσματος (nestg lk) a split activation another split activation first caller: a quicksort activation Μια εσωτερική συνάρτηση πρέπει να είναι σε θέση να βρει τη διεύθυνση της πιο πρόσφατης δραστηριοποίησης... της αμέσως εξωτερικής της συνάρτησης Μπορούμε να κρατήσουμε αυτό το σύνδεσμο στην εγγραφή δραστηριοποίησης split s variables: x, xs, etc. split s variables: x, xs, etc. quicksort s variables: pivot, rest, etc. Εγγραφές δραστηριοποίησης 33 Εγγραφές δραστηριοποίησης 34 a split activation split s variables: x, xs, etc. another split activation... first caller: a quicksort activation nestg lk nestg lk nestg lk: null split s variables: x, xs, etc. quicksort s variables: pivot, rest, etc. Πως παίρνουν τιμές οι σύνδεσμοι φωλιάσματος; Εύκολα αν υπάρχει μόνο ένα επίπεδο φωλιάσματος Όταν καλείται μια εξωτερική συνάρτηση: θέτουμε την τιμή null στο σύνδεσμο Όταν καλείται μια εσωτερική συνάρτηση από μία εξωτερική: ο σύνδεσμος φωλιάσματος παίρνει ως τιμή την εγγραφή δραστηριοποίησης της καλούσας συνάρτησης Όταν καλείται μια εσωτερική συνάρτηση από μία εσωτερική: ο σύνδεσμος φωλιάσματος παίρνει ως τιμή το σύνδεσμο φωλιάσματος της καλούσας συνάρτησης Πιο πολύπλοκα από τον παραπάνω τρόπο εάν υπάρχουν πολλαπλά επίπεδα φωλιάσματος Εγγραφές δραστηριοποίησης 35 Εγγραφές δραστηριοποίησης 36

Πολλαπλά επίπεδα φωλιάσματος Αυτή και άλλες λύσεις function f1 variable v1 function f2 variable v2 Οι αναφορές στο ίδιο επίπεδο (π.χ. της f1 στη v1, της f2 στη v2, ) χρησιμοποιούν την τρέχουσα εγγραφή δραστηριοποίησης function f3 variable v3 Οι αναφορές σε ονόματα που βρίσκονται σε κ επίπεδα φωλιάσματος διατρέχουν κ συνδέσμους της αλυσίδας Εγγραφές δραστηριοποίησης 37 Το πρόβλημα είναι οι αναφορές από εσωτερικές συναρτήσεις σε μεταβλητές κάποιας εξωτερικής Λύσεις του προβλήματος αποτελούν οι: Σύνδεσμοι φωλιάσματος των εγγραφών δραστηριοποίησης (όπως δείξαμε στις προηγούμενες διαφάνειες) Displays: οι σύνδεσμοι φωλιάσματος δε βρίσκονται στις εγγραφές δραστηριοποίησης, αλλά συλλέγονται σε ένα στατικό πίνακα Λάμβδα άρση (Lambda liftg): οι αναφορές του προγράμματος αντικαθίστανται από αναφορές σε νέες, κρυφές παραμέτρους Εγγραφές δραστηριοποίησης 38 Παράδειγμα λάμβδα άρσης fun quicksort nil = nil quicksort (pivot::rest) = fun split (nil, _) = (nil, nil) split (x::xs, lpv) = val (below, above) = split (xs, lpv) if x < lpv then (x::below, above) else (below, x::above) val (below, above) = split (rest, pivot) quicksort below @ [pivot] @ quicksort above Συναρτήσεις ως παράμετροι Εγγραφές δραστηριοποίησης 39 Εγγραφές δραστηριοποίησης 40

Συναρτήσεις ως παράμετροι Παράδειγμα Όταν περνάμε μια συνάρτηση ως παράμετρο, τι ακριβώς είναι αυτό που πρέπει να μεταβιβαστεί; Οκώδικαςτηςσυνάρτησηςπρέπειναείναιμέροςαυτού που περνιέται: είτε σε μορφή πηγαίου κώδικα, είτε σε μορφή μεταγλωττισμένου κώδικα, δείκτη σε κώδικα, ή μέσω υλοποίησης κάποιας άλλης μορφής Κάποιες γλώσσες, χρειάζονται κάτι περισσότερο fun addxtoall (x,thelist) = fun addx y = y + x map addx thelist Η παραπάνω συνάρτηση προσθέτει την τιμή του x σε κάθε στοιχείο της λίστας thelist Η addxtoall καλεί τη map, η map καλεί τη addx, και η addx αναφέρεται στη μεταβλητή x στην εγγραφή δραστηριοποίησης της συνάρτησης addxtoall Εγγραφές δραστηριοποίησης 41 Εγγραφές δραστηριοποίησης 42 Σύνδεσμοι φωλιάσματος ξανά Όχι μόνο για τις παραμέτρους Όταν η map καλέσει την addx, τι σύνδεσμος φωλιάσματος θα δοθεί στην addx; Όχι η εγγραφή δραστηριοποίησης της map διότι η addx δεν είναι φωλιασμένη μέσα στη map Όχι ο σύνδεσμος φωλιάσματος της map διότι η map δεν είναι κάπου φωλιασμένη Για να δουλέψει η συνάρτηση addxtoall, η παράμετρος που περνά η addx στη map πρέπει να περιλαμβάνει το σύνδεσμο φωλιάσματος που θα χρησιμοποιηθεί όταν κληθεί η addx fun addxtoall (x,thelist) = fun addx y = y + x map addx thelist Εγγραφές δραστηριοποίησης 43 Πολλές γλώσσες επιτρέπουν σε συναρτήσεις να περαστούν ως παράμετροι Οι συναρτησιακές γλώσσες επιτρέπουν περισσότερα είδη λειτουργιών σε συναρτήσεις-τιμές: Πέρασμα συναρτήσεων ως παραμέτρους Επιστροφή συναρτήσεων από συναρτήσεις Κατασκευή συναρτήσεων από εκφράσεις Οι συναρτήσεις-τιμές περιλαμβάνουν τόσο τον κώδικα που θα εκτελεστεί όσο και το σύνδεσμο φωλιάσματος που θα χρησιμοποιηθεί όταν κληθεί η συνάρτηση Εγγραφές δραστηριοποίησης 44

Παράδειγμα activation record fun addxtoall (x,thelist) = fun addx y = y + x map addx thelist Μακρόβιες εγγραφές δραστηριοποίησης nestg lk x thelist addx y => y + x Τα περιεχόμενα της μνήμης ακριβώς πριν την κλήση της map. Η μεταβλητή addx είναι δεμένη με μια συνάρτηση-τιμή η οποία περιλαμβάνει κώδικα και ένα σύνδεσμο φωλιάσματος. Εγγραφές δραστηριοποίησης 45 Εγγραφές δραστηριοποίησης 46 Μια ακόμα περιπλοκή Τι συμβαίνει εάν μια συνάρτηση-τιμή χρησιμοποιείται από τη συνάρτηση που τη δημιούργησε μετά την επιστροφή της συνάρτησης-δημιουργού; val test = val f = funtoaddx 3 f 5 fun funtoaddx x = fun addx y = y + x addx val test = val f = funtoaddx 3 f 5 fun funtoaddx x = fun addx y = y + x addx activation record x: 3 nestg lk: null addx nestg lk: null f:? Τα περιεχόμενα της μνήμης ακριβώς πριν η funtoaddx επιστρέψει. y => y + x Εγγραφές δραστηριοποίησης 47 Εγγραφές δραστηριοποίησης 48

val test = val f = funtoaddx 3 f 5 fun funtoaddx x = fun addx y = y + x addx x: 3 nestg lk: null addx activation record nestg lk: null f Το πρόβλημα Όταν η test καλέσει την f, η συνάρτηση θα χρησιμοποιήσει το σύνδεσμο φωλιάσματος για να προσπελάσει το x Με άλλα λόγια, θα χρησιμοποιήσει ένα δείκτη σε μια εγγραφή δραστηριοποίησης για μια δραστηριοποίηση που έχει τερματίσει Αυτό θα αποτύχει εάν η υλοποίηση της γλώσσας Μετά την επιστροφή της funtoaddx, η f δεσμεύεται με τη νέα συνάρτηση-τιμή. y => y + x αποδεσμεύσει την εγγραφή δραστηριοποίησης τη στιγμή επιστροφής της συνάρτησης Εγγραφές δραστηριοποίησης 49 Εγγραφές δραστηριοποίησης 50 Ηλύσητουπροβλήματος Στην ML, και σε άλλες γλώσσες όπου υπάρχει η ίδια περιπλοκή, οι εγγραφές δραστηριοποίησης δε μπορούν πάντα να δεσμευθούν και να αποδεσμευθούν ακολουθώντας δομή στοίβας Αυτό διότι ακόμα και όταν μια συνάρτηση επιστρέψει, μπορεί να υπάρχουν σύνδεσμοι στην εγγραφή δραστηριοποίησής της Οι εγγραφές δε μπορεί να αποδεσμευθούν παρά μόνο όταν καταστούν απροσπέλαστες Αυτό συνήθως συμβαίνει με αυτόματη διαχείριση μνήμης ήαλλιώς με συλλογή σκουπιδιών (garbage collection) Εγγραφές δραστηριοποίησης 51 Συμπερασματικά Όσο πιο σοφιστικέ είναι μια γλώσσα, τόσο πιο δύσκολο είναι να δεθούν οι μεταβλητές με θέσεις μνήμης Στατική δέσμευση: δουλεύει σε γλώσσες που επιτρέπουν το πολύ μια δραστηριοποίηση κάθε συνάρτησης κάθε στιγμή (όπως σε πρώιμες διαλέκτους της Fortran και της Cobol) Δυναμική δέσμευση σε στοίβα: δουλεύει σε γλώσσες που δεν επιτρέπουν φωλιασμένες συναρτήσεις (όπως η C) Σύνδεσμοι φωλιάσματος (ή κάτι αντίστοιχο): επιβάλλεται σε γλώσσες που επιτρέπουν φωλιασμένες συναρτήσεις (όπως η ML, η Ada και η Pascal). Οι συναρτήσεις τιμές πρέπει να περιλαμβάνουν τόσο κώδικα όσο και σύνδεσμο φωλιάσματος Κάποιες γλώσσες (όπως η ML) επιτρέπουν αναφορές σε εγγραφές δραστηριοποιήσεων συναρτήσεων που έχουν περατώσει την εκτέλεσή τους. Κατά συνέπεια, οι εγγραφές δραστηριοποίησης δε μπορούν να αποδεσμευθούν αμέσως μετά την επιστροφή τους και η χρήση στοίβας δεν επαρκεί. Εγγραφές δραστηριοποίησης 52