Skip to the content.

1.3 Ιστορία της γλώσσας προγραμματισμού Java

© Γιάννης Κωστάρας


< Δ >

Στο μάθημα 1.4 θα μάθουμε πώς να εγκαταστήσουμε το Jupyter Lab ώστε να μπορούμε να ανοίγουμε αρχεία .ipynb. Μέχρι τότε, μπορείτε να τα ανοίξετε στο Colab και επιλέγοντας Upload. Δυστυχώς δεν υποστηρίζει Java αλλά θα μπορέσετε να διαβάσετε το αρχείο.

Μαθησιακοί στόχοι

Σε αυτήν την ενότητα θα μάθουμε:

Γιατί Java;

Η Java παραμένει μια από τις πιο δημοφιλείς γλώσσες προγραμματισμού. Ξεκίνησε ως μια απλοποίηση της C/C++, αφαιρώντας όσα χαρακτηριστικά ήταν δύσκολα και πηγές λάθους, όπως π.χ. οι δείκτες (pointers) κλπ. Ορίστηκε από την αρχή ως μια αυστηρά αντικειμενοστραφής (object-oriented) γλώσσα προγραμματισμού. Άλλο σημαντικό χαρακτηριστικό της είναι ότι είναι ανεξάρτητη πλατφόρμας χάρις στην Εικονική Μηχανή Java - Java Virtual Machine με αποτέλεσμα να μη χρειάζεται επαναμεταγλώττιση του πηγιαίου κώδικα για να τρέξει σε άλλες πλατφόρμες (‘Write Once Run Everywhere’). Ακόμα είναι ασφαλής (μέσω του Sandbox δεν σας επιτρέπει να γράψετε εφαρμογές που μπορούν να αποκτήσουν πρόσβαση στους πόρους του Η/Υ στον οποίο εκτελείται) ενώ τέλος είναι πολυ-νηματική (multi-threaded).

Aν η παραπάνω παράγραφος σας φάνηκε ακαταλαβίστικη, μην ανησυχείτε, μέχρι το τέλος αυτού του μαθήματος θα έχετε καταλάβει τι εννοούμε.

Κατηγορίες γλωσσών προγραμματισμού

Στο προηγούμενο μάθημα μάθαμε για το τι είναι αλγόριθμος και τι πρόγραμμα. Μάθαμε ότι για να γράψουμε ένα πρόγραμμα χρειάζεται να χρησιμοποιήσουμε μια γλώσσα προγραμματισμού. Αλλά δεν υπάρχει μόνο μια, αλλά πολλές γλώσσες προγραμματισμού.

Οι διάφορες γλώσσες προγραμματισμού χωρίζονται σε διάφορες κατηγορίες ανάλογα με κάποια κριτήρια.

Ανάλογα με τον τρόπο εκτέλεσης, οι γλώσσες προγραμματισμού χωρίζονται σε:

Εικόνα 1.3.1 Διαδικασία μεταγλώττισης πηγαίου κώδικα

Εικόνα 1.3.2 Διαδικασία διερμήνευσης πηγαίου κώδικα

Ανάλογα με τον τρόπο εκτέλεσης, οι γλώσσες προγραμματισμού χωρίζονται ακόμα σε:

myvar = 5
myvar = 3.14

Παρατηρούμε ότι δεν δηλώνουμε ποιος είναι ο τύπος δεδομένων της myvar. Ανάλογα με την τιμή με την οποία αρχικοποιείται, ο διερμηνευτής καταλαβαίνει ότι αυτός είναι ακέραιος. Αργότερα, και ανάλογα με το αν το επιτρέπει η γλώσσα προγραμματισμού, ο τύπος δεδομένων μπορεί ν’ αλλάξει για τη μεταβλητή ή όχι. Π.χ. στο πιο πάνω παράδειγμα, στη myvar εκχωρείται στη συνέχεια ένας δεκαδικός αριθμός, δηλ. η συγκεκριμένη γλώσσα προγραμματισμού επιτρέπει να αλλάξει ο τύπος δεδομένων της μεταβλητής myvar.

int myvar1 = 5
double myvar2 = 3.14

Στις στατικές γλώσσες προγραμματισμού, υποχρεούμαστε να δηλώσουμε τον τύπο δεδομένων κάθε μεταβλητής. Ο τύπος δεδομένων δεν μπορεί να αλλάξει αργότερα για τη συγκεκριμένη μεταβλητή. Με τον τρόπο αυτό έχουμε καλύτερο έλεγχο των μεταβλητών μας που σημαίνει αποφυγή λαθών (bugs).

