Java και Linux

Καιρός να δούμε ένα είδος καφέ λιγάκι διαφορετικό από αυτόν που πίναμε ως τώρα...την Java.

1. Java - Τι σόι καφές είναι αυτός; (History/Internals)

2. Χμμμ, ενδιαφέρον άρωμα... (Features/Applications)

3. Μα γιατί δε μοιάζει με αυτόν που ήπια χθες; (Minor Problems)

4. Ωραία... και πώς τον σερβίρουμε στο Linux-άκι; (Linux Installation Notes)

5. Διαβάζοντας το φλιτζάνι (Java in the (not..so..) working world)

6. Κώδικας και άλλα

[1. Java - Τι σόι καφές είναι αυτός; (History/Internals)]

[1.1 Ιστορική Αναδρομή:]

Το 1991 η Sun αναλαμβάνει να φτιάξει μία πλατφόρμα εφαρμογών (σε C++) ικανή για να τρέξει εφαρμογές σε μία μεγάλη γκάμα υπολογιστικών συστημάτων. Μέσα από το project αυτό, γεννήθηκε μία γλώσσα προγραμματισμού, ονόματι Oak.

Το 1994, βλέποντας την ταχύτητα με την οποία αναπτύσσεται το World Wide Web, η Sun προσθέτει ορισμένα Web-extensions στην Oak και την μετονομάζει σε Java.

Το 1995 οι Αlpha eκδόσεις της Java και της HotJava διανέμονται δωρεάν εκ του δικτύου για τις πλατφόρμες των Solaris και ΝΤ. Σύντομα γίνονται και τα ports σε Linux και Win95.

Στις αρχές του 1996 κυκλοφορεί η έκδοση 1.0. Τόσο το Netscape όσο και o Internet Explorer υποστηρίζουν Java, σε server και εσωτερική (browser) μορφή. Μετά από _αρκετά_ bug και security fixes, η εταιρεία ανεβάζει στο Web την Βeta έκδοση της σειράς 1.1. Διαθέτει εκτός των άλλων: RMI (κλήση συναρτήσεων εξ αποστάσεως), functions για ανταλλαγή πληροφοριών με βάσεις δεδομένων, μοντέλα για κρυπτογραφικές ρουτίνες και πολλά άλλα...

Η πρώτη επίσημη έκδοση της σειράς 1.1 βγαίνει το Μάρτιο του ΄97. Αυτή τη στιγμή η τελευταία σταθερή έκδοση για Linux είναι η 1.1.7v3 αν και υπάρχει έκδοση της σειράς 1.2 (JDK 1.2 pre-v1).

Το παρακάτω link[1] δίνει περισσότερες πληροφορίες για τις διαφορές από release σε release. Θα φανεί ιδιαίτερα χρήσιμο στο προγραμματιστικό κοινό, καθώς οι αλλαγές που έχουν επέλθει από την έκδοση 1.1 στην 1.2 είναι αρκετές και θεμελιώδεις.

1: http://java.sun.com/products/jdk/1.2/docs/relnotes/features.html

[1.2 Εσωτερική Δομή:]

Η Java ανήκει στην κατηγορία των interpreted γλωσσών. Όταν θα τρέξουμε το πρόγραμμά μας, ο υπολογιστής δεν θα διαβάσει κατ΄ευθείαν ένα binary executable, αλλά μια σειρά εντολών, που με τη σειρά της θα γίνει compiled την ώρα της εκτέλεσης. Εμπειρικά μπορούμε να πούμε, ότι αυτό θα κάνει το πρόγραμμά μας, 10-20 φορές πιο αργό απ΄το αντίστοιχο πρόγραμμα,γραμμένο σε C.

Η Java χρησιμοποιεί μία εικονική μηχανή, ένα Virtual Machine, το οποίο αναλαμβάνει να πάρει τον κώδικα σε μια semi-compiled μορφή (ονομαζόμενη byte code[2]) και κατά την εκτέλεση, να τον μετατρέψει σε machine-dependent κώδικα. Εκτός, όμως, από αυτή τη λειτουργία, το Java Virtual Machine θα μπορούσε να χαρακτηριστεί και ως "κουτί ασφαλείας". Ελέγχει και προστατεύει το πρόγραμμα από τυχόν "παράνομες" κλήσεις, προσπαθώντας να αποτρέψει ένα γενικότερο κακό (π.χ. το πρόγραμμα να απο φασίσει ξαφνικά να φάει όλα τα memory resources του λειτουργικού μας) ή τουλάχιστον να δώσει όσο περισσότερες debugging πληροφοριές γίνεται περί του "τι έγινε" πριν το κακό :)

2: 05_java-6.html#part1a

Εφόσον είναι στην ευθύνη του JVM να φτιάξει τον κατάλληλο κώδικα για την πλατφόρμα μας... αυτό μας επιτρέπει να κυκλοφορούμε από μηχάνημα σε μηχάνημα με τον ίδιο :) Java semi-compiled κώδικα. Με άλλα λόγια, παίρνουμε τον πηγαίο κώδικά μας, τον κάνουμε compile με κάποιο εργαλείο (όπως το javac) που φτιάχνει "byte-code" κώδικα, και το νέο αρχείο με κατάληξη ".class" μπορούμε να το τρέξουμε κάτω από οποιοδήποτε JVM είτε αυτό βρίσκεται σε PC, είτε σε SUN-ακι είτε σε κάποια άλλη supported πλατφόρμα...

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

--------------------------------------------------------------------------------

\ Εφαρμογή

--------------------------------------------------------------------------------

[2. Χμμμ, ενδιαφέρον άρωμα... (Features/Applications)]

H Java αποτελεί μία object oriented γλώσσα. Η πλειοψηφία των έτοιμων functions αποτελούν μέρος των αρμόδιων classes και έτσι ο νέος χρήστης συναντά από νωρίς όρους, όπως το object και την τεχνική του inheritance.

Η γλώσσα επιτρέπει σε μια δικιά μας class, να αποτελεί γόνο περισσότερων από μιας αρχέτυπων classes.Αυτό όμως δεν σημαίνει ότι η νέα class θα περιέχει τον κώδικα τών αρχέτυπων. Απλά, εξασφαλίζει με αυτόν τον τρόπο ότι στη νέα class θα υπάρχουν όλες οι functions που υπήρχαν στις πατρικές ΟΝΟΜΑΣΤΙΚΑ. Έτσι, θα είμαστε σίγουροι ότι μία class που κατάγεται από την Class Skylo και Class Gata, και θα νιαουρίζει και θα γαβγίζει (έχοντας γράψει και τον κατάλληλο κώδικα φυσικά). Classes σαν τον σκύλο και τη γάτα, που λειτουργούν ως αρχέτυπα και εξασφαλίζουν ότι ένας συγκεκριμένος αριθμός από functions θα υπάρχουν σε κάθε class που κατάγεται από αυτές, ονομάζονται interfaces και δεν περιεχουν implementation παρά μόνο function headers. Συνεπώς, σε μία function που περιμένει ως παράμετρο ένα interface, μπορούμε να περάσουμε κάθε class που κάνει implement αυτό τo interface[3]

3: 05_java-6.html#part2a

H Java αποτελεί μία εν γένει threaded γλώσσα. Βασικές της λειτουργίες όπως το αυτόματο garbage collection, o Audio Player, η διαχειριση των events σε γραφικό περιβάλλον αλλά και η ίδια η function main(), αναλαμβάνονται από ξεχωριστά threads κατά την εκτέλεση του προγράμματος. Τα threads αυτά τρέχουν παράλληλα και ο διαμερισμός του χρόνου για κάθε διεργάσια ίδιου priority προσδιορίζεται από το λειτουργικό σύστημα.

