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

Ξεκίνησε από Καραμαούνας Πολύκαρπος, 10 Φεβ 2020, 01:51:43 ΜΜ

« προηγούμενο - επόμενο »

Καραμαούνας Πολύκαρπος

Υπάρχει καμία επίσημη οδηγία για αυτήν την περίπτωση;
Η Γλωσσομάθεια λανθασμένα, δεν αλλάζει την πραγματική παράμετρο. Θα έπρεπε να της δώσει την τιμή 6.

akalest0s

"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

alkisg

Την τιμή 6, γιατί; Αφού και στο βιβλίο και στις οδηγίες περιγράφεται μηχανισμός αντιγραφής και επιστροφής των τιμών των μεταβλητών και όχι μεταβίβασης διεύθυνσης μνήμης (reference).

Στην αντιγραφή, δημιουργούνται δύο διαφορετικές τοπικές μεταβλητές, δεν είναι references στην ίδια μεταβλητή.
Άρα μόνο μία θα επιστρέψει, είτε η τιμή 2 είτε η τιμή 3.

Τελευταίο bullet εδώ: https://alkisg.mysch.gr/ΓΛΩΣΣΑ/Μεταβίβαση_παραμέτρων/
(ήταν και δυσκολότερο στην υλοποίηση από ότι το by reference...)

akalest0s

Πράγματι περιμένεις 2 ή 3, αλλά η περίπτωση παραμένει απροσδιόριστη.
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

petrosp13

Φαντάζομαι ότι θα αποθηκευτεί τελικά η δεύτερη τιμή σαν τελευταία
Σιγά μην υπάρχει οδηγία για τέτοια λεπτομέρεια...
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

alkisg

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

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

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

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

akalest0s

Μόλις σε πιέσουμε λίγο, τσουπ, το σκας το παραμύθι!  ;D πλάκα κάνω
Αυτές οι επεξηγήσεις για το πως δουλεύει ο διερμηνευτής behind the scenes, είναι πολύ ενδιαφέρουσες.
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

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
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

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), όταν οι μηχανές ήταν πιο απλές και οι προγραμματιστές είχαν άμεση σχέση με το υλικό, οπότε ήταν αναμενόμενο (εικάζω) να έχουν καλύτερη σχέση με τη στοίβα κλήσης παραμέτρων. Ενδεχομένως αυτές οι γλώσσες να μοντελοποιούσαν και τον τρόπο με τον οποίο είχαν ήδη συνηθίσει να δουλευουν απευθείας στο υλικό.

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

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

Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

Καραμαούνας Πολύκαρπος

#10
Με βάση αυτό εδώ: https://opendsa-server.cs.vt.edu/ODSA/Books/PL/html/SLang2ParameterPassing.html
η προσομοίωση του "Call-by-copy-restore (also known as value-result, copy-in-copy-out)" με C δίνει αποτέλεσμα την τιμή 3 διότι το copy-out phase το κάνει από αριστερά προς τα δεξιά

evry

Παναγιώτη μετά αφού το έψαξα περισσότερο βρήκα ότι χρησιμοποιείται και στην Ada. Απλά και η Ada το δανείστηκε από Algol, Fortran. (συγκεκριμένες εκδόσεις έτσι?)
Αυτή νομίζω είναι η κατάλληλη περίπτωση για να μελετήσουμε! (που μας φτάσανε ε? Να διαβάζουμε Ada!!!)
Εκεί όμως χρησιμοποιείται όταν ορίσεις την παράμετρο να είναι in out, δηλαδή και εισόδου και εξόδου.

Στην Ada λοιπόν δοκίμασα το παρακάτω πρόγραμμα:

Κώδικας: ada
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
procedure myprogram is
    X : INTEGER;
    
    procedure test(a, b, c : in out INTEGER) is
    begin
       c := 100;
       a := 10;
       b := 1;
    end test;
    
begin
    X := 2020; 
    test(X, X, X);
    Put(X);
end myprogram;


Μαντέψτε τι μήνυμα μου έβγαλε! ;D ;D ;D
writable actual for "a" overlaps with actual for "b"

Το δοκίμασα στους παρακάτω online compilers
https://www.jdoodle.com/execute-ada-online/
https://www.tutorialspoint.com/compile_ada_online.php

Τουλάχιστον έμαθα και κάποια βασικά για την Ada, που δεν ήξερα  :D
Άρα άμα ξέρεις ΓΛΩΣΣΑ ξέρεις και ..... Ada
Είμαστε πολύ μπροστά τελικά

ΥΓ.
Άσχετο αλλά ψάχνοντας βρήκα το παρακάτω και έπαθα πλάκα! Οι άνθρωποι είναι απίστευτοι! Έχουν φτιάξει ένα εργαλείο που σου παράγει παραδείγματα με visualization διάφορων τρόπων μεταβίβασης παραμέτρων!!
https://opendsa-server.cs.vt.edu/ODSA/Books/PL/html/SLang2ParameterPassing.html
Τελικά δεν βρήκα κάτι χρήσιμο, έκανα το δικό μου, όμως έχουν κάνει καλή δουλειά! Είναι μέρος διαδραστικού βιβλίου (!!!) για γλώσσες προγραμματισμού!
https://opendsa-server.cs.vt.edu/ODSA/Books/PL/html/
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

alkisg

Ευριπίδη το link που παραθέτεις είναι αυτό που παρέθεσε και ο Πολύκαρπος παραπάνω.
Το παράδειγμα που δίνουν για υλοποίηση copy-restore σε C είναι απλό παράδειγμα, δεν νομίζω ότι απαντάει στο ερώτημα.
Είχα κάνει κάτι τεστ το μεσημέρι, αν κατάλαβα καλά, η Ada το 2012 ξεκίνησε να το θεωρεί λάθος όπως λες, ενώ νομίζω ότι παλιότερες εκδόσεις της το έκαναν από αριστερά προς τα δεξιά, και έλεγα να βρω κάποια παλιά Ada να δοκιμάσω να σιγουρευτώ πριν ποστάρω, αλλά δεν ξέρω και κατά πόσο αξίζει τον κόπο. Νομίζω επίσης ότι με το -gnatd.E flag θα ξαναγίνει warning.

https://patchwork.ozlabs.org/patch/283213/
https://stackoverflow.com/questions/20706701/confusion-in-call-by-copy-restore-in-a-special-case

evry

Δεν το πιστεύω! Δεν είδα το μήνυμα του Πολύκαρπου γιατί απαντούσα στον Παναγιώτη, τώρα το βλέπω  :-[
Τι να πω, τέτοια σύμπτωση.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

Καρκαμάνης Γεώργιος

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