Ανάλογα με το μοντέλο προγραμματισμού που χρησιμοποιείται, χωρίζονται σε:

Οι στατικές γλώσσες προγραμματισμού στοχεύουν σε ταχύτερη εκτέλεση και μεγάλες εφαρμογές ενώ οι δυναμικές γλώσσες στοχεύουν σε ευκολία χρήσης και μικρότερες εφαρμογές.

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

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

Εικόνα 1.3.3 Διαδικασία μεταγλώττισης/διερμήνευσης πηγαίου κώδικα Java

Με απλά λόγια, ο πηγαίος κώδικας μεταγλωττίζεται σε bytecode ο οποίος διερμηνεύεται από την Εικονική Μηχανή της Java.

Η Εικονική Μηχανή της τρέχει πάνω σε διάφορες πλατφόρμες ανεξαρτήτως αρχιτεκτονικής, π.χ. Windows, Linux, Mac OS, Solaris. Επιτρέπει στα προγράμματα γραμμένα στη γλώσσα Java να μεταγλωττίζονται μόνο μια φορά και να μπορούν να εκτελούνται σε οποιαδήποτε πλατφόρμα χωρίς την ανάγκη επαναμεταλώττισης. (Write once run everywhere). Αυτό είναι διαφορετικό από άλλες γλώσσες, όπως π.χ. προγράμματα γραμμένα σε C/C++ όπου κάθε φορά ο κώδικας θα πρέπει να μεταγλωτίζεται σε κάθε διαφορετική πλατφόρμα. (Δηλ. το εκτελέσιμο για Windows δεν μπορεί να εκτελεστεί σε Linux). Αντιθέτως, ένα πρόγραμμα Java που μεταγλωττίστηκε στα Windows μπορεί να εκτελεστεί σε Linux ή MacOSX χωρίς επαναμεταγλώττιση.

Εικόνα 1.3.4 Η Εικονική Μηχανή της Java (Java Virtual Machine)

Όπως φαίνεται στο παραπάνω σχήμα, ο πηγαίος κώδικας (.java) μεταγλωττίζεται σε κώδικα bytecode (.class). Κατά την εκτέλεση του προγράμματος, η Εικονική Μηχανή (Ε.Μ.) Java φορτώνει και ελέγχει τις κλάσεις και στη συνέχεια τις εκτελεί με τον διερμηνευτή (Java Interpreter). Ο μεταγλωττιστής Just In Time (JIT) ψάχνει για τμήματα κώδικα που εκτελούνται περισσότερο (hot spots) και τα μεταγλωττίζει για γρηγορότερη εκτέλεση.

Ολίγη ιστορία

Η γλώσσα προγραμματισμού Java ιδρύθηκε το 1991 και αρχικά ονομάστηκε “Δρυς” (Oak) από μια ομάδα προγραμματιστών υπό τον James Gosling στη Sun Microsystems με στόχο την αυτοματοποίηση των οικιακών συσκευών. Τα επόμενα δύο χρόνια ήταν απογοητευτικά για τη γλώσσα μέχρι το 1994, όταν η ομάδα ανάπτυξης επαναπροσδιορίζει τη γλώσσα με στόχο την κοινότητα του Internet. Η Oak μετονομάζεται σε “Java” από το μάρκετινγκ.

Εικόνα 1.3.5 Ο πατέρας της Java James Gosling

Ο Netscape Navigator 2.0 υποστηρίζει τη γλώσσα το Σεπτέμβριο του 1995 με τη μορφή των μη αυτόνομων εφαρμογών Java applets. Η Microsoft ενσωματώνει τη γλώσσα στον Internet Explorer στο τέλος του 1995.

Από τότε, οι δυνατότητες της γλώσσας απογειώνονται. Το 1996 η Sun αναπτύσσει το Java Development Kit 1.02. Το επόμενο έτος, η έκδοση 1.1 υποστηρίζει JavaBeans. Το 1997 η Sun κατηγορεί τη Microsoft για παραβίαση της συμφωνίας όσον αφορά την Java στον Internet Explorer 4.

Η Sun αναπτύσσει το JDK 1.2 και το Swing, το οποίο αντικαταθιστά την βιβλιοθήκη γραφικών AWT (Abstract Window Toolkit), για την ανάπτυξη GUIs (γραφικών εφαρμογών). Επειδή οι αλλαγές είναι πολύ μεγάλες σε σχέση με τις εκδόσεις 1.02 και 1.1, αποφασίζει να την ονομάσει “Java 2”.