Προσοχή θα πρέπει να δοθεί στο γεγονός ότι η Java διαβάζει και γράφει σε unicode και όχι σε ASCII.

Aς δούμε όμως μερικά σημεία της γλώσσας που την κάνουν ιδιαίτερα επιθυμητή στο σημερινό προγραμματιστικό κοινό.

Λόγω threading είναι ιδανική για τη συγγραφή προγραμμάτων σχετικά με δικτυακές εφαρμογές. Π.χ. σε ένα server application το πρόγραμμα μπορεί να χρησιμοποιήσει ένα thread για να ακούει σε μια port και κάθε φορά που δέχεται ένα incomming connection, να ξεκινά ένα καινούριο thread[4] για να αναλαμβάνει τις υπηρεσιές του connection αυτού. Έτσι δεν χρειάζεται να παίζουμε με fork() και if-then-else structures ώστε να χωρίζουμε τον κώδικα μεταξύ του αρχικού server και των forked παιδιών του (ό πως γίνεται στη C).

4: 05_java-6.html#part2b

Eκτός αυτού, το threading μάς επιτρέπει να δώσουμε σε βαριά προγράμματα μια νέα αρχιτεκτονική, όπου κάποιες διεργασίες θα εκτελούνται παράλληλα, επιτρέποντας καλύτερη αξιοποίηση της υπολογιστικής δύναμης ενός multi-processor συστήματος.

Όσον αφορά το σχεδιασμό προγραμμάτων με GUI, εκτός από την πληθώρα των classes υπεύθυνες για τέτοιες διεργασίες, δίνεται στο χρήστη η δυνατότητα να επιλέξει το είδος των widgets που θα βγάλει στη φόρμα του. Για παράδειγμα μπορεί είτε να χρησιμοποιήσει τα default widgets του ήδη υπάρχοντος window manager είτε (για περισσότερη ταχύτητα) τα predefined widgets του swing, που έχουν σχεδιαστεί σε java και είναι όμοια για όλες τις πλατφόρμες.

Η εξοικείωση με το συντακτικό της γλώσσας δεν αργεί πολύ καθώς είναι παραπλήσιο με αυτό της C. H Java κρύβει από το χρήστη τα pointer semantics και έτσι το παιχνίδι με τα objects/classes γίνεται πολύ ευκολότερο απ΄ότι στη C++.

Έστω ότι μία function χρειάζεται ως παράμετρο την instance μιας class που δεν πρόκειται να ξαναχρησιμοποιήσουμε στο υπόλοιπο πρόγραμμα. Η Java μάς επιτρέπει να φτιάξουμε επί τόπου μια "anonymous inner class" και να κάνουμε τη δουλειά μας χωρίς άλλα declarations. Ή για παράδειγμα, αν χρειαστούμε, για ένα μικρό κομμάτι κώδικα, να κάνουμε override μια method μιας ήδη υπάρχουσας class... :) η "anonymous inner class" θα μας λύσει τα χέρια[5].

5: 05_java-6.html#part2c

Η ελαστικότητα που προσφέρεται με τα threads παρατηρείται και στο event handling. Οι λεγόμενοι adapters και event listeners μάς δίνουν τη δυνατότητα να κάνουμε register ένα event μιας class σε περισσότερους από έναν listeners. Με αυτό τον τρόπο μπόρουμε να έχουμε ένα button στη φόρμα μας που αλλάζει times σε διάφορα objects χωρίς να χρειάζεται explicit reference στις συγκεκριμένες instances και methods των objects αυτών (που θα αναλάβουν το event).

