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

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

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

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

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

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

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

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

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

Μεθόδων Επίλυσης Προβλημάτων

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

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

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

Γλώσσα Προγραμματισμού C

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

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

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

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

Μεθόδων Επίλυσης Προβλημάτων

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

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

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

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

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

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

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

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

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

Προεπεξεργαστής της C. C Preprocessor. Προγραμματισμός II 1

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

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

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

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

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

Προγραμματισμός Η/Y. Διάλεξη 6 η : Συναρτήσεις

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

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

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

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

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

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

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

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

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

είκτες και Πίνακες (2)

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

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

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΠΡΟΓΡΑΜΜΑ synartisi_se_diadikasia ΜΕΤΑΒΛΗΤΕΣ ΑΚΕΡΑΙΕΣ: A[10], max, i, C, S, B, maxmax ΑΡΧΗ

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

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

Προεπεξεργαστής C. Προγραμματισμός Ι 1

Προγραμματισμός Συστημάτων

Διάλεξη 5: Δείκτες και Συναρτήσεις

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

Μεταβλητές. Έστω η μεταβλητή

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

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

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

Διάλεξη 6: Δείκτες και Πίνακες

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

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

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

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

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

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

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

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

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

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Deep and Shallow Copies

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

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

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

Τύποι δεδομένων, τελεστές, μεταβλητές

12. Συναρτήσεις (Μέρος ΙI)

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

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Transcript:

