|
|
|
java:jre [2015/07/05 10:56] gthanos |
java:jre [2021/02/18 12:05] |
| ====== Το περιβάλλον μεταγλώτισσης και εκτέλεσης Java (JRE/JDK) ====== | |
| |
| H Java είναι μία γλώσσα **υψηλού επιπέδου** η οποία όταν μεταγλωττίζεται παράγεται ένας ιδιαίτερος τύπος κώδικα **χαμηλού επιπέδου** που ονομάζεται [[wp>Java_bytecode|Java Byte Code]]. Το [[wp>Java_bytecode|Java Byte Code]] ομοιάζει με assembly με την ιδιαιτερότητα όμως ότι δεν συμπίπτει με κάποια υφιστάμενη αρχιτεκτονική υπολογιστή. Ο κώδικας αυτός είναι εύκολο να μεταγλωττιστεί και να εκτελεστεί σε πραγματικό χρόνο από μία εικονική μηχανή εκτέλεσης κώδικα (Virtual Machine) στην γλώσσα μηχανής του κάθε υπολογιστή. Η διαδικασία μεταγλώτισσης και εκτέλεσης ψευδο-κώδικα σε πραγματικό χρόνο ονομάζεται [[wp>Just-in-time_compilation]]. | |
| |
| Το κώδικας που προκύπτει από την μεταγλώτιση των προγραμμάτων Java, απαιτεί για την εκτέλεση του μία εικονική μηχανή εκτέλεσης κώδικα ([[wp>Java_bytecode|Java Byte Code]]), το λεγόμενο [[wp>Java_virtual_machine| Java Virtual Machine (JVM)]]. To [[wp>Java_virtual_machine| JVM ]] είναι μία εικονική μηχανή εκτέλεσης κώδικα με την έννοια ότι δεν υπάρχει κάποιο υλικό που να την υλοποιεί, αντ' αυτού υλοποιείται σε λογισμικό. | |
| |
| Αν και η δομή του [[wp>Java_bytecode|Java Byte Code]] επιτρέπει την γρήγορη εκτέλεση του κώδικα **Java** σε οποιαδήποτε αρχιτεκτονική. Παρ' όλα αυτά, δεν πρέπει να ξεχνάμε ότι καθώς εμπλέκεται λογισμικό στην εκτέλεση του κώδικα (αντί για εκτέλεση απευθείας πάνω στο υλικό) η γλώσσα Java δεν μπορεί παρά να είναι πιο αργή στην εκτέλεση της από οποιαδήποτε γλώσσα που εκτελείται απευθείας από το λειτουργικό, όπως οι C/C++. Από την άλλη, τα σύγχρονα υπολογιστικά συστήματα είναι τόσο ισχυρά, ώστε μπορούν να καλύψουν με άνεση τον επιπλέον υπολογιστικό κόστος που εισάγει η μηχανή **JVM** για τις περισσότερες εφαρμογές. | |
| |
| Στα παρακάτω σχήματα απεικονίζεται η διαδικασία μεταγλώττισης και εκτέλεσης ενός προγράμματος **Java**. O κώδικας Java μεταγλωτίζεται σε διαδικά αρχεία **.class** τα οποία είναι εκτελέσιμα από το JVM. To JVM μπορεί να εκτελεστεί σε υπολογιστές διαφορετικής αρχιτεκτονικής. Συμπερασματικά, το ίδιο εκτελέσιμο αρχείο **.class** μπορεί να εκτελεστεί σε υπολογιστές διαφορετικής αρχιτεκτονικής, χωρίς να απαιτηθεί η επαναμεταγλώτιση του. | |
| |
| | {{:java:java-code-lifecycle1.gif?400 |}} | {{:java:java-code-lifecycle2.gif?430 |}} | | |
| |
| |{{:java:java-code-lifecycle3.gif? |}} | | |
| |
| | Στην παρακάτω εικόνα απεικονίζεται η διάκριση μεταξύ της εκτέλεσης ενός κώδικα **C/C++** και ενός κώδικα **Java**. <WRAP important>To ίδιο εκτελέσιμο ΔΕΝ μπορεί να εκτελεστεί σε εικονικές μηχανές JVM __διαφορετικής έκδοσης__. Εφόσον καλούμαστε να εκτελέσουμε τον κώδικα μας σε μηχανή διαφορετικής έκδοσης από αυτή για την οποία έχει μεταγλωττιστεί αρχικά ο κώδικας, απαιτείται να μεταγλωττιστεί από μεταγλωττιστή κατάλληλης έκδοσης που να ταιριάζει στην έκδοση της εικονικής μηχανής.</WRAP>| {{:java:java_vs_c_.png?300 |}} | | |
| |
| ==== Το περιβάλλον εκτέλεσης - Java Runtime Environment ==== | |
| |
| |{{ :java:jre-stack.png?300|}}| | |
| |
| To περιβάλλον εκτέλεσης οποιουδήποτε προγράμματος Java (το λεγόμενο JRE) αποτελείται από τα εξής: | |
| - Java Virtual Machine (JVM) | |
| - Java API classes (standard βιβλιοθήκη της Java) | |
| |
| Χωρίς τα δύο παραπάνω κανένα πρόγραμμα Java δεν μπορεί να εκτελεστεί. | |
| |
| ===== Το περιβάλλον μεταγλώτισσης ===== | |
| |
| Το περιβάλλον μεταγλώττισης αποτελείται από το Java compiler (**javac**). Κάθε κλάση στη Java οφείλει να είναι ένα αυτόνομο αρχείο, του οποίου το όνομα να είναι ίδιο με το όνομα της κλάσης ακολουθούμενο από την κατάληξη **.java**. Για παράδειγμα, η κλάση **FirstProgram** πρέπει να είναι σε ένα αρχείο με όνομα **FirstProgram.java**. | |
| |
| Κάθε κλάση μεταγλωττίζεται με την εντολή **javac** ακολουθούμενη από το όνομα του αρχείου όπου βρίσκεται η κλάση, δηλ | |
| <code> | |
| javac FirstProgram.java | |
| </code> | |
| |
| Το αποτέλεσμα είναι ένα πρόγραμμα byte-code του οποίου το όνομα αρχείου είναι το ίδιο με το όνομα της κλάσης ακολουθούμενο από την κατάληξη **.class**, για το παραπάνω παράδειγμα, το εκτελέσιμο αρχείο έχει όνομα **FirstProgram.class**. | |
| |
| ===== Το πρώτο μου πρόγραμμα ===== | |
| |
| <code java MyFirstProgram.java> | |
| |
| public class MyFirstProgram { | |
| public static void main(String args[]) { | |
| System.out.println("Hello Reader!"); | |
| System.out.println("Welcome to Java world."); | |
| | |
| String str1 = "Goodbye "; | |
| String str2 = "for now."; | |
| System.out.println(str1+str2); | |
| } | |
| } | |
| |
| </code> | |
| |
| Ο παραπάνω κώδικας μεταγλωτίζεται ως εξής: | |
| <code> | |
| javac MyFirstProgram.java | |
| </code> | |
| |
| και εκτελείται ως εξής: | |
| <code> | |
| java MyFirstProgram | |
| </code> | |
| |
| Απαραίτητη προϋπόθεση για την εκτέλεση ενός προγράμματος Java είναι η ύπαρξη της συνάρτησης **main**. Η συνάρτηση **main** ορίζεται ως εξής | |
| |
| <code java> | |
| public static void main(String args[]) { | |
| ... | |
| σώμα της main | |
| ... | |
| } | |
| </code> | |
| |
| όπου ''String args[]'' είναι ένας πίνακας από ορίσματα τύπου [[ http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true |java.lang.String]] που λαμβάνει το πρόγραμμα από την γραμμή εντολών | |
| - args[0]: το 1ο όρισμα | |
| - args[1]: το 2ο όρισμα κ.ο.κ. | |
| |
| <WRAP center round todo 60%> | |
| Κατεβάστε και τρέξτε το παραπάνω αρχείο ακολουθώντας τις οδηγίες. | |
| </WRAP> | |
| |
| ===== Garbage Collection ===== | |
| |
| Μία από τις βασικές ιδιότητες τις Java είναι ότι ο προγραμματιστής δεν απαιτείται να ασχοληθεί με την δέσμευση και κυρίως με την αποδέσμευση μνήμης στο πρόγραμμα του. Η Java δεσμεύει μνήμη δυναμικά για όλα τα αντικείμενα που δημιουργεί και αποδεσμεύει την μνήμη αυτόματα μέσω ενός μηχανισμού που ονομάζεται //Garbage Collector//. Ο μηχανισμός αυτός έχει την δυνατότητα να αναλύει την δομή της δεσμευμένης μνήμης κάθε προγράμματος και να εντοπίζει τα αντικείμενα που δεν είναι πλέον σε χρήση. Για τα αντικείμενα αυτά αποδεσμεύει την μνήμη που καταλαμβάνουν. Ο μηχανισμός αυτός δεν ελέγχεται από τον προγραμματιστή, συνήθως πρόκειται για ένα ξεχωριστό thread το οποίο εκτελείται για κάθε εκτελούμενο Java πρόγραμμα σε τακτά χρονικά διαστήματα. | |
| |
| Το παρακάτω απόσπασμα είναι από τη ελληνική έκδοση της [[http://el.wikipedia.org/wiki/%CE%A3%CF%85%CE%BB%CE%BB%CE%BF%CE%B3%CE%AE_%CE%B1%CF%80%CE%BF%CF%81%CF%81%CE%B9%CE%BC%CE%BC%CE%AC%CF%84%CF%89%CE%BD_%28%CF%85%CF%80%CE%BF%CE%BB%CE%BF%CE%B3%CE%B9%CF%83%CF%84%CE%AD%CF%82%29 | Wikipedia]]. | |
| |
| "//Στην πληροφορική, η συλλογή απορριμμάτων (αγγλ. garbage collection ή GC) είναι μια μορφή αυτόματης διαχείρισης μνήμης η οποία λειτουργεί στο υπόβαθρο, κατά την εκτέλεση ενός προγράμματος. Ο συλλέκτης απορριμμάτων (garbage collector), η απλώς συλλέκτης, είναι συνήθως ένα νήμα του συστήματος (π.χ. του λειτουργικού συστήματος ή μιας εικονικής μηχανής επί της οποίας εκτελείται το βασικό πρόγραμμα) σχεδιασμένο κάθε φορά που ενεργοποιείται να απελευθερώνει τα τρέχοντα απορρίμματα: τη μνήμη την οποία καταναλώνουν τα αντικείμενα που το πρόγραμμα δεν χρησιμοποιεί πια. Η συλλογή απορριμμάτων εφευρέθηκε από τον Τζον Μακάρθι το 1959 για να λύσει προβλήματα της γλώσσας προγραμματισμού Lisp.//" | |
| |
| Δείτε περισσότερα [[ java:objects#Garbage Collection|εδώ]]. | |
| |
| |
| |Προηγούμενο: | Επόμενο: [[java:introduction]]| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |