Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Εισαγωγή στον Προγ/μό Η/Υ Ενότητα 8: Αντικείμενα και Μνήμη Διδάσκων: Μιχάλης Τίτσιας.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Εισαγωγή στον Προγ/μό Η/Υ Ενότητα 8: Αντικείμενα και Μνήμη Διδάσκων: Μιχάλης Τίτσιας."— Μεταγράφημα παρουσίασης:

1 Εισαγωγή στον Προγ/μό Η/Υ Ενότητα 8: Αντικείμενα και Μνήμη Διδάσκων: Μιχάλης Τίτσιας

2 Περιεχόμενα Η δομή της μνήμης Η εκχώρηση μνήμης στις μεταβλητές Αρχέγονοι τύποι και αντικείμενα Συνδέοντας αντικείμενα μεταξύ τους

3 Δυαδική μορφή Το δεξιότερο ψηφίο είναι η μονάδα. Το επόμενο δίνει τον αριθμό των 2. Το επόμενο δίνει τον αριθμό των 4. Και ούτω καθεξής.. Τα Bytes και τα words μπορούν να χρησιμοποιηθούν για να αντιπροσωπεύσουν ακέραιους διαφορετικών μεγεθών με την ερμηνεία των bits ως αριθμό σε δυαδική μορφή. 0 x = x = x = x = x = x = 32 0 x = x = H δυαδική είναι παρόμοια με την δεκαδική μορφή, αλλά χρησιμοποιεί διαφορετική βάση. Οι δεκαδικοί αριθμοί έχουν το 10 ως βάση, που σημαίνει ότι κάθε ψηφίο αξίζει δέκα φορές όσο το ψηφίο στα δεξιά του. Η Δυαδική χρησιμοποιεί βάση 2, που σημαίνει ότι κάθε θέση αξίζει το διπλάσιο:

4 Η δομή της μνήμης Η θεμελιώδης μονάδα της μνήμης σε έναν υπολογιστή ονομάζεται bit, το οποίο είναι μια σύντμηση του binary digit. Ένα bit μπορεί να είναι σε μια από δύο καταστάσεις, που συνήθως συμβολίζονται με 0 και 1. Οι αριθμοί αποθηκεύονται σε ακόμα μεγαλύτερες μονάδες που αποτελούνται από πολλαπλά bytes. Η μονάδα που αντιπροσωπεύει το πιο κοινό ακέραιο μέγεθος για ένα συγκεκριμένο υλικό ονομάζεται word. Επειδή οι μηχανές έχουν διαφορετικές αρχιτεκτονικές, ο αριθμός των bytes σε ένα word μπορεί να διαφέρει από μηχανή σε μηχανή Η δομή του υλικού του υπολογιστή συνδυάζει επιμέρους bits σε μεγαλύτερες μονάδες. Στις περισσότερες αρχιτεκτονικές, η μικρότερη μονάδα είναι μια ακολουθία οκτώ διαδοχικών δυαδικών ψηφίων που ονομάζεται byte. Το παρακάτω διάγραμμα δείχνει ένα byte που περιέχει ένα συνδυασμό από 0 και 1:

5 Αριθμοί και Βάσεις Ο υπολογισμός στο τέλος της προηγούμενης διαφάνειας δείχνει ότι η δυαδική αναπαράσταση είναι ισοδύναμη με τον αριθμό 42. Όταν χρειάζεται να γίνει διάκριση της βάσης, θα χρησιμοποιούμε ένα μικρό δείκτη, όπως εδώ : = Αν και είναι χρήσιμο να μπορείτε να μετατρέψετε έναν αριθμό από τη μία βάση σε άλλη, είναι σημαντικό να θυμάστε ότι ο αριθμός είναι ο ίδιος. Αυτό που αλλάζει είναι το πώς γράφεται. Ο αριθμός 42 είναι αυτό που θα βρείτε αν μετρήστε τα αστέρια στα δεξιά. Ο αριθμός είναι ο ίδιος αν θα το γράψετε ως σαράντα δύο, ή ως 42, ή ως Οι αριθμοί δεν έχουν βάσεις. Οι αναπαραστάσεις τους έχουν.

