1. Ξεκινώντας. 1.1 Τι είναι η Java. PDF created with FinePrint pdffactory Pro trial version

Σχετικά έγγραφα
Αντικειμενοστρεφής Προγραμματισμός

B. Ενσωμάτωση Ιθαγενών Μεθόδων

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Αντικειμενοστρεφής Προγραμματισμός

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

Δημιουργία μιας εφαρμογής Java με το NetBeans

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 26/2/2008

2.1 Αντικειµενοστρεφής προγραµµατισµός

Ειδικά Θέματα Προγραμματισμού

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Κλάσεις και Αντικείµενα

Δομημένος Προγραμματισμός

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #1 ο : Εισαγωγή στο Περιβάλλον Ανάπτυξης (IDE)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #1 ο : Εισαγωγή στο Περιβάλλον Ανάπτυξης (IDE)

Οντοκεντρικός Προγραμματισμός

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

03 Η ιδεατή μηχανή της Java

Η γλώσσα προγραμματισμού C

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝΩ ΤΕΧΝΟΛΟΓΙΚΗΣ ΚΑΤΕΥΘΥΝΣΗΣ Γ ΛΥΚΕΙΟΥ

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Η ιδεατή μηχανή της Java

Αντικειµενοστρεφής Προγραµµατισµός

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

05β Η ιδεατή μηχανή της Java

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

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

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΕΙΔΗ,ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙ- ΣΜΟΥ

Διάλεξη 1: Αντικειμενοστρεφής Προγραμματισμός -Εισαγωγή. Διδάσκων: Παναγιώτης Ανδρέου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Βασικά Στοιχεία της Java

Είναι μια αλληλουχία κατάλληλων οδηγιών(εντολών) που εκτελεί ο υπολογιστής για την επίλυση ενός προβλήματος.

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 1: Εισαγωγικές έννοιες

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Διαδικασιακός Προγραμματισμός

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

ΔΕΙΚΤΕΣ ΚΑΙ ΔΙΕΥΘΥΝΣΕΙΣ

Μπορείτε να δηλώσετε πίνακα οποιουδήποτε τύπου είτε βασικού είτε κλάσης:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Αντικείμενα ως ορίσματα

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

«ΕΙΔΙΚΑ ΘΕΜΑΣΑ ΣΟΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΤΠΟΛΟΓΙΣΩΝ» Κεφάλαιο 4: Αντικειμενοςτρεφήσ Προγραμματιςμόσ

HelloApplet. Παύλος Εφραιμίδης Java Applets 1

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Αντικειμενοστρεφής Προγραμματισμός

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ ΚΑΙ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Εργαλεία του JDK. Β.1 Εργαλεία του JDK. Β.2 Μεταγλωττιστής javac. Τα πιο βασικά εργαλεία του JDK είναι τα παρακάτω.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Τι σημαίνει; n Για την αποδοτική δέσμευση δομών δεδομένων μη. n Για την αποφυγή «διαρροών μνήμης» (memory leaks).

Επιλέξτε Σωστό ή Λάθος για καθένα από τα παρακάτω:

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

6. Εισαγωγή στον προγραµµατισµό

Μαλούτα Θεανώ Σελίδα 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

Υλοποίηση ενός προγραμματιστικού κελύφους εργασίας

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Βασικά Στοιχεία της Java

<<ΔΗΜΗΤΡΗΣ ΜΑΝΩΛΗΣ ΦΥΣΙΚΟΣ ΜCs>> 1

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Προγραμματισμός I (Θ)

ΚΕΦΑΛΑΙΟ 2. Τιμές, τύποι, μεταβλητές, λέξεις-κλειδιά, εντολές. 2.1 Εισαγωγή

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

. Μεθοδολογία Προγραμματισμού. Εισαγωγή στη Java. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

ΚΕΦΑΛΑΙΟ 6. Περιβάλλοντα Ανάπτυξης Εφαρμογών. ΚΕΦΑΛΑΙΟ 6 Περιβάλλοντα Ανάπτυξης Εφαρμογών. Α Γενικού Λυκείου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Ιδιότητες αντικειμένων, συγγραφή κώδικα, συντακτικά λάθη