Παράμετροι Πέρασμα παραμέτρων int plus(int a, int b) { return a+b; int x = plus(1, 2); Τυπικές παράμετροι Σώμα μεθόδου Πραγματικές παράμετροι Κλήση μεθόδου Κωστής Σαγώνας Claude Monet, Poppies, 1873 <kostis@cs.ntua.gr> Πως περνιούνται οι παράμετροι; Φαίνεται αρκετά εύκολη διαδικασία Αλλά θα δούμε επτά διαφορετικές μεταξύ τους τεχνικές Παράμετροι 2 Περιεχόμενα Αντιστοιχία παραμέτρων Πέρασμα παραμέτρων Κλήση κατά τιμή (call by value) Κλήση κατ αποτέλεσμα (call by result) Κλήση κατά τιμή-αποτέλεσμα (call by value-result) Κλήση κατ αναφορά (call by reference) Κλήση με επέκταση μακροεντολών (call by macro expansion) Κλήση κατ όνομα (call by name) Κλήση κατ ανάγκη (call by need) Θέματα σχεδιασμού γλωσσών Αντιστοιχία παραμέτρων Μια προκαταρκτική ερώτηση: με ποιο τρόπο ταιριάζει η γλώσσα τις τυπικές με τις πραγματικές παραμέτρους; Η πιο συνηθισμένη απάντηση στο παραπάνω ερώτημα είναι: Η αντιστοιχία καθορίζεται από τις θέσεις των παραμέτρων (positional parameters) Για παράδειγμα, η ν-οστή τυπική παράμετρος ταιριάζει με τη ν-οστή πραγματική παράμετρο Παράμετροι 3 Παράμετροι 4

Ταίριασμα παραμέτρων μέσω ονομάτων Η αντιστοιχία μπορεί επίσης να καθοριστεί με χρήση ταιριάσματος ονομάτων παραμέτρων Για παράδειγμα στην Ada: DIVIDE(DIVIDEND => X, DIVISOR => Y); Ταιριάζει την πραγματική παράμετρο X με την τυπική παράμετρο DIVIDEND, και την Y με την DIVISOR Στην περίπτωση αυτή η σειρά εμφάνισης των παραμέτρων δεν παίζει κάποιο ρόλο Θέσεις και ονόματα στο ταίριασμα παραμέτρων Οι περισσότερες γλώσσες που επιτρέπουν ταίριασμα παραμέτρων μέσω ονομάτων (π.χ. Ada, Fortran, Dylan, Python) επιτρέπουν επίσης και παραμέτρους θέσεων Οι πρώτες παράμετροι συνήθως καθορίζονται μέσω θέσεων, ενώ οι υπόλοιπες είναι παράμετροι που καθορίζονται μέσω ονομάτων Παράμετροι 5 Παράμετροι 6 Προαιρετικές παράμετροι Προαιρετικές παράμετροι με χρήση default τιμών: η ακολουθία των τυπικών παραμέτρων περιλαμβάνει default τιμές που χρησιμοποιούνται εάν οι αντίστοιχες πραγματικές παράμετροι ρ λείπουν Μέσω προαιρετικών παραμέτρων μπορούμε να γράψουμε εύκολα κάποιους υπερφορτωμένους ορισμούς συναρτήσεων, όπως π.χ. int f(int a=1, int b=2, int c=3) { body Η παραπάνω έκφραση στη C++ είναι ισοδύναμη με: f(1,2,3); int f(int a) {f(a,2,3); int f(int a, int b) {f(a,b,3); int f(int a, int b, int c) { body Παράμετροι 7 Μη περιορισμένες ακολουθίες παραμέτρων Κάποιες γλώσσες επιτρέπουν ακολουθίες πραγματικών μεταβλητών μη περιορισμένου μήκους: π.χ. η C, η C++, και γλώσσες σεναρίων όπως η JavaScript, η Python και η Perl επιτρέπουν τον ορισμό int printf(char *format,...) { body Οι επιπλέον παράμετροι προσπελάζονται μέσω ειδικών μεθόδων της ββ βιβλιοθήκης Οι μη περιορισμένες ακολουθίες παραμέτρων αποτελούν «τρύπα» των στατικών συστημάτων τύπων Διότι οι τύποι των επιπλέον παραμέτρων δε μπορούν να ελεγχθούν κατά το χρόνο μετάφρασης του προγράμματος Παράμετροι 8

Κλήση κατά τιμή (call by value) Πέρασμα Παραμέτρων ρ Στο πέρασμα παραμέτρων κατά τιμή, η τυπική παράμετρος συμπεριφέρεται σα μια τοπική μεταβλητή στην εγγραφή δραστηριοποίησης η ης της κληθείσας συνάρτησης με μια σημαντική διαφορά: αρχικοποιείται με την τιμή της αντίστοιχης πραγματικής παραμέτρου, πριν η κληθείσα συνάρτηση ξεκινήσει την εκτέλεσή της. Η απλούστερη μέθοδος περάσματος παραμέτρων Χρησιμοποιείται ευρέως Η μόνη μέθοδος στη Java Παράμετροι 9 Παράμετροι 10 int plus(int a, int b) { a += b; return a; int y = 4; int z = plus(x, y); return z; αρχίζει την εκτέλεσή της Η συνάρτηση ρη ηf επιστρέφει 7 a: 3 x: 3 b: 4 y: 4 result:? z:? Παράμετροι 11 Ορατότητα αλλαγών Όταν οι παράμετροι περνιούνται κατά τιμή, οι αλλαγές σε μια τυπική παράμετρο δεν επηρεάζουν την αντίστοιχη πραγματική Παρόλα αυτά είναι δυνατό να γίνουν αλλαγές που να είναι ορατές στην καλούσα μέθοδο Για παράδειγμα, η τιμή της παραμέτρου μπορεί να είναι ένας δείκτης (στη η Java, μια αναφορά) ) Στην περίπτωση αυτή η πραγματική παράμετρος δεν αλλάζει τιμή, αλλά το αντικείμενο το οποίο αναφέρεται από την παράμετρο μπορεί να τροποποιηθεί Παράμετροι 12

void f() { ConsCell x = new ConsCell(0,null); null); alter(3, x); void f() { ConsCell x = new ConsCell(0,null); null); alter(3, x); void alter(int newhead, ConsCell c) { c.sethead(newhead); c = null; head: 0 tail: null void alter(int newhead, ConsCell c) { c.sethead(newhead); c = null; head: 3 tail: null newhead: 3 newhead: 3 Όταν η alter c: x: αρχίζει την εκτέλεσή της t dd Παράμετροι 13 Όταν η alter c: null x: τελειώνει την εκτέλεσή της Παράμετροι 14 Κλήση κατ αποτέλεσμα (call by result) Στο πέρασμα παραμέτρων κατ αποτέλεσμα, η τυπική παράμετρος συμπεριφέρεται σα μια τοπική μεταβλητή στην εγγραφή δραστηριοποίησης η ης της κληθείσας συνάρτησης χωρίς κάποια αρχική τιμή. Όταν η κληθείσα συνάρτηση τελειώσει την εκτέλεσή της, η τελική τιμή της τυπικής παραμέτρου ανατίθεται στην αντίστοιχη πραγματική παράμετρο. void plus(int a, int b, by-result int c) { c = a+b; int y = 4; int z; return plus(x, y, z); Ονομάζεται επίσης copy-out Η πραγματική παράμετρος πρέπει να είναι μια lvalue Η κλήση κατ αποτέλεσμα εισήχθη στην Algol 68 και χρησιμοποιήθηκε και στην Ada Παράμετροι 15 αρχίζει την εκτέλεσή της a: 3 x: 3 b: 4 y: 4 c:? z:? Παράμετροι 16

void plus(int a, int b, by-result int c) { c = a+b; int y = 4; int z; return plus(x, y, z); void plus(int a, int b, by-result int c) { c = a+b; int y = 4; int z; return plus(x, y, z); i t 3 Η συνάρτηση f επιστρέφει 7 a: 3 x: 3 a: 3 x: 3 είναι έτοιμη να επιστρέψει b: 4 y: 4 c: 7 z:? Αφότου η plus επιστρέψει b: 4 y: 4 c: 7 z: 7 Παράμετροι 17 Παράμετροι 18 Κλήση κατά τιμή-αποτέλεσμα (call by value-result) Στο πέρασμα παραμέτρων κατά τιμή αποτέλεσμα, η τυπική παράμετρος συμπεριφέρεται σα μια τοπική μεταβλητή στην εγγραφή δραστηριοποίησης η ης της κληθείσας συνάρτησης. Αρχικοποιείται με την τιμή της αντίστοιχης πραγματικής παραμέτρου, πριν η κληθείσα συνάρτηση ξεκινήσει την εκτέλεσή της. Μετά το πέρας της εκτέλεσης της κληθείσας συνάρτησης, η τελική τιμή της τυπικής παραμέτρου ανατίθεται στην πραγματική παράμετρο. Ονομάζεται επίσης copy-in/copy-out Η πραγματική παράμετρος ρ πρέπει να είναι μια lvalue Παράμετροι 19 void plus(int a, by-value-result int b) { b += a; plus(4, x); return x; αρχίζει την εκτέλεσή της a: 4 x: 3 b: 3 Παράμετροι 20

void plus(int a, by-value-result int b) { b += a; plus(4, x); return x; void plus(int a, by-value-result int b) { b += a; plus(4, x); return x; i t 3 Η συνάρτηση f επιστρέφει 7 a: 4 x: 3 a: 4 x: 7 είναι έτοιμη για επιστροφή b: 7 επιστρέψει b: 7 Παράμετροι 21 Παράμετροι 22 Κλήση κατ αναφορά (call by reference) Στο πέρασμα παραμέτρων κατ αναφορά, η lvalue της παραμέτρου υπολογίζεται πριν να αρχίσει η εκτέλεση της κληθείσας συνάρτησης. ης Μέσα στη συνάρτηση, η, η lvalue χρησιμοποιείται ως lvalue της αντίστοιχης τυπικής παραμέτρου. Κατά συνέπεια, η τυπική παράμετρος είναι ένα επιπλέον όνομα (δηλαδή ένα συνώνυμο alias) για τη θέση μνήμης της πραγματικής παραμέτρου. void plus(int a, by-reference int b) { b += a; void f() { plus(4, x); Ένας από τους παλαιότερους τρόπους κλήσης Χρησιμοποιήθηκε στη Fortran Αποδοτικός για μεγάλα αντικείμενα Χρησιμοποιείται ευρέως και σήμερα Παράμετροι 23 αρχίζει την εκτέλεσή της a: 4 x: 3 b: Παράμετροι 24

void plus(int a, by-reference int b) { b += a; void f() { plus(4, x); Υλοποίηση κλήσης κατ αναφορά void plus(int a, by-reference int b) { b += a; void f() { plus(4, x); Το προηγούμενο παράδειγμα εκτελέσει την ανάθεση a: 4 x: 7 b: Παράμετροι 25 void plus(int a, int *b) { *b += a; void f() { plus(4, &x); Η υλοποίησή του σε C κατ αναφορά = διεύθυνση κατά τιμή Παράμετροι 26 Συνωνυμία (aliasing) Όταν δύο εκφράσεις έχουν την ίδια lvalue, τότε λέμε ότι είναι συνώνυμα (aliases) η μία της άλλης Κάποιες προφανείς περιπτώσεις aliasing ConsCell C x = new ConsCell(0,null); C ll) ConsCell y = x; A[i] = A[j] + A[k]; Όπως θα δούμε στην επόμενη διαφάνεια, η κλήση κατ αναφορά οδηγεί σε πιο περίπλοκες περιπτώσεις aliasing Παράδειγμα void sigsum(by-reference int n, by-reference int ans) { ans = 0; int i = 1; while (i <= n) ans += i++; int x, y; x = 10; sigsum(x,y); return y; int g() { int x; x = 10; sigsum(x,x); return x; Παράμετροι 27 Παράμετροι 28

void sigsum(by-reference int n, by-reference int ans) { ans = 0; int i = 1; while (i <= n) ans += i++; int g() { int x = 10; sigsum(x,x); return x; n: ans: i:? x: 10 result:? Παράμετροι 29 Επέκταση μακροεντολών (macro expansion) Στην επέκταση μακροεντολών, το σώμα της μακροεντολής αποτιμάται στο περιβάλλον εκτέλεσης της καλούσας μεθόδου. Κάθε μία από τις πραγματικές παραμέτρους ρ αποτιμάται για κάθε χρήση της αντίστοιχης τυπικής στο περιβάλλον εμφάνισης της τυπικής παραμέτρου (το οποίο με τη σειρά του βρίσκεται στο περιβάλλον της καλούσας μεθόδου). Με άλλα λόγια, όπως δουλεύουν οι μακροεντολές της C Φυσική υλοποίηση: αντικατάσταση κειμένου πριν τη μεταγλώττιση Παράμετροι 30 Επέκταση μακροεντολών στη C source file pre-processor expanded source compiler Η προεπεξεργασία είναι μία επιπλέον φάση της μεταγλώττισης Επεκτείνει τις μακροεντολές πριν τη μετάφραση Παράδειγμα #define MIN(X,Y) ((X)<(Y)?(X):(Y)) a = MIN(b,c); a = ((b)<(c)?(b):(c)) assemblylanguage file Παράμετροι 31 Προεπεξεργασία (preprocessing) Αντικαθιστούμε κάθε χρήση της μακροεντολής με ένα αντίγραφο του σώματος της μακροεντολής, όπου οι τυπικές παράμετροι έχουν αντικατασταθεί από τις πραγματικές Αποτελεί μια παλιά μέθοδο: χρησιμοποιήθηκε στους assemblers πριν από την ύπαρξη των πρώτων «ανώτερων» γλωσσών προγραμματισμού Έχει κάποιες περίεργες παρενέργειες Επανεκτίμηση Μπλέξιμο ονομάτων (name capture) Παράμετροι 32

Επανεκτίμηση (repeated evaluation) Κάθε πραγματική παράμετρος επανεκτιμάται κάθε φορά που χρησιμοποιείται πηγαίος κώδικας: #define MIN(X,Y) ((X)<(Y)?(X):(Y)) a = MIN(b++,c++); Παράδειγμα μπλεξίματος ονομάτων πηγαίος κώδικας: #define intswap(x,y) {int temp=x; X=Y; Y=temp; int main() { ί int temp = 1, b = 2; intswap(temp, b); printf("%d, %d\n", temp, b); κώδικας μετά την επέκταση: a = ((b++)<(c++)?(b++):(c++)) int main() { κώδικας int temp = 1, b = 2; μετά την επέκταση: {int temp = temp; temp = b; b = temp; ; printf("%d, %d\n", temp, b); Παράμετροι 33 Παράμετροι 34 Μπλέξιμο ονομάτων (name capture) Σ ένα κομμάτι κώδικα, κάθε εμφάνιση μιας μεταβλητής η οποία δεν είναι δεσμευμένη στατικά ονομάζεται ελεύθερη (free) Όταν κάποιο κομμάτι κώδικα μετακινηθεί σε ένα διαφορετικό περιβάλλον, οι ελεύθερες μεταβλητές του μπορεί να δεσμευθούν (become bound) Το φαινόμενο αυτό ονομάζεται capture: Οι ελεύθερες μεταβλητές των πραγματικών παραμέτρων μπορεί να «πιαστούν» (be captured) από ορισμούς μεταβλητών στο σώμα της μακροεντολής Επίσης, μεταβλητές που είναι ελεύθερες στο σώμα της μακροεντολής μπορεί να «πιαστούν» από ορισμούς μεταβλητών της καλούσας μεθόδου Παράμετροι 35 Κλήση κατ όνομα (call by name) Στο πέρασμα παραμέτρων κατ όνομα, κάθε παράμετρος αποτιμάται στο περιβάλλον της καλούσας συνάρτησης, για κάθε χρήση της αντίστοιχης τυπικής παραμέτρου. ρ Δουλεύει όπως η επέκταση μακροεντολών αλλά αποφεύγει το πρόβλημα του name capture Χρησιμοποιήθηκε η στην Algol 60 και στις επεκτάσεις της Σήμερα είναι μη δημοφιλής μέθοδος Παράμετροι 36

Υλοποίηση της κλήσης κατ όνομα Χειριζόμαστε την πραγματική παράμετρο ως μια μικρή ανώνυμη συνάρτηση Όταν η καλούσα μέθοδος χρειαστεί την τιμή της τυπικής παραμέτρου (είτε την rvalue της ή την lvalue της) καλεί τη συνάρτηση για να της την επιστρέψει Η συνάρτηση πρέπει να περαστεί μαζί με το σύνδεσμο φωλιάσματός της (its nesting link), έτσι ώστε να μπορεί να αποτιμηθεί στο περιβάλλον της καλούσας μεθόδου Παράμετροι 37 void f(by-name int a, by-name int b) { b = 6; b = a; int g() { int i = 3; f(i+1, i); return i; Όταν η f αρχίζει την εκτέλεσή της Η συνάρτηση ρη ηgg επιστρέφει 7 i+1 a: i: 3 b: i result:? Παράμετροι 38 Σύγκριση Όπως και στην επέκταση μακροεντολών, οι παράμετροι που περνιούνται κατ όνομα και επανεκτιμώνται κάθε φορά που χρησιμοποιούνται Η παραπάνω ιδιότητα μπορεί να φανεί αρκετά χρήσιμη σε κάποιες περιπτώσεις, όμως στις περισσότερες περιπτώσεις αποτελεί χάσιμο χρόνου Όμως, αντίθετα με την επέκταση μακροεντολών,, η κλήση κατ όνομα αποφεύγει το πρόβλημα του capture Κλήση κατ ανάγκη (call by need) Στο πέρασμα παραμέτρων κατ ανάγκη, κάθε παράμετρος αποτιμάται στο περιβάλλον της καλούσας μεθόδου, τη στιγμή της πρώτης χρήσης της αντίστοιχης τυπικής παραμέτρου. Μετά την αποτίμηση, η τιμή της πραγματικής παραμέτρου αποθηκεύεται (cached), ούτως ώστε περαιτέρω χρήσεις της αντίστοιχης τυπικής παραμέτρου να μη χρειάζονται επανεκτίμηση. Χρησιμοποιείται στις οκνηρές (lazy) συναρτησιακές γλώσσες προγραμματισμού (Miranda, Haskell, Clean) Αποφεύγει το χάσιμο χρόνου λόγω της επανεκτίμησης την οποία πολλές φορές κάνει η κλήση κατ όνομα Παράμετροι 39 Παράμετροι 40

void f(by-need int a, by-need int b) { b = a; b = a; int g() { int i = 3; f(i+1, i); return i; Όταν η f αρχίζει την εκτέλεσή της Η συνάρτηση ρη ηgg επιστρέφει 4 i+1 a: i: 3 b: i result:? Παράμετροι 41 Οκνηρία (laziness) boolean andand(by-need need boolean a, by-need boolean b) { if (!a) return false; else return b; boolean g() { while (true) { return true; void f() { andand(false, g()); Η συνάρτηση andand βραχυκυκλώνει όπως η andalso της ML και ο τελεστής && της Java. Με κλήση κατ ανάγκη η μέθοδος f θα τερματίσει. Το αποτέλεσμα θα ήταν το ίδιο τόσο με κλήση κατ όνομα όσο και με επέκταση μακροεντολών. Παράμετροι 42 Θέματα σχεδιασμού γλωσσών Θέματα Σχεδιασμού Γλωσσών Ερώτηση: Αυτά που εξετάσαμε σχετικά με το πέρασμα παραμέτρων είναι απλώς θέματα υλοποίησης μιας γλώσσας ή είναι και μέρος των προδιαγραφών της; Απάντηση: Εξαρτάται από τη γλώσσα Σε γλώσσες χωρίς παρενέργειες, η τεχνική που χρησιμοποιείται για το πέρασμα παραμέτρων ρ μπορεί να είναι διαφανής και μη ανιχνεύσιμη από τον προγραμματιστή Όμως ακόμα και γλώσσες με παρενέργειες πολλές φορές καθορίζουν μόνο μερικώς την τεχνική περάσματος παραμέτρων που χρησιμοποιείται από τη γλώσσα Παράμετροι 43 Παράμετροι 44

Γλώσσες χωρίς παρενέργειες Ερώτηση: πρέπει οι παράμετροι πάντα να αποτιμούνται (eager evaluation), ή αυτό συμβαίνει μόνο όταν υπάρχει ανάγκη χρήσης των τιμών τους (lazy evaluation); Το παραπάνω είναι μέρος του μοντέλου κόστους της γλώσσας και μπορεί επίσης να χρησιμοποιηθεί από τον προγραμματιστή: Πόσο στοιχίζει η επανεκτίμηση κάποιας τυπικής παραμέτρου; Έχει το πέρασμα παραμέτρων κόστος ανάλογο με το μέγεθος των αντικειμένων (που περιλαμβάνονται στις παραμέτρους); Γλώσσες με παρενέργειες Στις γλώσσες αυτής της κατηγορίας, ένα πρόγραμμα μπορεί να ανιχνεύσει ποια τεχνική περάσματος παραμέτρων χρησιμοποιείται από την υλοποίηση της γλώσσας Όμως αυτό μπορεί να είναι μια λεπτομέρεια υλοποίησης στην οποία τα προγράμματα δεν πρέπει να μπορούν να βασιστούν διότι δεν είναι μέρος της προδιαγραφής της γλώσσας Παράδειγμα τέτοιας γλώσσας είναι η Ada Παράμετροι 45 Παράμετροι 46 Ada modes Τρεις τρόποι (modes) περάσματος παραμέτρων: in: μπορούν να διαβαστούν από την κληθείσα συνάρτηση αλλά δε μπορεί να τους γίνει κάποια ανάθεση με άλλα λόγια συμπεριφέρονται σαν σταθερές out: μπορεί να τους γίνει κάποια ανάθεση αλλά δε μπορούν να διαβαστούν in out: μπορούν τόσο να διαβαστούν όσο και να τους γίνει κάποια ανάθεση Η προδιαγραφή της Ada επίτηδες αφήνει κάποιο περιθώριο για ευελιξία στις υλοποιήσεις της γλώσσας Υλοποιήσεις της Ada Για βαθμωτές παραμέτρους η υλοποίηση γίνεται μέσω αντιγραφής: in = value, out = result, in out = value/result Οι συλλογές αντικειμένων (π.χ. arrays και records) μπορεί να περαστούν κατ αναφορά αντί με αντιγραφή Κάθε πρόγραμμα που μπορεί να ανιχνεύσει τη διαφορά της υλοποίησης (όπως προγράμματα αντίστοιχα με αυτά της σημερινής διάλεξης) είναι μη νόμιμο πρόγραμμα Ada Παράμετροι 47 Παράμετροι 48

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