6 Οκταδική και δεκαεξαδική γραφή Επειδή η δυαδική μορφή τείνει να είναι αρκετά μακριά, οι Πληροφορικοι προτιμούν συχνά οκταδικούς (βάση 8) ή δεκαεξαδικούς (βάση 16) συμβολισμούς. Η οκταδική γραφή χρησιμοποιεί οκτώ ψηφία: 0 έως 7. Η Δεκαεξαδική γραφή χρησιμοποιεί δεκαέξι ψηφία: 0 έως 9, ακολουθούμενο από τα γράμματα Α έως F για τις τιμές 10 έως 15. Τα παρακάτω διαγράμματα δείχνουν τον αριθμό σαράντα δύο σε οκταδική και δεκαεξαδική γραφή: 2 x = x = x = x = A 42 οκταδικήδεκαεξαδική Το πλεονέκτημα της χρήσης οκταδικής ή δεκαεξαδικής γραφής είναι ότι είναι εύκολο να μεταφράσουμε τον αριθμό σε bits, επειδή μπορείτε να μετατρέψετε κάθε ψηφίο χωριστά.

7 Ασκήσεις: Βάσεις Αριθμών Ποια είναι η δεκαδική τιμή κάθε ενός από τους αριθμούς? AD 16 1 x = x = 0 2 = 0 4 = x = x = 7 1 = x = x = x = AD Ως μέρος του κώδικα προσδιορισμού του τύπου αρχείου, κάθε εκτελέσιμο αρχείο Java ξεκινά με αυτά τα δεκαέξι bits: Πώς θα γραφόταν ο αριθμός στο δεκαεξαδικό σύστημα? AFE CAFE

8 Μνήμη και Διευθύνσεις Κάθε byte στην μνήμη ενός Η/Υ προσδιορίζεται από μια αριθμητική διεύθυνση. Οι διευθύνσεις αρχίζουν στις 0 και εκτείνονται μέχρι τον αριθμό των διαθέσιμων bytes, όπως φαίνεται δεξιά. Σε αυτές τις διαφάνειες, οι διευθύνσεις μνήμης εμφανίζονται ως τετραψήφιοι δεκαεξαδικοί αριθμοί, που τις κάνει εύκολα αναγνωρίσιμες. Στη Java, είναι αδύνατο να προσδιοριστεί η διεύθυνση ενός αντικειμένου. Οι διευθύνσεις μνήμης που χρησιμοποιούνται στα παραδείγματα έχουν ως εκ τούτου επιλεγεί αυθαίρετα. Διαγράμματα μνήμης από επιμέρους bytes δεν είναι τόσο χρήσιμα όσο αυτά που είναι οργανωμένα σε λέξεις. Το αναθεωρημένο διάγραμμα στα δεξιά περιλαμβάνει τώρα τέσσερα bytes σε κάθε κύτταρο μνήμης, που σημαίνει ότι οι αριθμοί διευθύνσεων αυξάνονται κατά τέσσερα κάθε φορά A 000B FFF4 FFF5 FFF6 FFF7 FFF8 FFF9 FFFA FFFB FFFC FFFD FFFE FFFF C C C FFD0 FFD4 FFD8 FFDC FFE0 FFE4 FFE8 FFEC FFF0 FFF4 FFF8 FFFC

9 Η εκχώρηση μνήμης στις μεταβλητές Όταν δηλώνετε μια μεταβλητή σε ένα πρόγραμμα, η Java διαθέτει χώρο για την εν λόγω μεταβλητή από μία από τις πολλές περιοχές μνήμης. Μία περιοχή μνήμης δεσμεύεται για μεταβλητές που δεν δημιουργούνται ή καταστρέφονται ποτέ όσο τρέχει ένα πρόγραμμα, όπως οι σταθερές και άλλες μεταβλητές τάξεων. Αυτές οι πληροφορίες ονομάζονται στατικά δεδομένα. στατικά δεδομένα 0000 στοίβα\ FFFF Κάθε φορά που θα καλείτε μια μέθοδο, η Java διαθέτει ένα νέο μπλοκ μνήμης που ονομάζεται πλαίσιο στοίβας για να κρατήσει τις τοπικές μεταβλητές. Αυτά δημιουργούνται σε μια περιοχή της μνήμης που ονομάζεται στοίβα. Όποτε δημιουργείτε ένα νέο αντικείμενο, η Java διαθέτει χώρο από τον σωρό. σωρός Στις κλασσικές αρχιτεκτονικές, στοίβα και σωρός μεγαλώνουν το ένα προς το άλλο για τη μεγιστοποίηση του διαθέσιμου χώρου.

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

