5' read
Η επιλογή της καταλληλότερης γλώσσας προγραμματισμού για να ξεκινήσει ένας αρχάριος προγραμματιστής είναι ένα πρόβλημα που έχει απασχολήσει αρκετά την κοινότητα των προγραμματιστών. Παλαιότερα η γλώσσα επιλογής ήταν η Pascal ή η C, αργότερα η Java ή η C και σήμερα η Java ή η Python. Πολλά πανεπιστήμια σε όλο τον κόσμο χρησιμοποιούν την Python ως πρώτη γλώσσα μιας και προσφέρεται για την ευκολότερη κατανόηση κάποιων προγραμματιστικών εννοιών ενώ άλλα χρησιμοποιούν την Java. Άλλοι πάλι λόγω της δημοφιλίας του Web προκρίνουν την JavaScript.
Ας δούμε σε αυτό το ποστ ποια είναι κατά τη γνώμη μου και με παιδαγωγικά αλλά και προγραμματιστικά κριτήρια η καλύτερη γλώσσα προγραμματισμού για αρχάριους προγραμματιστές και πως πρέπει να διδαχθεί.
Κριτήρια
Υπάρχουν διάφορα κριτήρια που θα μπορούσαν να χρησιμοποιηθούν ώστε να αποφασίσουμε ποια είναι η καλύτερη 'πρώτη' γλώσσα προγραμματισμού. Διάφορα κριτήρια θα μπορούσαν να είναι η δημοφιλία των γλωσσών, η αγορά εργασίας, οι μακροχρόνιες προοπτικές μιας γλώσσας, ή ακόμα και η δυσκολία εκμάθησης. Οι γλώσσες που πληρούν τα περισσότερα κριτήρια επιλογής είναι η C, Java και Python που είναι σταθερά οι πιο δημοφιλείς γλώσσσες, με μακροχρόνιες προοπτικές. Η JavaScript είναι η μοναδική γλώσσα προγραμματισμού στο κομμάτι των Web διεπαφών και παρότι χρησιμοποιείται τα τελευταία χρόνια και στο back-end (π.χ. Node.js), νομίζω πως είναι αρκετά 'ειδική' ώστε να αποτελέσει την πρώτη γλώσσα προγραμματισμού ενός αρχαρίου. Αν όμως η στόχευση είναι το Web, τότε η JavaScript θα μπορούσε να χρησιμοποιηθεί ως πρώτη γλώσσα προγραμματισμού. Όσο αφορά τη δυσκολία εκμάθησης η πιο δύσκολη γλώσσα είναι η C λόγω της χρήσης δεικτών σε θέσης μνήμης, ένα χαρακτηριστικό που είναι συχνά πηγή λαθών για τους προγραμματιστές, ιδιαίτερα τους αρχάριους. Για το λόγο αυτό και παρότι η C θεωρείται η μητέρα όλων των σύγχρονων γλωσσών προγραμματισμού, δεν προκρίνεται η χρήση της από αρχάριους. Δημιουργεί δυστυχώς το φόβο της αποτυχίας στους προγραμματιστές κάτι που παιδαγωγικά είναι πολύ σημαντικός παράγοντας αποδοχής ή όχι μία μεθόδου ή εργαλείου διδασκαλίας. Η γλώσσα Java έχει βαθμό δυσκολίας κυρίως λόγω της αυστηρής συντακτικής δομής της γλώσσας. Η Python θεωρείται η πιο εύκολη σε όρους εκμάθησης γλώσσα και για αυτό έχει επικρατήσει να θεωρείται ως η πιο συχνά χρησιμοποιούμενη πρώτη γλώσσσα προγραμματισμού.
Java vs Python
θα περιορίσουμε τη σύγκρισή μας μεταξύ των δύο κυρίαρχων -ως πρώτη γλώσσα- γλωσσών προγραμματισμού στις Java και Python. Θα ξεκινήσω με ένα παράδειγμα ενός προγράμματος σε Python και σε Java:
#---------Python---------
def say_hello()
print("Hello")
say_hello()
// Java
class HelloDemo {
public static void main(String[] args) {
sayHello();
}
public static void sayHello() {
System.out.print("Hello");
}
}
Προφανώς, το 1ο πρόγραμμα, σε Python, είναι ευκολότερο να γίνει κατανοητό και έχει τρεις μόνο γραμμές κώδικα. Το 2ο πρόγραμμα, σε Java, είναι σαφώς πιο δύσκολο να γίνει κατανοητό και έχει περισσότερες γραμμές κώδικα. Ας δούμε όμως τι γίνεται προγραμματιστικά. Ο λόγος που η Python είναι ευκολότερη σε μια πρώτη ανάγνωση είναι γιατί αφήνει πολλά πράγματα να υπονοούνται. Για παράδειγμα, τεχνικά δεν είναι καθόλου φανερό, ποιο το σώμα της συνάρτησης say_hello() γιατί η Python χρησιμοποιεί εσοχές (1 ή περισσότερα κενά διαστήματα) για να ορίσει το σώμα των συναρτήσεων, κάτι το οποίο δεν διδάσκει με σαφήνεια σε πρώτη φάση την έννοια του block κώδικα, κάτι πολύ σημαντικό για τη συνέχεια. Επίσης, το γεγονός ότι δεν υπάρχει σημείο εισόδου για την εκτέλεση του κώδικα, όπως στην Java που είναι η μέθοδος main (ο κώδικας στην Python ξεκινά και εκτελείται από την 1η γραμμή) παιδαγωγικά και σε επίπεδο γλώσσας δεν διευκρινίζει με σαφήνεια που είναι η αρχή και που το τέλος της εκτέλεσης του κώδικα. Επίσης, στην Python δεν είναι απαραίτητο ο κώδικας να γράφεται μέσα σε κλάσεις, κάτι που παιδαγωγικά πάλι, δεν διδάσκει με σαφήνεια και από την αρχή το αντικειμενοστραφές μέρος των σύγχρονων γλωσσών προγραμματισμού αλλά κατακερματίζει τη γνώση. Υπάρχουν και άλλα συντακτικά στοιχεία της γλώσσας Python που υπονοούνται και δεν είναι παιδαγωγικά σαφή (π.χ. μη χρήση του ; ώς τέλος εντολής, κάτι που εξελικτικά είναι πιο βολικό, αλλά αρχικά πάλι δεν είναι παιδαγωγικά χρήσιμο γιατί υπονοεί ότι ο προγραμματιστής γνωρίζει ή μπορεί να μάθει ήδη από την αρχή το διαχωρισμό μεταξύ διαχωριστικού συμβόλου και συμβόλου τέλους εντολής, όπου στην Python το τέλος εντολής υπονοείται πως είναι η αλλαγή γραμμής).
Τα παραπάνω συντακτικά στοιχεία είναι σημαντικά κατά τη γνώμη μου για να συνηγορήσουν υπέρ της Java ως πρώτης γλώσσας προγραμματισμού, αλλά δεν είναι νομίζω τα πιο σημαντικά.
Python vs Java Semantics (Σημασιολογική Ανάλυση)
Ένα σημαντικό μέρος των σύγχρονων γλωσσών προγραμματισμού είναι η σημασιολογική ανάλυση η οποία αποτελεί μέρος όλων των σύγχρονων μεταγλωττιστών. Το μεγαλύτερο μέρος της σημασιολογικής ανάλυσης έχει να κάνει με το Static Type Checking, δηλαδή με τον έλεγχο των τύπων των δεδομένων και των μεθόδων αλλά και των user-defined τύπων της γλώσσας. Ας δούμε ένα παράδειγμα στην Java:
int num = 10;
int result = num / "5";
Ο παραπάνω κώδικας κάνει το εξής: Δηλώνει μία μεταβλητή με όνομα num τύπου int (ακέραιοι) και στη συνέχεια διαιρεί με το αλφαριθμητικό 5. Ο μεταγλωττιστής της Java κατά τη διάρκεια του parsing σημειώνει στον πίνακα συμβόλων την μεταβλητή num και τον τύπο int. Στη συνέχεια, στην επόμενη εντολή ο σημασιολογικός αναλυτής (που είναι μέρος του μεταγλωττιστή) ελέγχει αν η διαίρεση με αλφαριθμητικό είναι έγκυρη πράξη για τον τύπο int στον οποίο ανήκει η μεταβλητή num (και για το λόγο αυτό συμβουλεύεται τον πίνακα συμβόλων). Επειδή η διαίρεση int με αλφαριθμητικό δεν είναι έγκυρη πράξη, ο μεταγλωττιστής δίνει ένα compilation error. Αυτός ο τρόπος δήλωσης και εύρεσης σημασιολογικών λαθών ονομάζεται static typing.
Στην python κάτι αντίστοιχο θα ήταν:
num = 10
result = num / "5"
Ο παραπάνω κώδικας κάνει το εξής: Δηλώνει μία μεταβλητή με όνομα num. Ο τύπος της μεταβλητής είναι int, κάτι το οποίο συμπεραίνεται από την τιμή της εκχώρησης, δεν χρειάζεται δηλαδή να δηλώσουμε ρητά τον τύπο δεδομένων. Ο τύπος 'int' είναι μία ιδιότητα του identifier 'num' (δεν δημιουγείται στον πίνακα συμβόλων) που την κουβαλάει μαζί του @runtime μαζί με την τιμή. Φανταστείτε δηλαδή ένα όνομα μεταβλητής num που έχει δύο tags: int και 10. Έτσι, όταν πάει να εκτελεστεί η πράξη της διαίρεσης δημιουργείται ένα runtime error γιατί η διαίρεση int με αλφαριθμητικό δεν είναι έγκυρη πράξη. Αυτός ο τρόπος δήλωσης και εύρεσης σημασιολογικών λαθών ονομάζεται dynamic typing.
Η διαφορά λοιπόν έγκειται στο γεγονός ότι στην Pythοn οι μεταβλητές παρότι ανήκουν σε ένα τύπο δεδομένων αυτός υπονοείται από την τιμή εκχώρησης, ενώ στη συνέχεια μπορεί η ίδια μεταβλητή να αλλάξει τύπο αν αλλάξει τιμή. Το γεγονός αυτό δημιουργεί ασάφεια στους αρχάριους προγραμματιστές -παρότι φαίνεται ευκολότερο- σχετικά με τους τύπους δεδομένων, τη χρήση της μνήμης καθώς και τις μετατροπές τύπων και συνακόλουθα και τις επιτρεπτές πράξεις μεταξύ μεταβλητών διαφορετικών τύπων. Αυτό επιπλέον έχει ως αποτέλεσμα να δημιουργούνται runtime errors, κάτι που είναι επίσης μία αρνητική συνέπεια των παραπάνω χαρακτηριστικών της γλώσσας, τα οποία σχεδιάστηκαν για να παρέχουν ευελιξία σε εμπειρότερους προγραμματιστές.
Εν αντιθέσει, η Java είναι μία strongly-typed όπου πρέπει να δηλώνουμε τον τύπο των μεταβλητών, γεγονός που παρέχει μεγαλύτερη σαφήνεια σε αρχάριους προγραμματιστές, ως προς τους τύπους δεδομένων, τις μετατροπές (type-casting), τις επιτρεπτές πράξεις, ενώ επιπλέον δημιουργούνται compilation errors και όχι runtime errors, όπως στην Python, κάτι που προφυλάσσει περαιτέρω τους αρχάριους προγραμματιστές (και γενικά όλους τους πρρογραμματιστές) από λάθη που θα μπορούσαν να εντοπιστούν κατά τη φάση της μεταγλώττισης .
Παρότι δεν μπορούν όλα τα λάθη να εντοπιστούν κατά τη φάση της μεταγλώττισης (π.χ. διαιρέσεις με το μηδέν, αναφορά σε θέσεις μνήμης που δεν υπάρχουν, υπερχείλιση, κλπ), θα θέλαμε να εντοπίζουμε κατά τη φάση της μεταγλώττισης όσα περισσότερα λάθη γίνεται. Η Python έχει μία άλλη σχεδιαστική αντίληψη που της δίνει ευελιξία, αλλά αποτελεί πηγή λαθών, ιδιαίτερα για νέους προγραμματιστές.
Συμπερασματικά,
Η προσωπική μου άποψη είναι ότι οι αρχάριοι προγραμματιστές θα πρέπει να ξεκινάνε με τη γλώσσα Java. Αλλά, επειδή η γλώσσα Java έχει μεγάλο προγραμματιστικό βάθος, θα μπορούσε να διδαχθεί εισαγωγικά δίνοντας έμφαση στους τύπους δεδομένων, στις δομές ελέγχου, στη σύνταξη και τη δομή της γλώσσας, στη διαχείριση της μνήμης και στις μεθόδους, αλλά και στις συμβάσεις ονοματοδοσίας, έτσι ώστε οι αρχάριοι προγραμματιστές να διδαχθούν από την αρχή αυτά τα βασικά χαρακτηριστικά χωρίς υπονοούμενα, χωρίς συντακτικές απλοποιήσεις και χωρίς να οδηγούνται σε λάθη @runtime που δεν μπορούν να χειριστούν.
Η χρήση της Python από την άλλη πλευρά είναι απλούστερη, αλλά οι αρχάριοι προγραμματιστές της Python μοιάζουν με τα παιδιά που παίζουν αμέριμνα με την άμμο σε μία παραλία, ενώ η θάλασσα της προγραμματιστικής γνώσης απλώνεται μπροστά τους. Αυτό δεν σημαίνει όμως ότι σε κάποιες περιπτώσεις δεν θα μπορούσε και η Python να χρησιμοποιηθεί ως πρώτη γλώσσα, όπως για παράδειγμα στις περιπώσεις που θέλουμε να επιμορφώσουμε εκπαιδευόμενους σε ψηφιακές τεχνολογίες, οι οποίοι δεν στοχεύουν όμως να γίνουν προγραμματιστές γενικού σκοπού. Επίσης, αυτό δεν σημαίνει ότι κάτω από κάποιες προϋποθέσεις δεν θα μπορούσε και η Python να χρησιμοποιηθεί ως πρώτη γλώσσα, αρκεί να διδαχθεί σωστά και αρκεί στη συνέχεια να διδαχθεί και η Java!
Όποια γλώσσα και να επιλέξετε ωστόσο ως πρώτη γλώσσα προγραμματισμού, η ανάπτυξη λογισμικού απαιτεί τη γνώση περισσοτέρων γλωσσών προγραμματισμού που μπορούν να χρησιμοποιηθούν εναλλακτικά, ανάλογα με τις εφαρμογές και τις ειδικές προδιαγραφές και απαιτήσεις τους.
Happy Coding!