Δημοσιεύτηκε: 02 Δεκ 2011, 11:57
από lucinos
Ο τρόπος που προσεγγίζω την πρόβλεψη για το μέλλον, ιδιαίτερα το μεσο-μακροπρόθεσμο, είναι στην πραγματικότητα ιδιαίτερα συντηρητικός. Η αντίληψή μου όμως ότι στην βρισκόμαστε πολύ πιο πίσω από αυτό που θα μπορούσαμε. Όταν λέω είμαστε πίσω δεν εννοώ «τεχνολογικά». Εννοώ στον τρόπο που αντιμετωπίζουμε την τεχνολογία. Για παράδειγμα δεν συνηθίζουμε να δείχνουμε στα μικρά παιδιά πώς να προγραμματίζουν τον υπολογιστή. Στο βιβλίο Invent Your Own Computer Games with Python, ο συγγραφέας αναφέρει ότι παιδιά ηλικίας 9-10 ετών μπορούν να ακολουθήσουν το βιβλίο. Ο συγγραφέας κρίνει (και πολύ σωστά) από τον εαυτό του, που έμαθε να παίζει με την Basic όταν ήταν 9. Έχω προσωπικά την ίδια εμπειρία και μάλιστα και σε ακόμα μικρότερη ηλικία. Σε εμένα είναι λοιπόν ολοκάθαρο ότι στο μέλλον τα παιδιά θα μαθαίνουν προγραμματισμό και αυτό θα φαίνεται τόσο αυτονόητο όσο σήμερα φαίνεται ότι μαθαίνουμε στα παιδιά πολλαπλασιασμό. Αυτό είναι και χρήσιμο και αναγκαίο αν ο άνθρωπος θέλει να διατηρήσει και να βελτιώσει την ποιότητα ζωής του διαφορετικά καθώς οι υπολογιστές γίνονται όλο και πιο σημαντικοί στις ζωές τών ανθρώπων βαδίζουμε σε έναν ψηφιακό μεσαίωνα. Ο μεσαίωνας επιτείνεται από φεουδαρχικού τύπου νόμους για το λογισμικό. Καλύτερα να μην επεκταθώ περισσότερο σε αυτό. Αρκούμαι καλύτερα να πω ότι ένα παιδί που μαθαίνει να προγραμματίζει (χωρίς να το ζαλίσουμε προσπαθώντας πρώτα να του εξηγήσουμε τι είναι οι αλγόριθμοι κλπ) αποκτά έναν ιδιαίτερο τρόπο να σκέφτεται και τού φαίνεται ιδιαίτερα φυσικό για παράδειγμα να ονοματίζει τιμές ή να σκέφτεται πάντα χωρίς δυσκολία με τρόπο αφηρημένο τις πράξεις (και πολλές άλλες έννοιες παίρνουν με φυσικό τρόπο σάρκα και οστά)

Σε προηγούμενο ποστ κάποιος ανέφερε έναν τρόπο κατάταξης τών γλωσσών από τις κατώτερες στις ανώτερες βάζοντας σαν «ανώτερη» την Lisp. Δεν θα διαφωνήσω ακριβώς αλλά αυτή η κατάταξη δεν έχει μεγάλη σχέση με την πράξη. Δεν λέω ότι είναι «κακή». Αυτό που λέω είναι ότι εγώ θα έβαζα στο κατώτερο άκρο την Brainfuck (έτσι λέγεται η γλώσσα!) για να τονίσω την θεωρητική βάση αυτής τής κατάταξης. Έχω μια διαφορετική πρακτική κατάταξη. Κατατάσσω τις γλώσσες σε γλώσσες συστήματος και σε φλοιούς. Κλασσικό παράδειγμα τής πρώτης κατηγορίας είναι η C. Κλασσικό παράδειγμα τής δεύτερης κατηγορίας είναι ο bash. Και οι δύο κατηγορίες είναι προφανώς αναγκαίες. Αυτό που κάνει η Python είναι να βρίσκεται στην μέση. Αυτό είναι πολύ σημαντικό γιατί αυτό διευκολύνει απίστευτα τον προγραμματισμό.

Τώρα υπάρχει γενικότερα η (λανθασμένη!) άποψη ότι οι διερμηνευόμενες γλώσσες όπως η Python είναι αργές. Αν έχω ασχοληθεί ιδιαιτέρως με κάτι στον προγραμματισμό αυτό είναι η βελτιστοποίηση. Η απάντησή μου στο θέμα είναι κάπως «μη συμβατική». Οι διερμηνευόμενες γλώσσες δεν είναι πιο αργές. Από πρακτική άποψη αυτό που κάνουν είναι να ζητάνε την εκτέλεση ενεργειών και μαντέψτε· εκτελούνται με την μέγιστη δυνατή ταχύτητα, τόσο γρήγορα όσο ποτέ δεν θα μπρούσε να ξεπεραστεί από οποιαδήποτε «γρήγορη» γλώσσα όπως η C. Μάλιστα το γράψιμο ενός προγράμματος σε C άριστα βελτιστοποιημένο είναι πολύ δύσκολη υπόθεση. Αυτό που συμβαίνει είναι ότι η Python δεν παύει να μην είναι γλώσσα συστήματος. Αυτό σημαίνει απλά ότι αν συγκρίνουμε «ίδιο» κώδικα σε Python και «ίδιο» κώδικα σε C θα βρούμε την Python πολύ πιο αργή. Πόσο συχνά όμως χρειαζόμαστε κάτι τέτοιο; Μήπως δεν συγκρίνουμε ομοειδή πράγματα;