Oι βιβλιοθήκες από functions είναι οργανωμένες σε μορφή πακέτων (packages). Αυτές που αρχίζουν από java (ή sun) είναι οι default που δίνονται με το jdk από τη Sun. Γράφοντας import java.awt.* δίνουμε στο πρόγραμμα μας πρόσβαση σε όλες τις classes του πακέτου AWT (υπεύθυνο για ρουτίνες σε γραφικό περιβάλλον). Τα αρχεία .jar αποτελούν τον ενδεδειγμένο τρόπο συμπίεσης πακέτων. Όποτε ο java interpreter χρειαστεί μια class απο ενα τέτοιο πακέτο, θα το αποσυμπιέσει αυτόματα. Τα περιβόητα Java Beans δεν αποτελούν τ ίποτα παραπάνω από συμπιεσμένα packages, που χρησιμοποιούνται ως components, σε εργαλεία visual προγραμματισμού όπως ο Java Builder.

Εκτός από την απλή σχεδίαση γραφικών, μπορεί κανείς να βρει packages υπεύθυνα για επεξεργασία αντικειμένων σε 3d, classes για φιλτράρισμα ήχου, προβολή και επεξεργασία video, methods που απλουστεύουν τη χρήση των sockets στα networking apps, message encryption και signing (με επιλογή στους αλγόριθμους που θα χρησιμοποιηθούν) και πολλά πολλά άλλα.

Δεδομένου ότι η Sun ήταν η μαμά του RPC (remote procedure call), δεν θα μπορούσαν να αφήσουν απ΄έξω την RMI (remote method invocation) τεχνολογία. Σύμφωνα με το RMI, ένα object που τρέχει σε μια Virtual Machine μπορεί να καλέσει (μέσω δικτύου) μια method ενός object που υπάρχει σε μια άλλη virtual machine. Για να γίνουν τα πράγματα πιο λιανά, φανταστείτε ότι έχετε κάνει semi-compile ένα πρόγραμμα και το έχετε εγκαταστήσει σε ένα μηχάνημα ενός δικτύου. Χρησιμοποιώντας λιγοστά αρχεία (που περιέχουν πληροφορίες για το πώς θα καλέσουν τις methods στο server μηχάνημα) θα μπορούσατε να κάνετε όλα τα μηχανήματα στο LAN auto clients[6] αυτού του προγράμματος (χωρίς φυσικά να αντιγράψετε ολόκληρο το software σας στο δίσκο κάθε μηχανήματος).

6: 05_java-6.html#part2d

Τα Java Applets αποτελούν εκτελέσιμα αρχεία της java, κατασκευασμένα για να τρέξουν από τον web-browser κάθε χρήστη που θα τα κατεβάσει από το net. Στην ουσία καλούνται από τα {APPLET CODE="koko.class"} tags της σελίδας που παρακολουθεί ο χρήστης. O web-browser πρίν τα τρέξει στη μικρή του jvm, θα τα ερευνήσει για οποιεσδήποτε παράνομες κλήσεις (π.χ. διάβασμα από τον τοπικό σκληρό δίσκο κλπ. κλπ.).

[3. Μα γιατί δε μοιάζει με αυτόν που ήπια χθες; (Minor Problems)]

Όσοι από μας προγραμματίζουν με :) άκρως ντετερμινιστική λογική, θα πρέπει να είναι αρκετά προσεχτικοί με την Java. Όπως προαναφέραμε, πρόκειται για μια εν γένει Threaded γλώσσα, που αφήνει το priority scheme να το ελέγξει το λειτουργικό σύστημα.

Συνεπώς:

Προκειμένου να αποφύγουμε προβλήματα που προκύπτουν από την ντετερμινιστική μας λογική :) θα ήταν προτιμότερο να προγραμματίζουμε με ένα event-driven μοντελό στο μυαλό (παρά με τον κλασικό σειριακό τρόπο : μετά από αυτό - θα κάνω αυτό). Τα threads γίνονται πολύ φιλικότερα όταν χρησιμοποιούνται σωστά :)

Ο Java Virtual Machine κάνει μια σειρά από checks πριν τρέξει το semi-compiled κώδικα. Αυτά τα checks αφορούν τον τρόπο με τον οποίο φορτώνονται οι classes και τα operations που εμπεριέχονται στις methods τους. Ακόμα και για πολύ απλά προγραμματάκια αυτή η διαδικασία είναι πολλές φορές επίπονη. Γι΄αυτό θα συνιστούσα σε όποιον σκέφτεται να ασχοληθεί κατά κόρον με τον προγραμματισμό στην java, να χρησιμοποιήσει είτε compiler που βγάζει native executable είτε να ψάξει για μηχάνημα άνω των 200mhz.