Ε Ι Α Γ Ω Γ Η Σ Ο Ν Π Ρ Ο Γ Ρ Α Μ Μ Α Σ Ι Μ Ο Κ Ε Υ Α Λ Α Ι Ο 6. Σο πρόγραμμα γράφεται σε κάποια γλώσσα προγραμματισμού.

Mεταβλητές (variables) και Σταθερές (constants)

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Προγράμματα με δομή Κληρονομικότητας

ΕΠΛ233 Βιβλιοθήκες και Προσδιοριστές Πρόσβασης στην JAVA

2. Προσδιοριστές, δεσμευμένες λέξεις και τύποι

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

Συμβολική γλώσσα Εκπαιδευτικού Υπολογιστή - Λογισμικό Υπολογιστών

Λειτουργικά Συστήματα (Λ/Σ)

Ενδεικτική περιγραφή μαθήματος

Προγραμματισμός Ι (ΗΥ120)

6. Εξαιρέσεις στη γλώσσα Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

Εργαστήριο 1-1 η Άσκηση - Ανάλυση

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι String Interning

Transcript:

1. Ξεκινώντας Τελειώνοντας αυτό το κεφάλαιο θα μπορείτε: Να περιγράψετε τα κύρια χαρακτηριστικά της γλώσσας Java Να περιγράψετε τη Java Virtual Machine Να περιγράψετε πώς λειτουργεί ο μηχανισμός «συλλογής απορριμμάτων» (garbage collector) της Java Να περιγράψετε πώς λειτουργούν τα χαρακτηριστικά ασφαλείας της Java Να γράψετε, μεταγλωττίσετε και εκτελέσετε μία απλή εφαρμογή Java Να χρησιμοποιείται την on-line τεκμηρίωση της Java 1.1 Τι είναι η Java Η Java είναι: μία γλώσσα προγραμματισμού ένα περιβάλλον ανάπτυξης ένα περιβάλλον εφαρμογών Η Java είναι το αποτέλεσμα της αναζήτησης μίας προγραμματιστικής γλώσσας που θα παρέχει την ισχύ της C++, αλλά και την ασφάλεια μίας γλώσσας «ασφαλών τύπων» όπως η Smalltalk. Οι κύριοι στόχοι κατά την ανάπτυξη της νέας αυτής γλώσσας ήταν: Να δημιουργηθεί μία αντικειμενοστρεφής γλώσσα Να παρέχετε ένα περιβάλλον διερμηνείας για δύο λόγους o ταχύτητα ανάπτυξης απαλείφεται ο κύκλος μεταγλώττισης-σύνδεσηςφόρτωσης-ελέγχου o μεταφερσιμότητας κώδικα ένα περιβάλλον διερμηνείας κάνει τις εξειδικευμένες κλήσεις στο λειτουργικό σύστημα εκ μέρους του περιβάλλοντος εκτέλεσης. Να απαλειφθούν οι πρακτικές κωδικοποίησης που επηρεάζουν τον εύρωστο κώδικα o Αριθμητική με δείκτες o Δέσμευση και αποδέσμευση μνήμης Να παρέχει έναν τρόπο ώστε τα προγράμματα να εκτελούν περισσότερα από ένα νήματα δραστηριοτήτων (thread of activity). Να παρέχει έναν τρόπο ώστε τα προγράμματα να μεταβάλλονται δυναμικά κατά την εκτέλεσή τους επιτρέποντάς τους να φορτώνουν τμήματα κώδικα. Να παρέχει ένα τρόπο ελέγχου των τμημάτων του κώδικα που πρόκειται να φορτωθούν ώστε να αποτρέπονται ζητήματα ασφάλειας 1

