Γενικό Λύκειο > Διαδικασίες

Κλήση διαδικασίας με ίδιες παραμέτρους

<< < (2/5) > >>

alkisg:
Σίγουρα σχεδιάζοντας μια θεωρητική γλώσσα σε χαρτί δεν μπορεί κανείς να προβλέψει όλες τις λεπτομέρειες που θα χρειαστεί να αποσαφηνιστούν κατά την υλοποίηση.

Στο συγκεκριμένο, προσωπικά σκέφτηκα ως εξής: είναι πιο φυσιολογικό να μπουν οι παράμετροι από τα αριστερά προς τα δεξιά, όπως και στην ιεραρχία των πράξεων κλπ. Για παράδειγμα, αν είχαμε π.χ. ΚΑΛΕΣΕ ΔιαδικασίαΔ(ΣυνάρτησηΑ(α), ΣυνάρτησηΒ(β)), και κάναμε πίνακα τιμών, θα θέλαμε να εκτελεστεί πρώτα η κλήση της συνάρτησης Α και μετά της συνάρτησης Β.

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

Γι' αυτό και στο Διερμηνευτή η τελική τιμή είναι 2...

akalest0s:
Μόλις σε πιέσουμε λίγο, τσουπ, το σκας το παραμύθι!  ;D πλάκα κάνω
Αυτές οι επεξηγήσεις για το πως δουλεύει ο διερμηνευτής behind the scenes, είναι πολύ ενδιαφέρουσες.

evry:
Είχα παρουσιάσει κάποτε μια εργασία/έρευνα σχετικά με το θέμα αυτό.
Με είχε απασχολήσει το θέμα από διδακτικής σκοπιάς. Δηλαδή ποια θα ήταν η σκέψη των μαθητών όταν δουν κάτι τέτοιο.
Σε αυτή την περίπτωση αυτό που έχει σημασία είναι η μεταβλητή που λαμβάνει τελευταία τιμή να μην είναι τελευταία και στη λίστα παραμέτρων, γιατί είχα υποθέσει ότι οι μαθητές θα θεωρήσουν ότι η μεταβίβαση παραμέτρων θα γίνει από αριστερά προς τα δεξιά αφού δεν ξέρουν ότι υλοποιείται με στοίβα. π.χ. σε ένα παράδειγμα όπως το παρακάτω:

--- Κώδικας: Javascript ---.....Α <- 1ΚΑΛΕΣΕ ΤΕΣΤ(Α, Α, Α)ΓΡΑΨΕ Α.......... ΔΙΑΔΙΚΑΣΙΑ ΤΕΣΤ(X, Y, Z)ΜΕΤΑΒΛΗΤΕΣ    ΑΚΕΡΑΙΕΣ:ΑΡΧΗ     Ζ <- Ζ+ 3     Υ <- Υ + 2     Χ <- Χ + 1ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ
Το ερώτημα ήταν ποιος τρόπος μεταβίβασης παραμέτρων είναι πιο κοντά στο common sense των μαθητών: by reference ή κάτι άλλο;

Η εργασία είναι στον παρακάτω σύνδεσμο
http://dide.ilei.sch.gr/keplinet/education/docs/syn_syrou2007_vraxnos.pdf

alkisg:
Ξαναέψαξα λίγο στη Wikipedia για να δω πώς αναφέρεται αυτός ο μηχανισμός στη βιβλιογραφία:


--- Παράθεση από: https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_copy-restore ---Call by copy-restore—also known as "copy-in copy-out", "call by value result", "call by value return"

--- Τέλος παράθεσης ---

Εκεί αναφέρει ότι χρησιμοποιείται σπάνια, το οποίο είναι προφανές αφού χρειάζεται ένα σωρό malloc() και memcpy() οπότε είναι μη αποδοτικός.
Όμως χρειάζεται σε περιπτώσεις όπως multiprocessing και remote procedure call όπου η διαδικασία που καλείται μπορεί να μην έχει καν πρόσβαση στη RAM του καλώντος.

Αναφέρεται μάλιστα και στην συγκεκριμένη περίπτωση που συζητάμε:


--- Παράθεση από: https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_copy-restore ---Under call by reference, writing to one will affect the other; call by copy-restore avoids this by giving the function distinct copies, but leaves the result in the caller's environment undefined depending on which of the aliased arguments is copied back first—will the copies be made in left-to-right order both on entry and on return?

--- Τέλος παράθεσης ---

pgrontas:
Πολύ ενδιαφέρουσα συζήτηση.
Ειλικρινά περίμενα ότι ο Διερμηνευτής θα βγάλει 3.

--- Παράθεση από: alkisg στις 10 Φεβ 2020, 07:17:34 μμ ---Σίγουρα σχεδιάζοντας μια θεωρητική γλώσσα σε χαρτί δεν μπορεί κανείς να προβλέψει όλες τις λεπτομέρειες που θα χρειαστεί να αποσαφηνιστούν κατά την υλοποίηση.

Στο συγκεκριμένο, προσωπικά σκέφτηκα ως εξής: είναι πιο φυσιολογικό να μπουν οι παράμετροι από τα αριστερά προς τα δεξιά, όπως και στην ιεραρχία των πράξεων κλπ. Για παράδειγμα, αν είχαμε π.χ. ΚΑΛΕΣΕ ΔιαδικασίαΔ(ΣυνάρτησηΑ(α), ΣυνάρτησηΒ(β)), και κάναμε πίνακα τιμών, θα θέλαμε να εκτελεστεί πρώτα η κλήση της συνάρτησης Α και μετά της συνάρτησης Β.

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

Γι' αυτό και στο Διερμηνευτή η τελική τιμή είναι 2...

--- Τέλος παράθεσης ---
Αυτό που καταλαβαίνω είναι ότι το πρόβλημα δεν υπάρχει μόνο στο μάθημα, αλλά σε όλες τις γλώσσες που χρησιμοποιούν αυτό τον μηχανισμό μεταβίβασης. Γνωρίζει κάποιος αν υπήρχε κάποιος τρόπος να αντιμετωπιστεί αυτό το πρόβλημα εκεί;
(edit: Ενώ πληκτρολογούσα έγραψε και ο Άλκης μήνυμα που εν μέρει απαντά.)

Με μια σύντομη ματιά στην εργασία του Ευριπίδη βλέπω ότι αφορά παλιές γλώσσες (ALGOL, Fortran), όταν οι μηχανές ήταν πιο απλές και οι προγραμματιστές είχαν άμεση σχέση με το υλικό, οπότε ήταν αναμενόμενο (εικάζω) να έχουν καλύτερη σχέση με τη στοίβα κλήσης παραμέτρων. Ενδεχομένως αυτές οι γλώσσες να μοντελοποιούσαν και τον τρόπο με τον οποίο είχαν ήδη συνηθίσει να δουλευουν απευθείας στο υλικό.

Όμως θεωρώ ότι  σήμερα κάτι τέτοιο είναι κακό όχι μόνο για τους μαθητές, αλλά και για τους προγραμματιστές. Η κλήση παραμέτρων από αριστερά στα δεξιά, δημιουργεί μια αφαίρεση, ένα μοντέλο, όπου έχει στόχο να θυμίσει την ανάγνωση κειμένου, όπου ό,τι βρίσκεται δεξιά ακολουθεί χρονικά. Η χρήση στοίβας χαλάει αυτή την αφαίρεση. Στην εποχή μας που έχουμε απομακρυνθεί από την μηχανή, κάτι τέτοιο είναι εντελώς εκτός διαίσθησης.

Τέλος πάντων ήδη έγραψα πολλά, δεν θεωρώ ότι κάποιος θα χρησιμοποιήσει αυτό τον τρόπο για να κάνει κάτι πραγματικά χρήσιμο. Μάλλον πρόκειται περί νοητικής άσκησης.

Πλοήγηση

[0] Λίστα μηνυμάτων

[#] Επόμενη σελίδα

[*] Προηγούμενη σελίδα

Μετάβαση στην πλήρη έκδοση