[4. Ωραία... και πώς τον σερβίρουμε στο Linux-άκι; (Linux Installation Notes)]

To www.blackdown.org είναι υπεύθυνο για τα ports της java σε linux. Αναλόγως με το αν έχουμε libc h' glibc κατεβάζουμε την ανάλογη έκδοση του jdk (java development kit) και το βάζουμε στο αγαπημένο μας directory (συνήθως /usr/lib). Εκεί τραβάμε ένα

και είμαστε έτοιμοι :)

Εδώ λοιπόν βλέπουμε την δενδρική δομή αυτού του directory:

To αρχειάκι src.zip περιέχει τα sources της java (σε περίπτωση που δεν θέλουμε να χρησιμοποιήσουμε τις ήδη υπάρχουσες compilαρισμένες εκδόσεις) και στο README.linux.src περιέχονται οδηγίες για το compilation process.

Στο lib βρίσκονται όλα τα απαιτούμενα .so αρχεία μαζί με ένα σημαντικότατο αρχειάκι ονόματι classes.zip που περιέχει όλες τις classes (semi-compiled morfi .class) που έρχονται με το jdk. ΟΧΙ, ΔΕΝ ΧΡΕΙΑΖΕΤΑΙ ΝΑ ΤΟ ΑΠΟΣΥΜΠΙΕΣΕΤΕ! :)

Στις παλαιότερες εκδόσεις του jdk, o compiler της java απαιτούσε την ύπαρξη μιας shell variable, ονόματι $CLASSPATH, που έδειχνε σε αυτό το αρχείο (classes.zip) αλλά και σε οποιαδήποτε άλλα directories, τα οποία περιείχαν ".class" αρχεία που θα χρησίμευαν στο πρόγραμμά σας. Σύμφωνα με το documentation του jdk1.1.7 αυτή η variable δεν χρησιμοποιείται πια. Για καλό και για κακό όμως (και για όσους από εσάς έχουν τσιμπήσει παλιότερο jdk) καλό θα ήταν στο /etc/profile να βάλετε:

Όσοι από σας χρησιμοποιούν tsch :) ας παίξουν με την setenv.

Έτσι έχουμε στο CLASSPATH το παρόν directory εργασίας, το directory που περιέχει το classes.zip και ένα directory κάτω από το home μας με όνομα java.

To directory bin περιέχει τα binaries του JDK. Εφόσον δεν είμαστε αρκετά τρελοί για να τα καλούμε με τα full path names, θα ήταν καλό να βάλουμε το directory αυτό στο PATH μας (/usr/lib/java117_v1a/bin). Έτσι θα έχουμε πρόσβαση από παντού στα παρακάτω εργαλεία:

:) Ο compiler μας...παίρνει αρχεία με κώδικα σε java (.java) και τα μεταφράζει σε bytecode.

O κύριος που αναλαμβάνει να ανεβάσει το προγραμματάκι μας πάνω στην virtual machine. Με άλλα λόγια, :) τρέχει τα προγράμματά μας.

Δίνει πληροφορίες για το τί γίνεται στην Virtual Machine, κατά την εκτέλεση του προγράμματος.

Είναι μια ελαφριά έκδοση του παραπάνω. Χρησιμοποιείται κυρίως από τους κυρίους που *απλώς θέλουν να τρέξουν το πρόγραμμα*.

Ένα όμορφο εργαλείο για να τεστάρετε locally τα applets σας.

Ψάχνει για ζωύφια στα προγράμματά σας :)