Η αρχιτεκτονική της Java αναπτύχθηκε ώστε να επιτυγχάνονται οι πιο πάνω στόχοι. Οι στόχοι αυτοί επιτυγχάνονται μέσα από τα ακόλουθα χαρακτηριστικά της γλώσσας: Java Virtual Machine Ιδεατή μηχανή Java Συλλογή απορριμμάτων Garbage collection Ασφάλεια κώδικα 1.1.1. Ιδεατή Μηχανή Java Η προδιαγραφή της Ιδεατής Μηχανής Java (Java Virtual Machine Specification) ορίζει την Ιδεατή Μηχανή Java (Java Virtual Machine JVM) ως εξής: Υλοποιείται μία φανταστική μηχανή εξομοιώνοντας την με χρήση λογισμικού σε μία πραγματική μηχανή. Ο κώδικας για την Ιδεατή Μηχανή Java αποθηκεύεται σε αρχεία.class κάθε ένα από τα οποία περιέχει κώδικα για το πολύ μία δημόσια κλάση. Η προδιαγραφή της Ιδεατής Μηχανής Java παρέχει τις προδιαγραφές για την πλατφόρμα υλικού για την οποία μεταγλωττίζεται οποιοσδήποτε κώδικας Java. Η προδιαγραφή αυτή διευκολύνει τα προγράμματα Java να είναι ανεξάρτητα από πλατφόρμα γιατί η μεταγλώττιση γίνεται για μία φανταστική μηχανή. Εξαρτάται από το διερμηνέα της Java για κάθε συγκεκριμένη πλατφόρμα λογισμικού να επιβεβαιώσει ότι μπορεί να εκτελέσει τον κώδικα που έχει μεταγλωττιστεί για τη JVM. Η προδιαγραφή της JVM παρέχει συμπαγείς ορισμούς για την υλοποίηση των πιο κάτω: Σύνολο εντολών (ισοδύναμο με το σύνολο εντολών μίας CPU) Σύνολο καταχωρητών Μορφή του αρχείου class Στοίβα Σωρός από τον οποίο γίνεται η συλλογή απορριμμάτων Περιοχή μνήμης Η μορφή του κώδικα που υποστηρίζεται από τη JVM αποτελείται από συμπαγείς και αποτελεσματικούς κώδικες σε byte (bytecode). Τα προγράμματα που αναπαριστώνται από JVM κώδικα byte πρέπει να διατηρούν αυστηρή πειθαρχία στους τύπους και τις προδιαγραφές της JVM. Η πλειονότητα των ελέγχων τύπων της Java γίνεται κατά τη φάση της μεταγλώττισης από τον επιβεβαιωτή του κώδικα byte. Οποιοσδήποτε διερμηνέας Java που συμμορφώνεται με το πρότυπο της προδιαγραφής της JVM πρέπει να μπορεί να εκτελεί οποιοδήποτε πρόγραμμα με αρχεία class που συμμορφώνονται στη μορφή των αρχείων class που καθορίζεται στο κείμενο The Java Virtual Machine Specification. 1.1.2. Συλλογή απορριμμάτων Πολλές γλώσσες προγραμματισμού επιτρέπουν τη δυναμική δέσμευση μνήμης κατά την εκτέλεση. Η διαδικασία της δέσμευσης μνήμης ποικίλει ανάλογα με το συντακτικό της γλώσσας, αλλά πάντα έχει ως αποτέλεσμα ένα δείκτη σε μία αρχική διεύθυνση ενός μπλοκ μνήμης. 2