Ακολουθούν οι εκδόσεις 1.3 και 1.4 (εισαγωγή του JDBC για επικοινωνία με βάσεις δεδομένων). Οι εκδόσεις 1.2, 1.3 και 1.4 αποτελούν τη “Java 2”. Από την έκδοση 1.5, οι αλλαγές είναι πάλι μεγάλες, και πλέον αλλάζει πάλι η ονομασία της έκδοσης σε Java 5. Η Java 5 ήταν η πρώτη ουσιαστική αλλαγή του πυρήνα της γλώσσας απ’ τη δημιουργία της, έτσι ώστε να υποστηρίζει γενικευμένουν τύπους (Generics), απαριθμημένους τύπους (Enumerated Types), autoboxing, varargs, annotations, static imports και νέες δυνατότητες για πολυνηματισμό (multi-threading). Η έκδοση 6 καταφέρνει να είναι 30% ταχύτερη από τις προηγούμενες εκδόσεις, ενώ η έκδοση 7 φέρνει μικρές βελτιώσεις στη γλώσσα. Είναι η εποχή που η Sun Microsystems εξαγοράζεται από την Oracle. Η έκδοση 8 φέρνει σημαντικές αλλαγές στη γλώσσα παρέχοντάς της δυνατότητες συναρτησιακού (λ-) προγραμματισμού αλλάζοντας κατά πολύ τον τρόπο χρήσης της. Η πολυαναμενόμενη έκδοση 9 έφερε δυνατότητες τμηματοποίησης (modularisation) της γλώσσας δίνοντας τη δυνατότητα να δημιουργήσετε την δική σας εφαρμογή που να περιλαμβάνει μόνο τα modules της γλώσσας που χρειάζεται η εφαρμογή σας για να τρέξει. Από την έκδοση 10 και μετά, η Oracle αποφάσισε να εκδίδει μια νέα (minor) έκδοση Java κάθε 6 μήνες (και μια major έκδοση κάθε δυο χρόνια). Η πρώτη έκδοση με μακροπρόθεσμη υποστήριξη (Long Time Support - LTS) είναι η 11. Εμείς θα μάθουμε την τελευταία LTS έκδοση, την έκδοση 17. (Εκδόσεις Java SE και JDK Releases).

Έκδοση Java Κωδική ονομασία Τέλος εποχής Ημερομηνία έκδοσης Αρ. δημοσίων κλάσεων*
Java 17 - - 14/09/2021  
Java 16 - - 16/03/2021  
Java 15 - - 15/09/2020  
Java 14 - - 17/03/2020  
Java 13 - - 17/09/2019  
Java 12 - - 19/03/2019  
Java 11 - - 25/09/2018 4410
Java 10 - - 20/03/2018 6002
Java 9 - - 27/07/2017 6005
Java 8 Spider 31/12/2020 18/03/2014 4240
Java 7 Dolphin 14/04/2015 28/07/2011 4024
Java 6 Mustang 16/04/2013 23/12/2006 3793
Java 5 Tiger 4/11/2009 04/10/2004 3279
Java 1.4 Merlin <4/11/2009 06/02/2002 2991
Java 1.3 Kestrel <4/11/2009 08/05/2000 1842
Java 1.2 Playground <4/11/2009 08/12/1998 1520
Java 1.1 - <4/11/2009 19/02/1997 504
Java 1.02 Oak <4/11/2009 21/01/1996 212

*αριθμός δημοσίων κλάσεων του πλαισίου ‘all classes’ του javadoc API

Μια σύνοψη των αλλαγών στις διάφορες εκδόσεις:

Ο ακόλουθος πίνακας παρέχει μια εύκολη αναφορά για να δείτε τι έχει αλλάξει ανάμεσα στις τελευταίες εκδόσεις της γλώσσας.

Έκδοση Java 9 (09/2017) 10 (03/2018) 11 (09/2018) 12 (03/2019) 13 (09/2019) 14 (03/2020) 15 (09/2020) 16 (03/2021) 17 (09/2021)
JEPs jdk9 jdk10 jdk11 jdk12 jdk13 jdk14 jdk15 jdk16 jdk17
JSRs 379 383 384 386 388 389 390 391 392
Διορθώσεις Bugs Bugs Bugs Bugs Bugs Bugs Bugs Bugs Bugs
Release Notes Release Notes Release Notes Release Notes Release Notes Release Notes Release Notes Release Notes Release Notes Release Notes