Aυτό το όμορφο προγραμματάκι εκτός από το ότι τραβάει τα declarations από ένα .class αρχείο (ναι, ναι, compilαρισμένο αρχείο) σας μεταφράζει και τα byte-code περιεχόμενα αυτού του αρχείου (δηλ. τις εντολές που θα δωθούν στην virtual machine).

Τελικά είναι της μόδας αυτές τις μέρες, κάθε γλώσσα προγραμματισμού να έχει και από ένα προγραμματάκι που διαβάζει τον κώδικα και από ειδικά comments, να παράγει μια HTML σελίδα με το documentation του προγράμματος.

To προγραμματάκι αυτό θα βοηθήσει όσους θέλουν να βάλουν εξωτερικές functions (της C) μέσα στον java κώδικά τους (για περισσότερες πληροφορίες κοιτάξτε στο API documentation).

Μεταξύ άλλων, μαζεύει τα .class αρχεία και τα συμπιέζει σε ένα αρχείο. Φτιάχνει κάτι σαν μία συμπιεσμένη βιβλιοθήκη από classes :)

Θα χρησιμοποιηθεί από προγράμματα που χρειάζονται πιστοποίηση για την αυθεντικότητα ορισμένων κομματιών κώδικα.

Mετατροπή από native encoding (unicode) σε ascii με τη χρήση του \udddd escape convention.

Χρησιμοποιείται στο RMI και φτιάχνει τα stubs που θα χρησιμοποιήσουν τα τερματικά σας :) προκειμένου να τρέξουν το πρόγραμμα του server.

Χρησιμοποιείται στο RMI και συνθέτει ένα registry για τα objects που θα διαθέσει o server, στους clients.

Επιστρέφει την έκδοση μιας class.

Aς δούμε όμως ένα απλό παράδειγμα από compilation. Κατ΄αρχήν ορίζουμε το όνομα του πακέτου που θα γράψουμε και φτιάχνουμε ένα directory με το όνομα του κάτω από το CLASSPATH:

Έστω ότι το πακέτο μας λέγεται "koko". Φτιάχνουμαι το άναλογο directory:

(Αν το πακέτο μας ονομαζόταν "kati.akoma.pio.megalo" θα έπρεπε να φτιάξουμε τα directories "kati/akoma/pio/megalo")

Αποφασίζουμε την κύρια class του προγράμματος να την ονομάσουμε "trella". Συνεπώς φτιάχνουμε ένα αρχειάκι με όνομα "trella.java" και τυπώνουμε μέσα τα παρακάτω:

Αφού σώσουμε το αρχειάκι, του τραβάμε και ένα compile :)

Όπως βλέπουμε δημιουργήθηκε το "trella.class" που περιέχει σε byte-code τον κώδικα που θα τρέξει η virtual machine (συγκρίνετε το μέγεθος του αρχείου με το μέγεθος του αντίστοιχου εκτελέσιμου της C).

Τώρα έχοντας ορίσει σωστά το όνομα του πακέτου, του directory και του CLASSPATH, μπορούμε από οποιοδήποτε σημείο του δίσκου μας, να καλέσουμε το πρόγραμμα (το syntax είναι java {package_name}.{main_class_name}).

Ψάχνοντας στο net, μπορεί κανείς να βρει πολλά βοηθητικά tools για προγραμματισμό σε Java κάτω από Linux. Από web-browsers για να τεστάρετε τα applets σας (netscape, hot-java) μέχρι IDE, visual programming interfaces αλλά και decompilers (όπως ο jad που παίρνει τα .class files και τα μεταφράζει σε source code). Εδώ θα βρείτε μία μικρή λίστα[7].

7: 05_java-6.html#part4a

Επίσης, κυκλοφορούν αρκετοί JVMs και από τρίτες εταιρείες (όχι μόνο από την Sun) με πιο γνωστό τον kaffe[8].

8: http://www.transvirtual.com