Από τη στιγμή που η δεσμευμένη μνήμη δε χρειάζεται πλέον (ο δείκτης που αναφέρεται στη μνήμη βρίσκεται εκτός πεδίου εμβέλειας) είναι σώφρον για το πρόγραμμα ή το περιβάλλον εκτέλεσης να αποδεσμεύει τη μνήμη ώστε να αποτραπεί η κατάσταση κατά την οποία το πρόγραμμα (ή το σύστημα) δεν έχει άλλη διαθέσιμη μνήμη. Στη C και τη C++ (αλλά και σε άλλες γλώσσες) αυτός που αναπτύσσει το πρόγραμμα έχει και την ευθύνη για την αποδέσμευση της μνήμης. Αυτό μπορεί σε ορισμένες περιπτώσεις να φανεί αρκετά δύσκολο, καθώς δεν είναι πάντα γνωστό εκ των προτέρων πότε θα πρέπει να αποδεσμευτεί η μνήμη. Τα προγράμματα που δεν αποδεσμεύουν μνήμη μπορούν τελικά να καταρρεύσουν όταν δεν υπάρχει άλλη διαθέσιμη μνήμη προς δέσμευση στο σύστημα. Τα προγράμματα αυτά λέμε ότι έχουν «διαρροή μνήμης» (memory leak). Η Java απαλλάσσει τον προγραμματιστή από την ευθύνη της αποδέσμευσης της μνήμης, παρέχοντας ένα νήμα (thread) επιπέδου συστήματος το οποίο εκτελείται στο παρασκήνιο που καταγράφει κάθε δέσμευση μνήμης και διατηρεί ένα μετρητή του πλήθους των αναφορών σε κάθε δείκτη στη μνήμη. Κατά τη διάρκεια των κύκλων χωρίς εκτέλεση άλλης εντολής στο σύστημα εκτέλεσης της JVM, το νήμα συλλογής απορριμμάτων (garbage collection thread) θα ελέγχει για να δει αν υπάρχουν δείκτες στη μνήμη των οποίων το πλήθος των αναφορών έχει μηδενιστεί. Αν υπάρχουν, το τμήμα αυτό της μνήμης που έχει σημειωθεί από το νήμα συλλογής απορριμμάτων «σκουπίζεται» (αποδεσμεύεται). Η συλλογή απορριμμάτων γίνεται αυτόματα κατά τη διάρκεια ζωής ενός προγράμματος Java και απαλείφει την ανάγκη για αποδέσμευση μνήμης και τις διαρροές μνήμης. 1.1.3. Ασφάλεια κώδικα Το σχήμα που ακολουθεί παρουσιάζει το περιβάλλον ενός Java προγράμματος και θα το χρησιμοποιήσουμε για να περιγράψουμε πώς η Java επιβάλλει την ασφάλεια του κώδικα. Μεταγλώττιση Περιβάλλον εκτέλεσης Φόρτωση κλάσης javac Hello.java δίκτυο επιβεβαίωση κώδικα Byte Hello.class Διερμηνέας Εκτέλεση Γεννήτρια κώδικα JIT Υλικό 3

Τα αρχεία Java «μεταγλωττίζονται» με την έννοια ότι μετατρέπονται από τη μορφή κειμένου στην οποία τα γράφουν οι προγραμματιστές σε ένα σύνολο από κώδικα byte, ανεξάρτητο από τη φυσική αρχιτεκτονική (το υλικό hardware) του υπολογιστή. Κατά την εκτέλεση ο κώδικας byte που αποτελεί το πρόγραμμα Java φορτώνεται, ελέγχεται και στη συνέχεια εκτελείται σε ένα διερμηνέα. Ο διερμηνέας έχει δύο εργασίες: εκτελεί τον κώδικα byte της Java και κάνει τις απαραίτητες κλήσεις μέσω του συστήματος εκτέλεσης στο υποκείμενο υλικό. Σε ορισμένα περιβάλλοντα εκτέλεσης της Java μέρος του επιβεβαιωμένου κώδικα byte μεταγλωττίζεται σε ιθαγενή (native) κώδικα μηχανής και εκτελείται άμεσα από την πλατφόρμα υλικού. Ο διερμηνέας Java Ο διερμηνέας Java πρέπει να εκτελεί τον κώδικα που μεταγλωττίζεται για τη JVM. Ένας διερμηνέας Java έχει τρεις βασικές εργασίες: Φόρτωση του κώδικα πραγματοποιείται από το φορτωτή κώδικα (class loader). Επιβεβαίωση κώδικα πραγματοποιείται από τον επιβεβαιωτή κώδικα byte (byte code verifier). Εκτέλεση κώδικα πραγματοποιείται από τον διερμηνέα χρόνου εκτέλεσης (runtime interpreter). Φορτωτής κώδικα Ο φορτωτής κώδικα φορτώνει όλες τις κλάσεις που απαιτούνται για την εκτέλεση του προγράμματος. Ο φορτωτής κώδικα προσθέτει ασφάλεια διαχωρίζοντας τις περιοχές ονομάτων για τις κλάσεις που προέρχονται από το τοπικό σύστημα αρχείων από εκείνες που είναι για τις κλάσεις που προέρχονται από το δίκτυο. Αυτό περιορίζει πιθανές εφαρμογές «Δούρειους Ίππους», γιατί ελέγχονται πάντα πρώτα οι ενσωματωμένες (τοπικές) κλάσεις. Όταν έχουν φορτωθεί όλες οι κλάσεις καθορίζεται η μορφή που πρέπει να έχει η μνήμη για το εκτελέσιμο αρχείο. Στο σημείο αυτό, αναθέτονται σε συγκεκριμένες διευθύνσεις μνήμης συμβολικές αναφορές και δημιουργείται ο πίνακας ευρετηρίου (lookup table) των μεθόδων των κλάσεων. Επειδή η διαμόρφωση της μνήμης λαμβάνει χώρα κατά το χρόνο εκτέλεσης, ο διερμηνέας Java προσθέτει προστασία ενάντια σε μη νόμιμη διευθυνσιοδότηση του κώδικα που θα μπορούσε να κάνει το πρόγραμμα να απευθύνεται σε χώρους μνήμης που κατέχει το λειτουργικό σύστημα και να δημιουργηθούν προβλήματα. Επιβεβαιωτής κώδικα byte Ο κώδικας Java περνάει από διάφορους ελέγχους προτού να εκτελεστεί πραγματικά στον υπολογιστή σας. Το πρόγραμμα εκτελεί τον κώδικα μέσω ενός επιβεβαιωτή κώδικα byte που ελέγχει τη διαμόρφωση των τμημάτων του κώδικα και εφαρμόζει ένα πρόγραμμα απόδειξης θεωρημάτων για να ελέγξει με βάση κανόνες τα τμήματα του κώδικα για μη επιτρεπτό κώδικα κώδικα που παραβιάζει τους δείκτες, παραβιάζει τα δικαιώματα προσπέλασης στα αντικείμενα ή προσπαθεί να αλλάξει τον τύπο των αντικειμένων ή των κλάσεων. 4

