Μία πρόταση...

Ξεκίνησε από epsilonXi, 16 Απρ 2018, 03:30:57 ΜΜ

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

epsilonXi

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

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

ναι μεν δεν είναι τόσο τραγική, όσο προ ετών εκείνη στις πανελλαδικές που έλεγε ότι «σκοπός της ταξινόμησης είναι να διευκολύνει την αναζήτηση», αλλά γιατί να υπάρχει αυτή η πρόταση, και γιατί κάποιος να τη χρησιμοποιήσει σε ένα θέμα Σ-Λ;

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

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

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

από 'κει και πέρα, με ενοχλεί η όποια προσκόλληση στο «γράμμα» αντί για το «πνεύμα»

αυτά, καλησπέρα σας

tsabatman

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

soc_h

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

tsabatman

Παράθεση από: soc_h στις 24 Απρ 2018, 03:10:38 ΜΜ
Από που προκύπτει ότι ο μεταγλωττιστής καθορίζει τις διευθύνσεις μνήμης των μεταβλητών;
Κατά την δήλωση π.χ. «int a;» ο μεταγλωττιστής ψάχνει και βρίσκει 4 συνεχόμενες θέσεις μνήμης στη RAM,
Από σημειώσεις τμήματος ηλεκτρονικων  μηχ.

dski

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

soc_h

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

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

itt

Παράθεση από: soc_h στις 26 Απρ 2018, 08:57:56 ΜΜ
Η διαδικασία της μεταγλώττισης γίνεται στον ΗΥ του προγραμματιστή.
Η φόρτωση στη μνήμη του προγράμματος και η εκχώρηση της απαιτούμενης μνήμης για την εκτέλεσή του γίνεται με ευθύνη του ΛΣ στον ΗΥ του χρήστη που εκτελεί το πρόγραμμα.
Από που και ως που ο μεταγλωττιστής μπορεί να αποφασίσει για διευθυνσιοδότηση μνήμης, μιας μηχανής που δε γνωρίζει το περιβάλλον, πόσες διεργασίες είναι φορτωμένες, πόση είναι η συνολική μνήμη, πόση είναι η ελεύθερη κ.λπ.;

Πάντως στο βιβλίο το αναγράφει πως "Οι μεταβλητές που χρησιμοποιούνται σε ένα πρόγραμμα αντιστοιχούνται από το μεταγλωττιστή σε συγκεκριμένες θέσεις μνήμης του υπολογιστή".

Τα περισσότερα λειτουργικά, εκτός από memory-constrained embedded συστήματα, χρησιμοποιούν virtual memory οπότε υπάρχουν safe assumptions που μπορείς να κάνεις σχετικά με τη μνήμη σου (από το perspective του compiler). Επίσης η "διευθυνσιοδότηση μνήμης" μιας μεταβλητής γίνεται πάντα σε stack space, οπότε και ο compiler απλά θα κάνει increment τον stack pointer για να κάνει allocate χώρο τη μεταβλητή και για να την προσπελάσει χρησιμοποιεί τον frame pointer. Ακόμα και στην περίπτωση dynamic allocation, ο pointer* per se που χρησιμοποιεις βρίσκεται στο stack, οπότε ισχύει το ίδιο scheme με πάνω.


* Oι pointers που έγραφα πριν, είναι ουσιαστικά registers (esp+ebp) ενώ εδώ με το "pointer" αναφέρομαι σε αυτό που θα ονόμαζε κανείς pointer στη C.

alkisg

Εδώ και κάποια χρόνια οι στατικές διευθύνσεις σε virtual memory δεν είναι επιθυμητές λόγω κάποιων γνωστών τεχνικών malware, και οι compilers παράγουν κατάλληλο κώδικα ώστε το λειτουργικό να μπορεί να φορτώσει όχι μόνο τις μεταβλητές αλλά και τον ίδιο τον κώδικα σε τυχαίες θέσεις.
https://en.wikipedia.org/wiki/Position-independent_code
https://wiki.debian.org/Hardening#DEB_BUILD_HARDENING_PIE_.28gcc.2Fg.2B-.2B-_-fPIE_-pie.29

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

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

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

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

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