Συνάρτηση και στοίβα χρόνου εκτέλεσης .

Ξεκίνησε από ΨΥΛΛΟΣ ΣΩΤΗΡΗΣ, 30 Μαρ 2009, 12:45:39 ΜΜ

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

ΨΥΛΛΟΣ ΣΩΤΗΡΗΣ

Όταν καλούμε συνάρτηση στη στοίβα χρόνου εκτέλεσης αποθηκεύετε η επόμενη διεύθυνση?
Π.χ

   κ.π
12  κ <--φ(χ) + 3
13

Θα αποθηκευτεί το 12 ή το 13

evry

Λογικά όχι γιατί η κλήση της συνάρτησης αποτελεί ουσιαστικά τον υπολογισμό μιας παράστασης. Στη συνέχεια πρέπει να επιστρέψει στο ίδιο σημείο την τιμή που επιστρέφει η συνάρτηση και να εκτελεστεί η εντολή που περιέχει την κλήση της συνάρτησης
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

ΨΥΛΛΟΣ ΣΩΤΗΡΗΣ

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

ntzios kostas

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

P.Tsiotakis

Συμφωνώ με τους προλαλήσαντες.

Πάντως είναι απλή λογική αυτό που λέει ο Ευρυπίδης. Μπορεί να μπει μόνο με διαδικασίες!!

alkisg

Παράθεση από: psilossotiris στις 30 Μαρ 2009, 12:45:39 ΜΜ
Όταν καλούμε συνάρτηση στη στοίβα χρόνου εκτέλεσης αποθηκεύετε η επόμενη διεύθυνση?

Η στοίβα χρόνου εκτέλεσης δεν έχει καμία σχέση με γραμμές ή high level εντολές, άρα δεν αποθηκεύεται ούτε το 12 ούτε το 13.
Αποθηκεύεται η διεύθυνση μνήμης RAM της επόμενης (ή της τρέχουσας) εντολής μηχανής - αυτή συνήθως δείχνεται από κάποιον καταχωρητή (σε αρχιτεκτονική x86 ονομάζεται IP, Instruction Pointer).
Το ίδιο ισχύει και για διαδικασίες και για συναρτήσεις, αφού και οι δύο υλοποιούνται με εντολή call.
Συνήθως αποθηκεύεται η επόμενη θέση μνήμης (επειδή η τρέχουσα μπορεί να έχει μεταβλητό μέγεθος οπότε η ίδια ξέρει καλύτερα πόσο να αυξήσει τον IP) αλλά αυτό δεν είναι και απόλυτο.

Δεν κοίταξα πρόσφατα το σχετικό σημείο θεωρίας για να δω πώς (και αν) αντιστοιχούν στο σχολικό εγχειρίδιο τα παραπάνω. Πάντως αν γράφει για γραμμές κώδικα είναι λάθος.

Neo

 8) ::)
Παράθεση από: alkisg στις 30 Μαρ 2009, 11:35:49 ΜΜ
Παράθεση από: psilossotiris στις 30 Μαρ 2009, 12:45:39 ΜΜ
Όταν καλούμε συνάρτηση στη στοίβα χρόνου εκτέλεσης αποθηκεύετε η επόμενη διεύθυνση?

Η στοίβα χρόνου εκτέλεσης δεν έχει καμία σχέση με γραμμές ή high level εντολές, άρα δεν αποθηκεύεται ούτε το 12 ούτε το 13.
Αποθηκεύεται η διεύθυνση μνήμης RAM της επόμενης (ή της τρέχουσας) εντολής μηχανής - αυτή συνήθως δείχνεται από κάποιον καταχωρητή (σε αρχιτεκτονική x86 ονομάζεται IP, Instruction Pointer).
Το ίδιο ισχύει και για διαδικασίες και για συναρτήσεις, αφού και οι δύο υλοποιούνται με εντολή call.
Συνήθως αποθηκεύεται η επόμενη θέση μνήμης (επειδή η τρέχουσα μπορεί να έχει μεταβλητό μέγεθος οπότε η ίδια ξέρει καλύτερα πόσο να αυξήσει τον IP) αλλά αυτό δεν είναι και απόλυτο.

Δεν κοίταξα πρόσφατα το σχετικό σημείο θεωρίας για να δω πώς (και αν) αντιστοιχούν στο σχολικό εγχειρίδιο τα παραπάνω. Πάντως αν γράφει για γραμμές κώδικα είναι λάθος.
Σταματάκης Μανώλης

evry

Στο βιβλίο μιλάει ξεκάθαρα για την "αμέσως επόμενη διεύθυνση του κυρίου προγράμματος"

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

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

Ποιά κοινή λογική που έλεγα εγώ και ποιά γλώσσα μηχανής που λέει ο Άλκης? αφού το λέει το βιβλίο τελεία και παύλα.

Αυτό που μου αρέσει πάντως με το βιβλίο δεν είναι μόνο ότι έχει αρκετά πράγματα τα οποία δεν ισχύουν στον πραγματικό κόσμο της πληροφορικής αλλά ότι πηγαίνει και κόντρα στην κοινή λογική.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

alkisg

12: α <- ΗΜ(χ) * ΣΥΝ(χ)
13: ...


Η γραμμή 12 αντιστοιχεί σε π.χ. 20 εντολές μηχανής.
Περιέχει δύο κλήσεις συναρτήσεων.
Δεν είναι δυνατόν να αποθηκεύεται η ίδια διεύθυνση στη στοίβα (το 12 ή το 13 στο παραπάνω παράδειγμα) και για τις δύο αυτές κλήσεις.
Θα έπρεπε τουλάχιστον να αποθηκεύεται "διεύθυνση επιστροφής: μετά την πρώτη κλήση συνάρτησης της 12 γραμμής"
ή "διεύθυνση επιστροφής: μετά την δεύτερη κλήση συνάρτησης της 12 γραμμής".

Γι' αυτό λέω ότι δεν υπάρχει αντιστοιχία στοίβας κλήσεων με high level εντολές - αφού μια high level εντολή μπορεί να περιέχει πολλές κλήσεις.
Σύμφωνοι, να στηρίξουμε το διδακτικό πακέτο, αλλά με κάποιο όριο, να μη φτάνουμε στο σημείο να λέμε παράλογες ή ανυπόστατες θεωρίες...

Απλά εννούνται τα παρακάτω έντονα γράμματα:
"Όταν μια διαδικασία ή συνάρτηση καλείται από το κύριο πρόγραμμα, τότε η αμέσως επόμενη διεύθυνση της μνήμης RAM, που αντιστοιχεί στην επόμενη εντολή μηχανής του κυρίου προγράμματος που ονομάζεται διεύθυνση επιστροφής..."
:P :P :P :D :D :D

Καλημέρα σε όλους.

klitos

πιστευω οτι επιστρεφει στην επομενη εντολη για δυο λογους.
1ος λογος: αν επεστρεφε στην ιδια εντολη θα γινοταν παλι κληση της συναρτησης
2ος λογος: Η στοιβα χρονισμου μας λεει ποια ειναι η επομενη εντολη που θα εκτελεστει, θεωρωντας οτι οταν εκτελειται ενα υποπρογραμμα εκτελειται η εντολη του κυριου προγραμματος απο την οποια εγινε η κληση.
Αρα συμπεραινω οτι οταν τελειωνει ενα υποπρογραμμα επιστρεφουν οι τιμες στις παραμετρους και "συνεχιζεται" η εντολη απο την οια εγινε η κληση.
κλητος χατζηγεωργιου

evry

Αφού συνεχίζεται η ίδια εντολή μετά την κλήση, δηλαδή εκτελείται η εντολή εκχώρησης, τότε δεν πηγαίνει στην επομενη εντολή!!

Παράθεση από: klitos στις 08 Μαΐου 2009, 09:31:46 ΠΜ
Αρα συμπεραινω οτι οταν τελειωνει ενα υποπρογραμμα επιστρεφουν οι τιμες στις παραμετρους και "συνεχιζεται" η εντολη απο την οια εγινε η κληση.
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

klitos

ακριβως ετσι ...γιαυτο λεω οτι η επομενη εντολη που θα εκτελεστει ειναι αυτη που ακολουθεί
κλητος χατζηγεωργιου

evry

δεν κατάλαβες τι εννοώ ή δεν το διατύπωσα καλά.
Είπα ότι με το δικό σου σκεπτικό δεν θα πάει στην επόμενη εντολή αλλά θα εκτελέσει εκείνη την εντολή που εκχωρεί την τιμή της συνάρτησης που είναι στο δεξιό μέλος της εντολής εκχώρησης. Αυτή μπορεί να είναι μια εντολή μηχανής, π.χ. STORE A B ή κάτι τέτοιο, άρα σίγουρα δεν πάει στην επόμενη εντολή του κυρίου προγράμματος
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

klitos

ΕΝΤ1
υποπρογραμμα (συναρτηση ή διαδικασια)
ΕΝΤ2

Ναι ετσι...δηλαδη θα παει στην ΕΝΤ2 οταν θα τελειώσει με τις αναθεσεις τιμών (τιμες παραμετρων κλπ), πραξεις κλπ ...δηλαδη συνεχιζει την εντολη απο την οποια εφυγε ....αλλα βεβαια η ΕΠΟΜΕΝΗ εντολή θα ειναι η ΕΝΤ2 (θα επιστρεψει στην ΕΝΤ2 αφου τελειώσει με την τρεχουσα εκκρεμοτητα)
Δινω αυτη την ερμηνεια για να καλυψω το κενο στην απορια ʽαφου εκτελειται η ΕΝΤ2 μετα το τελος του υποπρογραμματος τοτε πως και ποτε επιστρεφουν οι τιμες των παραμετρων; ʽ 
κλητος χατζηγεωργιου

lykos

Κι' όλη η συζήτηση, διότι έχουμε ένα προβληματικό βιβλίο...
Ενα - στην τύχη - απ' το εμπόριο να παίρναν (Pascal, Basic, C, ...), θα είχαμε το χρόνο να συζητάμε για πράγματα ουσίας! (αντί του "τι θέλει να πεί ο ποιητής". Ισως κι' αυτός να μην ξέρει ακριβώς...)

ΥΓ. Ο "ποιητής" δεν φταίει, κι' ούτε - φυσικά - τον γνωρίζω. Ούτε την διαδικασία επιλογής των Σχολ. Βιβλίων γνωρίζω. Απ' ότι φαίνεται όμως, αυτή η επιλογή δημιουργεί προβλήματα.