|
Εισαγωγή
Εγκαθιστώντας
τη Java στο Unix/Linux είναι
ευκολότερο
από όσο ακούγεται.
Το πρώτο βήμα που
πρέπει να κάνουμε
είναι εγκαταστήσουμε
την Εικονική
Μηχανή (JRE) για να
μπορούμε να τρέχουμε
τα προγράμματα
και το πακέτο
ανάπτυξης (J2SDK) για
να μπορούμε να
γράφουμε και
να αποδελτιώσουμε (compile)
τα προγράμματα μας.
Πολλές διανομές
του Linux έρχοντε
με τη Java ήδη εγκαταστημένη
οπότε μπορούμε
να βεβαιωθούμε
αν ήδη υπάρχει με
το να δώσουμε
την εντολή "which java"
ή "whereis java". Αν ήδη υπάρχει
τότε στην οθόνη
μας θα εμφανιστεί
η τοποθεσία της
Java, αλλιώς ένα μήνυμα
"no java in ..." ή "java: ".Αντίστοιχα για να βεβαιωθουμε οτι η
εικονική μηχανή ειναι σωστα
εγκατεστημένη και μπορούμε να την χρησιμοποιήσουμε αμέσως μπορουμε να
πληκτρολογησουμε στην γραμμη εντολών (command prompt) την εντολή "java
-version" η οποία θα μας δείξει την εκδοση της εγκατεστημένης
Java εικονικής μηχανης στο μηχανημα μας.. Αν δεν
υπάρχει μπορούμε
να πάμε στον δικτυακό
τόπο της Sun και να κατεβάσουμε
το πακέτο ανάπτυξης μαζί με την εικονική μηχανή. Αυτα μπορούν να
βρεθούν εδώ
. Καλό θα είναι να
κατεβάσουμε
και τα συνοδευτικά
έγγραφα μιας και
είναι αρκετά
κατατοπιστικά
για το τι κάνουνε
όλες οι κλάσεις
και πως να τις
χρησιμοποιούμε.
Εγκατάσταση
Αφού
κατεβάσουμε
τα .bin αρχεία θα
πρέπει να τα εκτελέσουμε.
Εξ' ορισμού δεν
μπορούμε να το
κάνουμε αφού η
άδεια εκτέλεσης
δεν έχει δοθεί
στο χρήστη. Για
να αλλάξουμε
την πρόσβαση στα
αρχεία δίνουμε
την εντολή "chmod 764
<όνομα αρχείου>"
(στον υπολογιστή
μου αυτό είναι:
"chmod 764 j2sdk-1_4_0-linux-i386.bin"
και
"chmod 764 j2re-1_4_0-linux-i386.bin")
ώστε
να έχουμε πρόσβαση
εκτέλεσης των
αρχείων. Αφού
δώσουμε την
παραπάνω εντολή
τότε μπορούμε να
τα εκτελέσουμε
δίνοντας "./<όνομα
αρχείου>" (στο
περιβάλλον μου
αυτό είναι:
"./j2sdk-1_4_0-linux-i386.bin"
και
"./j2re-1_4_0-linux-i386.bin")
και
ακολουθούμε
τις οδηγίες
στην οθόνη. Όταν
τελειώσουμε
και με τα δύο
αρχεία θα έχουμε
εγκαταστήσει
την Εικονική
Μηχανή και το πακέτο
ανάπτυξης. Προτού
γράψουμε το
πρώτο μας πρόγραμμα
πρέπει να βεβαιωθούμε
ότι μπορούμε να
βρούμε τα "java" και
"javac" προγράμματα
από όπου και αν
είμαστε. Για να
το κάνουμε αυτό
μπορούμε να θέσουμε
το PATΗ ώστε να ψάχνει
στον υποκατάλογο
που έχουμε
εγκαταστήσει
το πακέτο ανάπτυξης
(J2SDK) δίνοντας :
export
PATH=$PATH:<path του
J2SDK>/bin
Παραδείγματος
χάρη στο δικό μου
τον υπολογιστή
αυτό είναι:
export
PATH=$PATH:/home/girionis/java/j2sdk1.4.0/bin
ή
export
PATH=$PATH:/home/girionis/java/j2re1.4.0/bin
και θα
μπορούμε
να τρέξουμε τη Java από όπου
και αν είμαστε.
Για να δούμε αν
όλα πάνε καλά μπορούμε
να ξαναδώσουμε
την εντολή: "which
java" ή "whereis java" και αυτή
τη φορά πρέπει να
δούμε την τοποθεσία
της Java.Για να γράψουμε
το πρώτο μας κείμενο
τρέχουμε οποιονδήποτε
κειμενογράφο
μας βολεύει
(προσωπική επιλογή
αποτελεί ο emacs), ανοίγουμε
ένα αρχείο με όνομα HelloWorldFromLinux.java
("emacs HelloWorldFromLinux.java")
και γράφουμε
ένα πολύ απλό πρόγραμμα:
- public class
HelloWorldFromLinux {
-
public static void main(String [] arguments){
-
System.out.println("Hello world from Linux.");
-
}//end of main
- }
|
Αφού σώσουμε
το αρχείο
(πατώντας διαδοχικώς Ctrl + x, Ctrl + s) δημιουργούμε
το bytecode δίνοντας
την εντολή: " javac HelloWorldFromLinux.java " και
αν δε μας βγάλει
μήνυμα λάθους
το τρέχουμε με
την εντολή: "java HelloWorldFromLinux". Αν
όλα
γίνανε κατά γράμμα
τότε θα πρέπει να
δούμε στην οθόνη
το "Hello world from Linux." μήνυμα.
Αν αντί για το
παραπάνω μήνυμα
δούμε το "Exception in
thread "main" java.lang.NoClassDefFoundError:
HelloWorldFromLinux" μήνυμα σφάλματος
τότε αυτό σημαίνει
ότι η Εικονική
Μηχανή δεν μπορεί
να βρει το αρχείο HelloWorldFromLinux.class.
Αυτό
είναι κάτι που
λύνεται πολύ
εύκολα αν θέσουμε
το CLASSPATH
σωστά. Υπάρχουνε
δύο τρόποι να το
κάνουμε αυτό.
Ο πρώτος
είναι να το θέσουμε
μέσω των μεταβλητών
του περιβάλλοντός
μας (environment variables)
και ο δεύτερος
είναι να το θέτουμε
κάθε φορά που
τρέχουμε μία κλάση.
Για να το θέσουμε
μέσω των μεταβλητών
περιβάλλοντος
γράφουμε τα εξής:
"export CLASSPATH=$CLASSPATH:<path
to the class>". Στον υπολογιστή
μου, έχοντας την
κλάση "HelloWorldFromLinux.class"
στον υποκατάλογο
"/home/girionis/java"
το CLASSPATH γίνεται:
"export
CLASSPATH=$CLASSPATH:/home/girionis/java".
Για να δούμε αν
έχει θετηθεί το CLASSPATH μπορούμε
να γράφουμε την
εντολή "echo
$CLASSPATH". Τρέχουμε
πάλι το πρόγραμμα
με "java HelloWorldFromLinux"
και λογικα
πρέπει να δούμε
το μήνυμα "Hello
world from Linux" στην οθόνη
μας.
Ο δεύτερος
είναι να θέσουμε
το CLASSPATH ενώ
τρέχουμε το
πρόγραμμα και
χρησιμοποιώντας
την -classpath επιλογή.
Για παράδειγμα
αν είμαστε στον
υποκατάλογο /home/girionis και η
κλάση "HelloWorldFromLinux"
είναι στον "/home/girionis/java"
τότε
μπορούμε να την
τρέξουμε δίνoντας
"java
-classpath /home/girionis/java HelloWorldFromLinux"
ή
"java
-classpath java/ HelloWorldFromLinux".
Αν είμαστε
μέσα στον "/home/girionis/java"
τότε μπορούμε να
γράψουμε την
εντολή
"java
-classpath . HelloWorldFromLinux".
Η τελεία
μετά το "-classpath" σημαίνει
τον
τρέχων υποκατάλογο."
Επιδόσεις
και εναλλακτικές
προτάσεις
Σίγουρα για
πολλούς το Linux
και γενικά κάθε
λειτουργικό
βασισμένο στην
οικογένεια
λειτουργικών
του Unix, αποτελούν
την καλύτερη
πλατφόρμα για
ανάπτυξη εφαρμογών.
Στα ιδιαίτερα
χαρακτηριστικά
των λειτουργικών
συγκαταλέγεται
η μεγάλη τους
σταθερότητα και
αξιοπιστία. Παραλληλα
πολλά από αυτά
είναι
σχετικά ολιγαρκή
όσο αναφορά την
απορρόφηση πόρων
από τον υπολογιστή
μας.
Ο παραπάνω
κανόνας όσο αναφορά
την σταθερότητα
και την αξιοπιστία
δεν μπορεί να
αποτελέσει
εξαίρεση για
την ανάπτυξη εφαρμογών
σε Java. Παρόλα
αυτά η σχετική
εμπειρία και η
τρέχουσα κατάσταση
μας επιφυλάσσουν
μια μικρή δυσάρεστη
έκπληξη. Είναι κοινά
αποδεκτό ότι
εφαρμογές Java
που τρέχουν σε
λειτουργικό
όπως το Linux
εμφανίζονται
να έχουν μια
διάφορα σε επιδόσεις
σε σχέση με την
απόδοση που
παρουσιάζουν
στην πλατφόρμα
των Windows.Η παρατήρηση
αυτή μπορεί να
γίνει ιδιαίτερα
αισθητή όταν μιλάμε
και παρατηρούμε
ιδιαίτερα πολύπλοκα
σύστημα.
Ο λόγος του
προβλήματος
οφείλεται στην
σχετικά μη παράλληλη
εξέλιξη της εικονικής
μηχανής της Java
στο Linux σε
αντιπαράθεση
με την αντίστοιχη
εικονική μηχανή
των Windows. Τελείως
αναφορικά να πούμε
ότι είναι εμφανές
ότι η πιο γρήγορη
εικονική μηχανή
που εξελίσσει
τάχιστα και δίνει
προτεραιότητα
η Sun είναι αυτή
των Windows, στην
συνεχεία η εικονική
μηχανή του Solaris
και μετά έρχοντε Unix και Linux.Με
το πέρασμα του χρόνου γίνοντε προσπάθειες αυτές οι διαφορές να
εξαλειφθούν.
Για να μπορέσουν
μερικοί προγραμματιστές
να ξεπεράσουν
αυτό το μικρό κόλλημα
στην απόδοση έχουν
στραφεί σε κάποιες
άλλες λύσεις
που τους προσφέρουν
καλύτερες επιδόσεις
σε σχέση με την standard εικονική
μηχανή της Sun.
Μερικές από
αυτές που μπορούμε
να αναφέρουμε
είναι η γνωστή
στούς κύκλους
των χρηστών Linux
εικονική μηχανή
με το όνομα BlackDown.
Σύμφωνα με τους
δημιουργούς
της εναλλακτικής
αυτής εικονικής Java μηχανής
προσφέρει 10-30% καλύτερες
επιδόσεις όταν
εκτελεί Java
bytecode σε σχέση με
την αντίστοιχη
της Sun.Πληροφορίες
για την εναλλακτική
εικονική μηχανή
μπορείτε να βρείτε
στο http://www.blackdown.org
.
Μια
άλλη ακόμα
πιο ενδιαφέρουσα
λύση αποτελεί
και ο γνωστός
σε όλους μας GNU
compiler
(γνωστός
ως gcc) ο
οποίος αποτελεί
βασικό συστατικό
σε κάθε Unix-Linux
λειτουργικού
.O gcc στις
τελευταίες
του εκδόσεις
3.x.x περιέχει και
μια έκδοση του
που ονομάζεται Gnu Compiler for Java
γνωστός
και ως gcj. O
gcj έχει την ιδιαιτερότητα
και το προσόν να
μπορεί να κάνει compile java κώδικα
και στην συνεχεία
να μας παράξει
είτε τα κλασικά bytecode όπως θα
έκανε ο γνωστός
μας javac (Sun
Java Compiler), είτε να περάξει
κατευθείαν
ιθαγενή Linux
εκτελέσιμα
αρχεία (Linux native
executables). Για τους
χρηστές να πούμε
ότι μπορούν να
φανταστούν ένα Linux εκτελέσιμο
αρχείο ανάλογο
με ένα εκτελέσιμο
αρχείο των windows
που έχει την κατάληξη
(.exe), μόνο που
στο Linux έχει
διαφορετική
κατάληξη.
Και τί
κερδίζουμε
τελικά με το
παραπάνω; Αυτό που
κερδίζουμε
είναι να προσπεράσουμε
για χάρη των επιδόσεων
την εικονική
μηχανή της Java
στο Linux και
να αφήσουμε
κατευθείαν την
εκτέλεση του
προγράμματος
μας στο λειτουργικό
Σε κανονική
περίσταση όπως
έχουμε εξηγήσει
και παλιότερα
την ο κώδικας
μας θα μεταμορφωνόταν
σε Java bytecode (μέσω
του javac) και
στην συνεχεία
η εικονική μηχανή
του εκάστοτε
λειτουργικού
θα αναλάμβανε
να μεταφράσει
τον bytecode μας
σε κλήσεις στο
αντίστοιχο
λειτουργικό.
Σύμφωνα με πολλούς
οι επιδόσεις
που προσφέρει
ο gcj είναι
κάτι παραπάνω από
ενδιαφερουσες.
Σε απλές υλοποιήσεις
μπορεί να φτάσει
ως και 50% αύξηση.
Βέβαια δεν είναι
όλα ωραία έτσι ο gcj δεν μπορεί
να κάνει compile
διάφορες κλάσεις
και χαρακτηριστικά
που βρίσκονται
σε σχετικά νέες
εκδόσεις του JDΕ (όπως το Swing). Πληροφορίες
για τον gcc
και την ειδική
του έκδοση gcj
μπορούν να βρεθούν
εδώ http://www.gnu.org
.
Επίλογος
Όπως και
να έχει το μέλλον
φαίνεται ιδιαίτερα
λαμπρό και σίγουρα
οι διάφορες αυτές
εναλλακτικές
απόψεις κερδίζουν
όλο και περισσότερους
θαμαστές και
χρηστές, κάτι που
υποδηλώνει και
την ανοιχτή άποψη
των χρηστών ενος
ανοιχτού λειτουργικού
όπως το Linux!
Κωνσταντινίδης
Πάνος
Aποστολόπουλος Πάρις
|