Συνεπώς «η Python είναι αργή» μεταφράζεται σε: «Η Python δεν είναι γλώσσα συστήματος και αν επιχειρήσεις να την χρησιμοποιήσεις σαν να ήταν το αποτέλεσμα είναι να χάσεις τραγικά σε ταχύτητα.

Λίγα λόγια σχετικά με την βελτιστοποίηση. Ο περισσότερος κόσμος κάνει λάθος υποθέσεις για το τι καθυστερεί τον υπολογιστή. Μην πιστεύετε τίποτα, μην υποθέτετε τίποτε, μετρήστε και δείτε. Για παράδειγμα στο ερώτημα: τι είναι ταχύτερος; ο πολλαπλασιασμός αριθμών απλής ακρίβειας ή διπλής ακρίβειας; Μην απαντήσετε χωρίς να έχετε μετρήσει και μην υποθέτετε ότι το ίδιο ισχύει για όλους τούς υπολογιστές. Εδώ κρύβεται και ένα άλλο λάθος που κάνει ο κόσμος. Συγκρίνει για παράδειγμα ένα παλιό λογισμικό με ένα νέο και λέει το παλιό είναι ταχύτερο ή το νέο είναι ταχύτερο. Η αλήθεια είναι ότι μπορεί σε παλιότερο υπολογιστή το παλιό να είναι ταχύτερο και σε νεώτερο υπολογιστή το νεώτερο να είναι ταχύτερο.

Διαβάζοντας το "Learning Python":
Python has shined as a tool that allows programmers to get more done with less effort. It is deliberately optimized for speed of development

The NumPy extension, for instance, has been described as a free and more powerful equivalent to the Matlab numeric programming system.

Even at today’s CPU speeds, though, there still are some domains that do require optimal execution speeds. Numeric programming and animation, for example, often need at least their core number-crunching components to run at C speed (or better). If you work in such a domain, you can still use Python—simply split off the parts of the application that require optimal speed into compiled extensions, and link those into your system for use in Python scripts.

To Python programs, components written in Python and C look the same. Because of this, it’s possible to prototype systems in Python initially, and then move selected components to a compiled language such as C or C++ for delivery. Unlike some prototyping tools, Python doesn’t require a complete rewrite once the prototype has solidified. Parts of the system that don’t require the efficiency of a language such as C++ can remain coded in Python for ease of maintenance and use.

Και μόνο το γεγονός ότι μπορώ να έχω κάτι ισχυρότερο και πιο ευέλικτο από το Matlab πραγματικά με ενθουσίασε. (Ταυτόχρονα περιορίζεται και η χρησιμότητα τού Octave τού οποίου το βασικό πλεονέκτημα γίνεται μόνο η συμβατότητα με το Matlab.) Αλλά όταν διάβαζα το τελευταίο η απορία μου ήταν πώς μπορεί να το λέει έτσι απλά. Ο κόσμος θα έπρεπε να χαλάει από τα ζήτω. Κάτι ακόμα για τις διερμηνευόμενες γλώσσες. Αν σε απασχολεί πραγματικά η ταχύτητα σε βάζουν χωρίς προσπάθεια στον σωστό δρόμο για μια σωστή βελτιστοποίηση. Εμπειρικά ο κώδικας που πρέπει να γραφτεί σε μια γλώσσα συστήματος για να είναι αποδοτικός είναι κατά βάση απλές διαδικασίες και φωνάζει πώς πρέπει να γίνει. Αν δεν συμβαίνει αυτό τότε όλος ο σχεδιασμός τού προγράμματος είναι λανθασμένος και αν γίνει σωστά θα κερδηθεί πάρα πολύς χρόνος όσο δεν περιμένει κανένας. Όλο το υπόλοιπο που συχνά είναι και περισσότερο δεν έχει κανένα απολύτως κόστος σε απόδοση η υλοποίησή του σε μια διερμηνευόμενη γλώσσα (γιατί κάτι που τρέχει εν ριπή οφθαλμού δεν διαφέρει σε ταχύτητα από κάτι που τρέχει εν ριπή οφθαλμού). Όταν θέλεις να κάνεις βελτιστοποίηση είναι πολύ βασικό να κάνεις οικονομία πρώτα από όλα στον δικό σου χρόνο. Αν μπορείς κατ αρχάς να το κάνεις να δουλέψει σε μία διαρμηνευόμενη γλώσσα έχεις γλυτώσει απίστευτα πολύ χρόνο, είσαι ήδη στον σωστό δρόμο (πράγμα που δεν είναι καθόλου εγγυημένο αν δουλεύεις σε μια γλώσσα συστήματος) και πρόκειται να γλυτώσεις πάρα πολύ χρόνο και γιατί είσαι στον σωστό δρόμο αλλά και γιατί οι χρονομετρήσεις είναι απλούστατη διαδικασία σε μια διερμηνευόμενη γλώσσα (απλά το τρέχεις). Η σωστή χρονομέτρηση διαφορετικά είναι πολύ πιο δύσκολο από όσο νομίζετε και αν γίνει λάθος μπορεί να οδηγήσει σε λανθασμένα συμπεράσματα. Για αυτό έλεγα ότι είναι πρόωρη βελτιστοποίηση η επιλογή γλώσσας με βάση μόνο την ταχύτητα. Συμφέρει να προγραμματίσεις σε μια γλώσσα που υπόσχεται ταχύτητα ΜΟΝΟ όταν ξέρεις καλά τι κάνεις. Και αυτό δεν συμβαίνει πολύ συχνά.

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