11 Αναφορές σε αντικείμενα Εσωτερικά, η Java προσδιορίζει ένα αντικείμενο από τη διεύθυνσή του στη μνήμη. Αυτή η διεύθυνση ονομάζεται αναφορά stack 1000 r1 FFFC Η τοπική μεταβλητή r1 κατανέμεται στο τρέχον πλαίσιο στοίβας (stack) και της αποδίδεται η τιμή 1000, που προσδιορίζει το αντικείμενο. Η επόμενη διαφάνεια δείχνει την εκτέλεση του προγράμματος TestRational του κεφαλαίου 6 με την χρήση διαγράμματος σωρού-στοίβας. Rational r1 = new Rational(1, 2); heap 2 den 1 num διαθέτει χώρο στον σωρό (heap) για ένα νέο αντικείμενο Rational. Για παράδειγμα, θεωρείστε ότι το αντικείμενο έχει δημιουργηθεί στη διεύθυνση Π.χ. όταν Java αξιολογεί τη δήλωση

12 Ένα πλήρες διάγραμμα Heap-Stack skip simulation a b c sum FFFC FFF8 FFF4 FFF0 FFEC C TestRational stack Προσωρινό αντικείμενο που χρησιμοποιείται μόνο κατά τη διάρκεια του υπολογισμού 1/2 + 1/3 + 1/6 = 1 public void run() { Rational a = new Rational(1, 2); Rational b = new Rational(1, 3); Rational c = new Rational(1, 6); Rational sum = a.add(b).add(c); println(a + " + " + b + " + " + c + " = " + sum); } 1 den 1 num 6 den 5 num 6 den 1 num 3 den 1 num 2 den 1 num public Rational add(Rational r) { return new Rational( this.num * r.den + r.num * this.den, this.den * r.den ); } public Rational add(Rational r) { return new Rational( this.num * r.den + r.num * this.den, this.den * r.den ); } 36 heap C C C C this r FFE8 FFE4 FFE C Αυτό το πλαίσιο στοίβας Δημιουργείται για την run. Αυτό το πλαίσιο στοίβας Δημιουργείται για την add. Όλα τα αντικείμενα δημιουργούνται στο σωρό. TestRational 1/2 + 1/3 + 1/6 = 1 public void run() { Rational a = new Rational(1, 2); Rational b = new Rational(1, 3); Rational c = new Rational(1, 6); Rational sum = a.add(b).add(c); println(a + " + " + b + " + " + c + " = " + sum); } 1 den 1 num 6 den 5 num 6 den 1 num 3 den 1 num 2 den 1 num heapstack a b c sum FFFC FFF8 FFF4 FFF0 FFEC C C C C

13 Το μοντέλο δεικτών 1 den 1 num 6 den 5 num 6 den 1 num 3 den 1 num 2 den 1 num heapstack a b c sum FFFC FFF8 FFF4 FFF0 FFEC C C C C Το διάγραμμα σωρού-στοίβας κάτω αριστερά δείχνει την κατάσταση της μνήμης στο τέλος της TestRational. Το διάγραμμα κάτω δεξιά δείχνει ακριβώς την ίδια κατάσταση χρησιμοποιώντας βέλη αντί για αριθμητικές διευθύνσεις. Αυτό το διάγραμμα λέγεται ότι χρησιμοποιεί το μοντέλο δείκτών. 1 den 1 num 6 den 5 num 6 den 1 num 3 den 1 num 2 den 1 num a b c sum heapstack

14 Διευθύνσεις και Δείκτες 1 den 1 num 6 den 5 num 6 den 1 num 3 den 1 num 2 den 1 num heapstack a b c sum FFFC FFF8 FFF4 FFF0 FFEC C C C C Οι δύο τύποι διαγραμμάτων σωρού-στοίβας (τα μοντέλα διευθύνσεων και δεικτών) περιγράφουν ακριβώς την ίδια κατάσταση μνήμης. Τα μοντέλα, ωστόσο, τονίζουν διαφορετικά πράγματα:: –Το μοντέλο διευθύνσεων, ότι οι αναφορές έχουν αριθμητικές τιμές. 1 den 1 num 6 den 5 num 6 den 1 num 3 den 1 num 2 den 1 num a b c sum heapstack –Το μοντέλο δείκτη τη σχέση μεταξύ της αναφοράς και αντικειμένου κάνοντας το διάγραμμα πιο εύκολο να διαβαστεί.

15 Συλλογή Απορριμμάτων Ένα γεγονός που το μοντέλο δείκτη καθιστά σαφές είναι ότι δεν υπάρχουν πλέον αναφορές στην Rational τιμή 5/6. Η τιμή αυτή έχει γίνει πλέον απόρριμμα. Από καιρό σε καιρό η Java περνά μέσα από το σωρό για να απελευθερώνει τα απορρίμματα. Αυτή η διαδικασία ονομάζεται συλλογή απορριμμάτων. 1 den 1 num 6 den 5 num 6 den 1 num 3 den 1 num 2 den 1 num a b c sum heapstack Το αντικείμενο αυτό χρησιμοποιήθηκε για να κρατήσει μια προσωρινή μεταβλητή και δεν είναι πλέον προσβάσιμο.