Η ιστοσελίδα Java Almanac περιλαμβάνει λεπτομερείς πληροφορίες για τις διάφορες εκδόσεις καθώς και τι αλλάζει από έκδοση σε έκδοση με δυνατότητα να δοκιμάσετε τα νέα χαρακτηριστικά κάθε έκδοσης απευθείας στον πλοηγό σας. Αξίζει να την επισκεφθείτε.

Εικόνα 1.3.6 Αρχιτεκτονική της Java Standard Edition (Πηγή: https://tinyurl.com/y9y2meap)

Εν τω μεταξύ, μετά το JDK 1.3 εμφανίστηκε και η Java Enterprise Edition (JEE) 1.3 η οποία στοχεύει στην ανάπτυξη επιχειρηματικών εφαρμογών (κοινώς το Web). Περιλαμβάνει τεχνολογίες όπως Enterprise JavaBeans (EJBs), servlets, Java Server Pages, Java Server Faces κ.ά. Σήμερα βρίσκεται στην έκδοση 10, με πολλές δυνατότητες και ευκολία χρήσης σε σχέση με τις προηγούμενες εκδόσεις (1.3, 1.4, 5, 6, 7, 8, 9). Παράλληλα, έχουν αναπτυχθεί πολλά frameworks για ανάπτυξη επιχειρηματικών εφαρμογών (ή εφαρμογών ιστού) βασισμένα στη Java, όπως το Apache Tapestry, το Apache Struts, το Play και το Spring για να αναφέρουμε τα πιο γνωστά.

Εικόνα 1.3.7 Αρχιτεκτονική της Java Enterprise Edition

Βασικά συστατικά μιας εφαρμογής JEE είναι:

Η JavaEE πλέον διαμένει στο νέο της ‘σπίτι’ και ονομάζεται Jakarta EE.

Αλλά η Java έχει γίνει πολύ γνωστή και στον κλάδο των κινητών εφαρμογών με τη Java Micro Edition (JME) που αποτελεί ανταγωνιστή του Android και του iOS.

Εικόνα 1.3.8 Αρχιτεκτονική της Java Mobile Edition (Πηγή: https://tinyurl.com/ycfgxymh)

Τέλος, για μικροσυσκευές όπως π.χ. το Raspberry Pi, υπάρχει και η Java Embedded.

Η Java έχει προκαλέσει περισσότερο ενθουσιασμό από οποιαδήποτε άλλη εξέλιξη στο Διαδίκτυο από την εποχή του Mosaic. Είναι μια γλώσσα προγραμματισμού για κατανεμημένες εφαρμογές. Έχει γίνει παγκοσμίως γνωστή ωστόσο, επειδή επιτρέπει στους χρήστες να αλληλεπιδρούν με τις ιστοσελίδες. Ένα πολύ βασικό χαρακτηριστικό που αποτέλεσε κι έναν από τους κυριότερους λόγους διάδοσης της γλώσσας είναι ότι είναι ανεξάρτητη πλατφόρμας (‘Write Once Run Everywhere’). Αυτό σημαίνει ότι γράφετε κώδικα μια φορά και αυτός τρέχει σε οποιαδήποτε πλατφόρμα που έχει εγκατεστημένο το Java Virtual Machine.

Με το JDK 1.2, η Java έγινε η πιο ελκυστική γλώσσα για την κατασκευή φιλικών προς το χρήστη γραφικών περιβάλλοντων με τη χρήση του Swing. Το JavaFX, ο ανταγωνιστής των Adobe AIR και MS Silverlight, αποτελεί το νέο framework της γλώσσας για ανάπτυξη γραφικών εφαρμογών (αντικαθιστά το Swing).

Για να δούμε και μια άλλη γνώμη όμως, ο Stroustrup υποστηρίζει ότι ≪… η Java δεν είναι ανεξάρτητη πλατφόρμας. Είναι μια πλατφόρμα. Όπως και τα Windows, είναι μια ιδιόκτητη εμπορική πλατφόρμα. Δηλαδή, μπορείτε να γράψετε προγράμματα για Windows / Intel ή για Java / JVM, και σε κάθε περίπτωση γράφετε κώδικα για μια πλατφόρμα που ανήκει σε μία εταιρεία και για το εμπορικό όφελος των εν λόγω εταιριών. Έχει επισημανθεί ότι μπορείτε να γράψετε τα προγράμματα σε οποιαδήποτε γλώσσα για τη JVM και τα συναφή λειτουργικά συστήματα. Ωστόσο, η JVM, κλπ., είναι σε μεγάλο βαθμό μεροληπτική υπέρ της Java. Δεν είναι πουθενά κοντά σε μια γενική, λογικά, ουδέτερη γλώσσα VM/Λ.Σ. …≫

Αν και τα επιχειρήματα του Stroustrup, του δημιουργού της C++ ήταν αληθή έως ένα βαθμό μέχρι πρότεινος, πρόσφατα η Oracle “άνοιξε” τον κώδικα τόσο της Java SE όσο και της Java EE. Επίσης, η ΕΜ (JVM) αποτελεί πλέον την πλατφόρμα για πολλές άλλες γλώσσες προγραμματισμού οι οποίες μπορούν να τρέξουν σ’ αυτή, όπως Groovy, Ruby (JRuby), Python (Jython), Go, Erlang (Erjang), Clojure κ.ά. κάνοντάς τη μια πραγματικά πολύγλωσση (polyglot) εικονική μηχανή.

Η Java έγινε πλέον ανοικτού κώδικα με το OpenJDK, η πρώτη έκδοση του οποίου κυκλοφόρησε για το Ubuntu και διανέμεται πλέον μ’ αυτό αλλά και το Jakarta EE.

Εν τω μεταξύ, η Microsoft δημιούργησε τον κύριο ανταγωνιστή της Java μέσω της πλατφόρμας της .NET, που ονομάζεται C#, μια γλώσσα που απορρέει από την Java και τη C++ κι αυτός ήταν κι ένας από τους λόγους των πολλών αλλαγών που επήλθαν στη Java στην έκδοση 5 και μετά για να μπορέσει να ανταγωνιστεί την C#. Η JVM μπορεί να θεωρηθεί ως η εξ’ ορισμού πλατφόρμα για τα συστήματα Unix/Linux και στον αντίποδα το .NET για την πλατφόρμα Windows. Παρόλ’ αυτά, τόσο η JVM υποστηρίζεται από τα Windows αλλά πλέον το .ΝΕΤ υποστηρίζεται και από τις πλατφόρμες Linux.

Το 2009 ο ήλιος της Sun έσβησε μετά την εξαγορά της από την Oracle, η οποία μάλιστα ισχυρίζεται, ότι η Java ήταν ο κύριος λόγος εξαγοράς της Sun καθώς το μεγαλύτερο μέρος του middleware της Oracle είναι γραμμένο σε Java. Αν και οι εξελίξεις έδειχναν αρνητικές, καθώς ο CEO της SUN παραιτήθηκε κι ακολούθησε κι η παραίτηση του ‘πατέρα’ της Java, του James Gosling, και μετά από πολλές περιπέτειες, η Oracle κατάφερε να βγάλει πολλές επιτυχημένες εκδόσεις της Java και πλέον μια νέα έκδοση βγαίνει κάθε 6 μήνες.

Οι δημιουργοί της γλώσσας έγραψαν ένα άρθρο (white paper) που εξηγεί τη φιλοσοφία πίσω από τους σχεδιαστικούς στόχους της γλώσσας και πώς να τους επιτύχουν. Συνοπτικά οι στόχοι αυτοί είναι:

  1. Απλή (απλοποίηση της C++) (Simple)
  2. Αντικειμενοστραφής (Object-Oriented)
  3. Κατανεμημένη (Distributed)
  4. Στυβαρή (Robust)
  5. Ασφαλής (Secure)
  6. Ουδέτερη αρχιτεκτονικής (Architecture-Neutral)
  7. Φορητή (Portable)
  8. Διερμηνευόμενη (Interpreted)
  9. Υψηλής απόδοσης (High-Performance)
  10. Πολυνηματική (Multithreaded)
  11. Δυναμική (Dynamic)

ενώ μια περίληψη των 11 παραπάνω όρων (buzzwords) μπορείτε να διαβάσετε εδώ.

Πηγές

  1. Java History.
  2. JAVATM TECHNOLOGY: AN EARLY HISTORY.
  3. Α brief history of the Green Project.
  4. Horstmann C. S. (2021), Core Java - Volume I - Fundamentals, 12th Edition, Oracle Press.
  5. Kabutz H. (2002), “Once Upon an Oak…”, JavaSpecialists Newsletter 055.
  6. Wikipedia, Java Programming Language.
  7. Liguori R. & Liguori P. (2014), Java 8 Pocket Guide, O’Reilly.
  8. Oracle Java SE Support Roadmap.

< Δ >