Σημείωση: Όλα τα αρχεία κλάσεων που εισάγονται μέσω δικτύου περνάνε από τον επιβεβαιωτή κώδικα byte. Διαδικασία επιβεβαίωσης Ο επιβεβαιωτής κώδικα byte κάνει τέσσερα περάσματα στον κώδικα ενός προγράμματος. Επιβεβαιώνει ότι ο κώδικας υπακούει στις προδιαγραφές της JVM και δεν παραβιάζει την ακεραιότητα του συστήματος. Αν ο επιβεβαιωτής ολοκληρώσει και τα τέσσερα περάσματα χωρίς να επιστρέψει μήνυμα λάθους τότε μπορείτε να είστε σίγουροι για τα ακόλουθα: Οι κλάσεις υπακούουν στη διαμόρφωση των αρχείων κλάσεων που έχουν τεθεί από τις προδιαγραφές της JVM. Δεν υπάρχουν παραβιάσεις στους περιορισμούς πρόσβασης. Ο κώδικας δεν θα δημιουργήσει υπερχειλίσεις (overflow) ή υποχειλίσεις (underflow) της στοίβας. Οι τύποι των παραμέτρων όλου του κώδικα που κάνει πράξεις είναι γνωστό ότι είναι πάντα ορθοί. Δεν λαμβάνουν χώρα μη νόμιμες μετατροπές δεδομένων, όπως η μετατροπή ακεραίων σε δείκτες. Οι προσβάσεις στα πεδία των αντικειμένων είναι νόμιμες. 1.2 Μία βασική εφαρμογή Java Όπως και οποιαδήποτε άλλη γλώσσα προγραμματισμού, η Java χρησιμοποιείται για να δημιουργούμε εφαρμογές. Ο ελάχιστος κώδικας για μια εφαρμογή είναι συνήθως αυτός που παρουσιάζει το μήνυμα «Hello World!» στην οθόνη. Ο πιο κάτω κώδικας Java παρουσιάζει ένα παράδειγμα της ελάχιστης εφαρμογής Java. 1.2.1. Hello World 1 // 2 // sample HelloWorld application 3 // 4 public class HelloWorldApp { 5 public static void main (String args[]) { 6 System.out.println( Hello world! ); 7 } 8 } Οι γραμμές περιέχουν τις ελάχιστες συνιστώσες που είναι απαραίτητες για να εκτυπωθεί το Hello World! στην οθόνη σας. 1.2.2. Περιγραφή του HelloWorldApp Οι τρεις πρώτες γραμμές στο πρόγραμμα είναι γραμμές σχολίων: 1 // 2 // sample HelloWorld application 5