Σε περίπτωση που είστε λάτρης του CLI και δεν βρίσκετε κανένα λόγο για να χρησιμοποιήσετε κάποιο εργαλείο για Visual Programming, θα σας πρότεινα να σηκώσετε στο περιβάλλον των X, 2-3 rxvt's (για το γράψιμο debugging και testing του κώδικα) και ασφαλώς ένα web-browser για να διαβάζετε το API documentation του jdk. Για όσους από εσάς ξεκινούν τώρα με την Java, υπάρχει και ένα online tutorial στο http://www.java.sun.com[9]

9: http://www.java.sun.com

[5. Διαβάζοντας το φλιτζάνι (Java in the (not..so..) working world)]

Μέχρι στιγμής η Java προωθείται με σωστό τρόπο από τη Sun. Υποστηρίζεται από developers/πανεπιστήμια σε ολόκληρο τον κόσμο και όλα δείχνουν ότι μάλλον μέσα στα επόμενα χρόνια θα γίνει το προγραμματιστικό standard στο χώρο του connectionist computing.

Η "προστασία" από τις έννοιες των pointers, το εύκολο συντακτικό και οι έτοιμες ρουτίνες για γραφικά, επεξεργασία δεδομένων και δικτυακές εφαρμογές, καθιστούν την Java ένα πανίσχυρο εργαλείο για το άτομο που ξεκινά σιγά σιγά τον προγραμματισμό στο Linux.

Aλλά και οι πιο προχωρημένοι του είδους δεν θα μείνουν δυσαρεστημένοι. Οι pluggable αλγόριθμοι, η trusted host αρχιτεκτονική και το platform independent στυλ της Java θα τους λύσουν πολλές φορές τα χέρια, καθώς δίνουν τη δυνατότητα να γράψει κανείς εύκολα και γρήγορα customisable software, για χρήση σε μεγάλες (δικτυακές και μη) εφαρμογές.

Δύο απ'τα καλύτερα βιβλία που κυκλοφορούν στο εμπόριο, είναι:

1. "Java. How to program", των Deitel & Deitel (Prentice-Hall, 2nd Ed.,1997) και

2. "Java 1.1 Developer's Guide 2nd Edition", tou Jaworski

Για περισσότερες πληροφορίες ρίξτε μια ματιά στα:

http://www.java.sun.com[10]

http://www.blackdown.org[11]

http://www.datarepresentation.com[12]

10: http://www.java.sun.com

11: http://www.blackdown.org

12: http://www.datarepresentation.com

Special thanx to George Glynos & Pete "whatevah" Blindell.

[6. Κώδικας και άλλα]

[]{#part1a} Το Java Virtual Machine εκτελεί byte-code instructions. Για να δούμε πώς περίπου μοιάζουν αυτές ορίστε ένα παράδειγμα.

Περνώντας το παραπάνω πρόγραμμα απο τον Java disassembler (javap -c) παιρνουμε τα παρακατω:

Για περισσότερες πληροφορίες για την αρχιτεκτονική των Virtual Machines και τον ρόλο κάθε μιας απο τις instructions κοιτάξτε το Java Virtual Machine (των Meyer & Downing).

[]{#part2a} Προσέξτε πώς η class MyFrame κάνει implement τα interfaces ActionListener kai WindowListener. Σε όσες functions των interfaces δεν θέλouμε να γράψουμε κώδικα (π.χ. windowClosed) τις αφήνουμε κενές.

[]{#part2b} Ένας απλός echoserver με threads σε java.

Δημιουργήστε ένα directory "echo" κάτω από το $CLASSPATH και δώστε

[]{#part2c}

Προσέξτε πως παρακάμπτουμε το print method της Χ στην Α

[]{#part2d} Αν σας ενδιαφέρει ένα μικρό παράδειγμα του τί μπορεί να καταφέρει το RMI, στείλτε μου ένα mail στην διεύθυνση: dglynos@freemail.gr[13] για να σας στείλω ενα παιχνιδάκι :) γραμμένο σε Java.

13: mailto:dglynos@freemail.gr

[]{#part4a}

Αρχική Σελίδα