-
Πίνακες, δείκτες, γλώσσες και αζαγιές*
-
Έχω φτάσει σε ένα σημείο, σε μια ηλικία, κάπου τέλος πάντων, που βρίσκω από ηλίθια έως τραγικά, πολλά από τα χαρακτηριστικά θεμελιωδών, κατεστημένων, παραδοσιακών και συχνά διαιωνισμένων διεργασιών με τις οποίες αλληλεπιδρώ. Μία από αυτές είναι η Εκκλησία, μία άλλη είναι η κοινωνία, η δημοσιογραφία, το πολίτευμα…
Ο τρέχον ενεργός εκνευρισμός μου είναι με τις γλώσσες προγραμματισμού. Μετά από 10+ χρόνια προγραμματισμού, βρίσκω τη γραμματική και το λεξιλόγιο των γλωσσών υπερβολικά απλοϊκό, τη δομή τους περιοριστική, την φιλοσοφία τους επιρρεπή σε σφάλματα, τη δυσκολία κλιμακωσιμότητας τους εκθετική, την απεικόνιση προβλημάτων του πραγματικού κόσμου σε αυτές γεμάτη κενά και τις ίδιες καθόλου “διαισθητικές”, τόσο για τον προγραμματιστή (το ένα μέλος στο κανάλι επικοινωνίας που ορίζει η “γλώσσα”) όσο και τη μηχανή (το άλλο μέλος). Με λίγα λόγια, βρίσκω πως μας πέφτουν “λίγες”, πως οι δυνατότητες τους είναι τραγικά περιορισμένες. Πως είναι ασύμβατες με την ανθρώπινη νόηση, τη φύση. Ακόμη και με τα ίδια τα μαθηματικά!
Κάποια στιγμή, πρέπει να πεταχτούν εντελώς οι γλώσσες προγραμματισμού και να φτιαχτούν γλώσσες υπολογιστών. Που να στοχεύουν όχι στη δημιουργία προγραμμάτων αλλά στην επικοινωνία ανθρώπου-υπολογιστή.
Για αυτά όμως θα μιλήσω κάποια άλλη φορά, γιατί τώρα βαριέμαι. Κάποια φορά θα αναπτύξω το συλλογισμό αυτό και θα αιτιολογήσω τις “βλασφημίες” μου. Τώρα, θα αναφέρω ένα πολύ απλό παράδειγμα, το οποίο ίσως θα ακούγεται κουτό σε σχέση με τις βαρύγδουπες παραπάνω κουβέντες (και πάλι δε με νοιάζει, γιατί βαριέμαι).
Πόσο κουτό μου φαίνεται οι σύγχρονες γλώσσες προγραμματισμού να αναφέρονται στο πρώτο κελί ενός πίνακα με τον δείκτη
0
αντί με το1
. Το πρώτο στοιχείο είναι το0
, το νιοστό στοιχείο είναι τον-1
.Επειδή παλιά δηλαδή, η προσπέλαση στη μνήμη ήταν του στυλ <θέση μνήμης>[<μετατόπιση>] (πχ. το
0AFF[01]
σήμαινε την επόμενη θέση μνήμης από την0AFF
), πρέπει 40 χρόνια μετά να ακολουθούμε την ίδια “παραδοσιακή” (λέγε με αρχαία) τυπικότητα. Η οποία τυπικότητα παραξενεύει/δυσκολεύει κάθε νέο άτομο που επιχειρεί να “μιλήσει” με τις μηχανές και βάζει σε σκέψη κάθε έμπειρο που γράφει ένα βρόγχο για να σιγουρευτεί αν όλα είναι ΟΚ.Τόσο απλό. Και συνάμα τόσες γλώσσες το διατηρούν ακόμη…
* Αζαγιά: (κυπριακό) – Ο ιστός της αράχνης. Χρησιμοποιείται συχνά για τους ιστούς που βρίσκονται σε αντικείμενα που έχει καιρό να καθαριστούν.
Update: Θυμήθηκα μια συνέντευξη του Jaron Lanier, που διάβασα πριν 3 χρόνια σχετικά με τον τρόπο που γράφουμε προγράμματα “σήμερα”. Στο πνεύμα της καταχώρησης, μοιάζει περισσότερο επίκαιρη από ποτέ και μπορεί να δώσει μια ιδέα του συλλογισμού περί ριζικής αλλαγής του τρόπου που επικοινωνούμε με τους υπολογιστές. Must-read.
Σε Fortran και Pascal οι πίνακες ξεκινάν από το 1. Και είναι αρκετά παλιές γλώσσες ;)
Πάντως αν το δεις σαν ένα απλό σύνολο από κανόνες, όσο το δυνατόν μικρότερο για την αποφυγή πολυπλοκότητας, δεν είμαι και πολύ σίγουρος αν όντως χρειάζεται να πετάξεις τις παλιές γλώσσες.
Δες το σαν να προσπαθείς να μάθεις μια ξένη γλώσσα. Μαθαίνεις τους κανόνες και τους ακολουθείς. Π.χ. Στα γερμανικά η καρέκλα είναι αρσενικό. Πρέπει να το μάθεις κι ας έρχεται αντίθετα με τα ελληνικά που μιλάς τόσα χρόνια.
Αυτό που ίσως θα είχε νόημα, είναι ένας “compiler” που θα διόρθωνε τέτοια λάθη ;) (Νομίζω κάτι τέτοιο έκανε ο Clipper στη C αλλά δεν είμαι και σίγουρος).
Υπάρχουν και οι “high level” γλώσσες, στις οποίες δεν ασχολείται καν ο κόσμος με το είδος ενός “sequence” ή με το αν το πρώτο στοιχείο είναι στη θέση μηδέν, στη θέση 1, ή στη θέση 42:
Νομίζω ότι συγχέεις τις γλώσσες προγραμματισμού με ένα (yet to be invented) σύστημα τεχνητής νοημοσύνης που θα συμπεραίνει τι (δεν) εννοείς όταν περιγράφεις στον υπολογιστή τι θέλεις να κάνει. (Το οποίο μπορεί να ποικίλει αφάνταστα ανάλογα με το τι γλώσσα μιλάς, πού ζεις, κτλ.) Dream on :)
Για μένα το βασικό κριτήριο για μια γλώσσα προγραμματισμού είναι πόσες γραμμές κώδικα χρειάζεται να γράψω (+test, read, print, debug, etc) για ένα πρόβλημα. Μέχρι στιγμής η καλύτερη μου είναι high level γλώσσες (python) και γλώσσες που μπορούν να επεκταθούν ώστε να είναι κοντύτερα στις έννοιες του προβλήματος (common lisp).
Φίλε Δημήτρη,
Ενώ συμμερίζομαι τους αρχικούς προβληματισμούς σου, όταν γράφεις:
“Πόσο κουτό μου φαίνεται οι σύγχρονες γλώσσες προγραμματισμού να αναφέρονται στο πρώτο κελί ενός πίνακα με τον δείκτη 0 αντί με το 1. Το πρώτο στοιχείο είναι το 0, το νιοστό στοιχείο είναι το ν-1.”
Νομίζω ότι αν όντως γράφεις προγράμματα πάνω από 10 χρόνια δεν θα έπρεπε να το λές αυτό για τους εξής λόγους:
1) Ο τρόπος προσπέλασης της μνήμης όπως ανέφερες μπορεί να είναι παλιός αλλά είναι αυτός που χρησιμοποιείται μέχρι σήμερα (και δεν βλέπω κανένα λόγο να αλλάζει στο ορατό μέλλον…). Οπότε καλώς οι σύγχρονες γλώσσες προγραμματισμού ακολουθούν αυτόν τον τρόπο για να κάνουν indexing
2) Οπως προανέφερε και ο Γ. Κεραμίδας πολλές σύγχρονες γλώσσες κάνουν iteration ανεξαρτήτως index και το κάνουν όχι μόνο για λόγους ευκολίας στον προγραμματισμό αλλά κυριώς για λόγους αξιοπιστίας και robustness του κώδικα
2) Το indexing εξακολουθεί να γίνεται έται και για έναν ακόμα λόγο, βοηθά στο slicing (π.χ a[1:3]) αλλά και στην υπάρξη του negative indexing που πάλι υποστηρίζουν κάποιες γλώσσες (που χωρίς το 0 δεν θα είχε νόημα π.χ. a[1:-1])
3) Και ένα προσωπικό σχόλιο έγω μάλλον περισσότερο μπερδεύομαι με “γλώσσες” που δεν υποστηρίζουν αυτόν τον τρόπο indexing (π.χ R)
Το θέμα του indexing των πινάκων ήταν απλά ένα παράδειγμα. Μάλιστα, το ότι οι σύγχρονες γλώσσες δίνουν νέας μορφής loops, δείχνει τουλάχιστον ότι μεταφερόμαστε από σύμβολα (
for ($x=0; $x<10; $x++)
) σε φράσεις πιο κοντά στην ανθρώπινη γλώσσα και λογική (for x in range(1,10)
).Η συνέντευξη που κάνω link στην υποσημείωση του άρθρου τα λέει πολύ καλύτερα από μένα. :)