3 // Η επόμενη γραμμή ορίζει το όνομα της κλάσης ως HelloWorldApp. Το όνομα της κλάσης που καθορίζεται στο αρχείο με τον πηγαίο κώδικα δημιουργεί ένα αρχείο classname.class στον κατάλογο στον οποίο μεταγλωττίζετε την εφαρμογή σας. Στην περίπτωση αυτή, ο μεταγλωττιστής θα δημιουργήσει ένα αρχείο με το όνομα HelloWorldApp.class. 4 public class HelloWorldApp { Η επόμενη γραμμή στο πρόγραμμα είναι το σημείο από το οποίο ξεκινά η εκτέλεση του προγράμματος. Ο διερμηνέας της Java πρέπει να τη βρει ακριβώς όπως είναι ορισμένη, διαφορετικά θα αρνηθεί να εκτελέσει το πρόγραμμα. Και άλλες γλώσσες προγραμματισμού, όπως η C και η C++, χρησιμοποιούν τον ορισμό main() για το σημείο αρχής της εκτέλεσης. Αν είστε εξοικειωμένοι με C ή C++ μπορεί να ενδιαφέρεστε να μάθετε τι σημαίνει το κάθε μέρος αυτής της δήλωσης μεθόδου. Αν όχι, μην ανησυχείτε, θα τα δούμε στη συνέχεια. Αν το πρόγραμμα έχει ορίσματα στη γραμμή εντολής του, αυτά μεταφέρονται στη μέθοδο main() σε ένα πίνακα συμβολοσειρών που ονομάζεται args. Στο παράδειγμα αυτό δεν αναμένουμε ορίσματα. 5 public static void main (String args[]) { public Η μέθοδος main() μπορεί να προσπελαστεί από οποιονδήποτε, συμπεριλαμβανομένου του διερμηνέα της Java εφόσον είναι δηλωμένη και ως static. static Αυτή η δεσμευμένη λέξη δηλώνει στο μεταγλωττιστή ότι η main() χρησιμοποιείται στο πλαίσιο της κλάσης HelloWorldApp και δεν απαιτεί να έχει δημιουργηθεί ένα στιγμιότυπο της κλάσης αυτής για να κληθεί. void Δηλώνει ότι η main() δεν επιστρέφει κάτι. Αυτό είναι σημαντικό, καθώς η Java πραγματοποιεί προσεκτικό έλεγχο τύπων, που περιλαμβάνει και έλεγχο σχετικά με το αν οι μέθοδοι που καλούνται επιστρέφουν στην πράξη τους τύπους με τους οποίους είχαν δηλωθεί. String args[] Ο ορισμός ενός πίνακα από String. Αυτά είναι τα ορίσματα που θα μπορούσαν να έχουν δοθεί στη γραμμή εντολή μετά από το όνομα της κλάσης java HelloWorldApp arg1 arg2 6 System.out.println( Hello world! ); Η πιο πάνω γραμμή παρουσιάζει τη χρήση ενός ονόματος κλάσης, ενός ονόματος αντικειμένου και μίας κλήσης μεθόδου. Τυπώνει τη συμβολοσειρά Hello World! στην προκαθορισμένη έξοδο (standard output). Η μέθοδος println() λαμβάνει ως όρισμα μία συμβολοσειρά και τη γράφει στο ρεύμα της προκαθορισμένης εξόδου. Τέλος οι δύο τελευταίες γραμμές, οι δύο άγκιστρα, κλείνουν τη μέθοδο main() και την κλάση HelloWorldApp 7 } 8 } 6