16 Άσκηση: διαγράμματα σωρού-στοίβας public void run() { Point p1 = new Point(0, 0); Point p2 = new Point(200, 200); Line line = new Line(p1, p2); } public class Point { public Point(int x, int y) { cx = x; cy = y; }... other methods appear here... private int cx; private int cy; } Υποθέστε ότι οι τάξεις Point και Line ορίζονται ως εξής: public class Line { public Line(Point p1, Point p2) { start = p1; finish = p2; }... other methods appear here... private Point start; private Point finish; } Σχεδιάστε ένα διάγραμμα σωρού-στοίβας που να δείχνει την κατάσταση της μνήμης ακριβώς πριν η μέθοδος run επιστρέψει

17 Λύση: διαγράμματα σωρού-στοίβας 100C finish 1000 start 200 cy 200 cx 0 cy 0 cx heap stack p1 p2 line FFFC FFF8 FFF4 FFF C C C finish start 200 cy 200 cx 0 cy 0 cx p1 p2 line heapstack Address ModelPointer Model

18 Αρχέγονοι τύποι και αντικείμενα Με την πρώτη ματιά, οι κανόνες της Java για την χρήση αντικείμενων ως ορίσματα φαίνεται να διαφέρουν από τους κανόνες για ορίσματα που είναι αρχέγονοι τύποι Όταν περνάτε ένα όρισμα αρχέγονου τύπου σε μια μέθοδο, η Java αντιγράφει την τιμή του στην παράμετρο. Ως αποτέλεσμα, οι αλλαγές στη παράμετρο δεν έχουν καμία επίδραση στο όρισμα. Όταν περνάτε ένα αντικείμενο ως όρισμα φαίνεται να υπάρχει κάποια μορφή κοινοκτημοσύνης. Παρότι η αλλαγή της ίδιας της παραμέτρου δεν έχει κανένα αποτέλεσμα, τυχόν αλλαγές που κάνετε στις μεταβλητές εντός του αντικείμενου, έχουν μόνιμη επίδραση στο αντικείμενο Τα διαγράμματα σωρού-στοίβας κάνουν τον λόγο για αυτή τη φαινομενική ασυμμετρία σαφή. Όταν περνάτε ένα αντικείμενο σε μια μέθοδο η Java αντιγράφει την αναφορά, αλλά όχι το ίδιο το αντικείμενο.

19 Παράδειγμα «κοινοκτημοσύνης» των αντικειμένων public void run() { Counter c1 = new Counter(10); Counter c2 = new Counter(); println(c1.value); println(c2.value); c2 = c1; println(c1.value); println(c2.value); c1.increase(); println(c1.value); println(c2.value); } Η τελευταία εντολή println(c2.value) θα τυπώσει 12 και όχι 10!

20 Wrapper Τάξεις Οι σχεδιαστές της Java επέλεξαν να διαχωρίσουν τους αρχέγονους τύπους από την ιεραρχία κλάσεων για λόγους αποδοτικότητας. Οι αρχέγονοι τύποι πιάνουν λιγότερο χώρο και επιτρέπουν στην Java να χρησιμοποιεί περισσότερο τις δυνατότητες που παρέχονται από το υλικό. Ακόμα κι έτσι, υπάρχουν στιγμές όπου το ότι οι αρχέγονοι τύποι δεν είναι αντικείμενα είναι εμπόδιο. Υπάρχουν πολλά εργαλεία στις βιβλιοθήκες της Java, που λειτουργούν μόνο με αντικείμενα. Για να ξεπεράσει αυτό το πρόβλημα, η Java περιλαμβάνει μια κατηγορία wrapper τάξεων που αντιστοιχούν σε καθένα από τους αρχέγονους τύπους : booleanBoolean byteByte charCharacter doubleDouble floatFloat intInteger longLong shortShort

21 Χρησιμοποιώντας Wrapper τάξεις Μπορείτε να δημιουργήσετε ένα στιγμιότυπο μιας Wrapper κλάσης καλώντας τον κατασκευαστή της με την αρχέγονη τιμή. Για παράδειγμα η γραμμή, Integer five = new Integer(5); heap δημιουργεί ένα αντικείμενο Integer που περιέχει την τιμή 5 : stack 1000 five FFFC Η αποθηκευμένη στη μεταβλητή five τιμή είναι αντικείμενο, και μπορείτε να το χρησιμοποιήσετε οπουδήποτε απαιτούνται αντικείμενα. Για καθεμία από τις wrapper κλάσεις, η Java καθορίζει μια μέθοδο για να ανακτά την αρχέγονη αξία, όπως παρακάτω : int underlyingValue = five.intValue();

22 Boxing και Unboxing Από την έκδοση 5.0 η Java μετατρέπει αυτόματα τις τιμές ανάμεσα σε ένα αρχέγονο τύπο και την αντίστοιχη τάξη. Για παράδειγμα, εάν γράψετε: Integer five = 5; Η Java θα καλέσει αυτόματα τον κατασκευαστή Integer. Αυτές οι λειτουργίες ονομάζονται boxing και unboxing. Ομοίως, αν στη συνέχεια γράψετε int six = five + 1; η Java θα καλέσει την intValue πριν την πρόσθεση Παρά το γεγονός ότι τα boxing and unboxing μπορεί να είναι βολικά, τα χαρακτηριστικά αυτά μπορεί να δημιουργήσουν σύγχυση και θα πρέπει να χρησιμοποιούνται με προσοχή.

23 Συνδέοντας μαζί αντικείμενα Oι αναφορές είναι ιδιαίτερα σημαντικές στην επιστήμη των υπολογιστών, επειδή επιτρέπουν την αποτύπωση σχέσεων μεταξύ αντικειμένων μέσω της σύνδεσής τους με διάφορους τρόπους. link data Ένα σύνηθες παράδειγμα ονομάζεται συνδεδεμένη λίστα, όπου κάθε αντικείμενο έχει μια αναφορά σε εκείνο που το ακολουθεί : link data link data null link data H Java σηματοδοτεί το τέλος της λίστας με τη σταθερά null, η οποία σηματοδοτεί μια αναφορά που δεν οδηγεί σε ένα πραγματικό αντικείμενο.

24 Οι φάροι της Gondor Minas TirithAmon DînEilenachNardolErelasMin-RimmonCalenhadHalifirienRohan Απαντώντας ο Gandalf φώναξε δυνατά στο άλογό του. "Πάμε, Shadowfax! Πρέπει να επιταχύνουμε. Ο χρόνος είναι περιορισμένος. Δες! Οι φάροι της Gondor είναι αναμμένοι ζητώντας βοήθεια. Ο Πόλεμος έχει ανάψει. Βλέπε, υπάρχει φωτιά στο Amon Dîn, και φλόγα στο Eilenach; Και πηγαίνουν δυτικά: Nardol, Erelas, Min-Rimmon, Calenhad, και Halifirien στα σύνορα του Rohan.” —J. R. R. Tolkien, The Return of the King, 1955 Σε μια σκηνή στην «Επιστροφή του βασιλιά», η Rohan μαθαίνει για τον κίνδυνο στην Gondor από μια σειρά φάρων που ανάβουν στις κορυφές των βουνών. Αυτή η σκηνή είναι ένα τέλειο παράδειγμα της ανταλλαγής μηνυμάτων σε μια συνδεδεμένη λίστα.

25 T.signal(); public class SignalTower { /* Constructs a new signal tower */ public SignalTower(String name, SignalTower link) { towerName = name; nextTower = link; } /* * Signals this tower and passes the * message along to the next one. */ public void signal() { lightCurrentTower(); if (nextTower != null) { nextTower.signal(); } /* Marks this tower as lit */ public void lightCurrentTower() {... code to draw a fire on this tower... } /* Private instance variables */ private String towerName; private SignalTower nextTower; } Για να εκφράσετε αυτήν την εικόνα, μπορείτε να χρησιμοποιήσετε έναν ορισμό όπως αυτός στα δεξιά. Minas Tirith Amon Dîn Eilenach Nardol Erelas Min-Rimmon Calenhad Halifirien Rohan null Μπορείτε να αρχικοποιήσετε μια αλυσίδα SignalTower, έτσι Καλώντας την signal στον πρώτο πύργο στέλνετε το μήνυμα μέσω της αλυσίδας.

26 Διάβασμα για το σπίτι Κεφάλαιο 7 από «Η Τέχνη και Επιστήμη της JAVA: Μια εισαγωγή στην Επιστήμη των Υεπολογιστών», E. Roberts


Κατέβασμα ppt "Εισαγωγή στον Προγ/μό Η/Υ Ενότητα 8: Αντικείμενα και Μνήμη Διδάσκων: Μιχάλης Τίτσιας."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google