1.3 Μεταγλώττιση και εκτέλεση του HelloWorldApp 1.3.1. Μεταγλώττιση Αφού δημιουργήσετε το αρχείο με τον πηγαίο κώδικα HelloWorldApp.java, μεταγλωττίστε το με την ακόλουθη εντολή $ javac HelloWorldApp.java Αν ο μεταγλωττιστής δεν επιστρέψει μηνύματα, το νέο αρχείο HelloWorldApp.class αποθηκεύεται στον ίδιο κατάλογο με το πηγαίο αρχείο. Αν υπάρχουν μηνύματα δείτε το πιο κάτω υποκεφάλαιο 1.4. 1.3.2. Εκτέλεση Για να εκτελέσετε την εφαρμογή HelloWorldApp, χρησιμοποιείται το διερμηνέα Java που βρίσκεται στον κατάλογο bin $ java HelloWorldApp Hello World! Σημείωση Αν δεν έχετε θέσει τη μεταβλητή περιβάλλοντος PATH ώστε να περιλαμβάνει το $JAVA_HOME/bin, πρέπει να δώσετε την πλήρη διαδρομή για το javac και java. 1.4 Διορθώσεις λαθών κατά τη μεταγλώττιση εκτέλεση 1.4.1. Μηνύματα λάθους κατά τη μεταγλώττιση Τα παρακάτω είναι κοινά μηνύματα λάθους κατά τη μεταγλώττιση javac: Command not found o Η μεταβλητή path δεν έχει τεθεί σωστά ώστε να περιλαμβάνει το μεταγλωττιστή javac. Ο μεταγλωττιστής javac βρίσκεται στον κατάλογο bin κάτω από τον κατάλογο όπου εγκαταστήσατε το Java Developers Kit. HelloWorldApp.java:3: Method printl(java.lang.string) not found in class java.io.printstream. System.out.printl ( Hello World! ); ^ o Το όνομα της μεθόδου println έχει πληκτρολογηθεί λάθος. In class HelloWorldApp: main must be public and static o Το λάθος αυτός συμβαίνει γιατί μία από τις λέξεις public και static έχουν παραληφθεί από τη γραμμή που περιέχει τη μέθοδο main. 1.4.2. Μηνύματα λάθους κατά την εκτέλεση Can t find class HelloWorldApp o (Το λάθος αυτό εμφανίζεται όταν πληκτρολογείται java HelloWorldApp) 7

o Γενικά, αυτό σημαίνει ότι το όνομα της κλάσης έχει γραφεί με λάθος γραφή στο πηγαίο αρχείο και συνεπώς το όνομα filename.class έχει γραφεί με λάθος τρόπο, π.χ. λάθος συνδυασμό πεζών και κεφαλαίων, εξ αιτίας του ορισμού της κλάσης. o Για παράδειγμα το class HelloWorldapp { δημιουργεί το αρχείο HelloWorldapp.class που δεν είναι το όνομα κλάσης που αναμένει ο μεταγλωττιστής. 1.5 Μορφή πηγαίου αρχείου Java 1.5.1. Ονοματοδοσία Αν το αρχείο.java περιέχει μία δημόσια (public) κλάση τότε το όνομά του πρέπει να είναι αυτό της κλάσης. 1.5.2. Πλήθος κλάσεων Ο κανόνας της Java δηλώνει ότι το πολύ μία δημόσια κλάση πρέπει να είναι ορισμένη σε ένα πηγαίο αρχείο. Μπορεί να περιέχει πλήθος άλλων κλάσεων, αρκεί μόνο μία να είναι public. Αυτό βέβαια δεν είναι σωστή πρακτική. 1.5.3. Διαμόρφωση (layout) Ένα πηγαίο αρχείο.java μπορεί να περιέχει τρία στοιχεία «άνω επιπέδου». Αυτά είναι: Προαιρετικά μία δήλωση πακέτου (package). Οποιοσδήποτε αριθμός εντολών εισαγωγής import. Δηλώσεις κλάσεων και διεπαφών. Τα στοιχεία αυτά πρέπει να εμφανίζονται με αυτή τη σειρά. Δηλαδή, οι εντολές εισαγωγής import πρέπει να βρίσκονται πριν από τις δηλώσεις των κλάσεων και αν χρησιμοποιείται δήλωση πακέτου, αυτή θα πρέπει να προηγείται των εντολών import και των δηλώσεων των κλάσεων. 1.6 Χρήση της τεκμηρίωσης της Java Το JDK περιέχει ένα σύνολο αρχείων HTML που τεκμηριώνουν το API που παρέχεται από τα παρεχόμενα πακέτα. Όλη η τεκμηρίωση είναι διαθέσιμη από τη σελίδα http://java.sun.com/apis.html, ενώ στη σελίδα http://java.sun.com/j2se/1.4.1/docs/api/ είναι διαθέσιμη η τεκμηρίωση για την έκδοση 1.4.1 της Java, Standard Edition. Η τεκμηρίωση παρουσιάζεται με δύο διαμορφώσεις: με πλαίσια (frames) και χωρίς πλαίσια. Η διαμόρφωση χωρίς πλαίσια είναι ιεραρχική, ώστε η αρχική σελίδα για το σύνολο να παρουσιάζει όλα τα πακέτα ως συνδέσμους. Αν επιλέξετε ένα συγκεκριμένο πακέτο, η σελίδα που θα παρουσιαστεί περιέχει όλες τις κλάσεις που είναι μέλη του συγκεκριμένου πακέτου. Κάθε κλάση είναι ένας σύνδεσμος και επιλέγοντάς την θα παρουσιαστεί η σελίδα με την πληροφορία σχετικά με την κλάση. Η διαμόρφωση με πλαίσια χωρίζει τη σελίδα σε τρία μέρη, βλέπε την επόμενη εικόνα. Στο πάνω αριστερά παρουσιάζονται όλα τα πακέτα, στο κάτω αριστερά όλες οι κλάσεις, ενώ στο δεξί πλαίσιο παρουσιάζονται οι περιγραφές όλων των πακέτων. Επιλέγοντας ένα 8

πακέτο από το πάνω αριστερά πλαίσιο, στο κάτω αριστερά θα παρουσιαστούν οι κλάσεις που αυτό περιέχει και επιλέγοντας μία από τις κλάσεις θα παρουσιαστεί στο δεξί πλαίσιο η πληροφορία σχετικά με αυτή. Κάθε κείμενο κλάσης έχει την ίδια διαμόρφωση, αν και ορισμένα τμήματα μπορεί να έχουν παραληφθεί αν δεν είναι σχετικά με την κλάση. Τα κύρια μέρη ενός κειμένου κλάσης περιλαμβάνουν: Την ιεραρχία της κλάσης Μία περιγραφή της κλάσης και του γενικού σκοπού που έχει Μια λίστα των μεταβλητών μελών (member variables) Μία λίστα των μεθόδων δημιουργίας στιγμιοτύπων (γεννητριών) (constructor) Μία λίστα των μεθόδων Μία λεπτομερή λίστα των μεταβλητών, με πλήρη περιγραφή του σκοπού και της χρήσης της κάθε μίας. Μία λεπτομερή λίστα των μεθόδων δημιουργίας (γεννητριών), με πλήρη περιγραφή. Μία λεπτομερή λίστα των μεθόδων, με πλήρη περιγραφή Το γεγονός ότι ένα πλήκτρο (button) κληρονομεί από ένα συστατικό (component) παρουσιάζεται στην ιεραρχία των κλάσεων, και προς το παρόν, θα πρέπει να γνωρίζεται ότι πολλές από τις διευκολύνσεις μίας κλάσης μπορεί να μην είναι τεκμηριωμένες στη σελίδα της κλάσης, αλλά να περιγράφονται στη σελίδα της γονικής της κλάσης. Συνεπώς, η μέθοδος setname() για την κλάση Button βρίσκεται στην τεκμηρίωση για την κλάση Component. 9

1.7 Ασκήσεις 1.7.1. Πρώτο επίπεδο δυσκολίας 1. Ξεκινήστε με χρήση του browser την τεκμηρίωση της Java. Βρείτε το API του πακέτου java.lang. Ποιες κλάσεις ορίζονται στο πακέτο; Ποιες είναι ορισμένες από τις μεθόδους της κλάσης System; Σε ποιο πακέτο ορίζεται η μέθοδος System.out.println; 2. Δημιουργείστε μία εφαρμογή παρόμοια με τη HelloWorldApp, η οποία θα εκτυπώνει μία συμβολοσειρά. Μεταγλωττίστε το πρόγραμμα, διορθώστε τυχόν λάθη και εκτελέστε το με χρήση του διερμηνέα της Java. 1.7.2. Τρίτο επίπεδο δυσκολίας 1. Γράψτε μία εφαρμογή που θα διαβάζει μία γραμμή από το stdin και θα τη γράφει στο stdout. Αμφότερα τα stdin και stdout βρίσκονται στην κλάση java.lang.system. 10