Κυριακή, 19 Σεπτεμβρίου 2021

Πρόβλημα με το Github

Λόγω προβλήματος στο GitHub αποφάσησα να δημιουργήσω έναν φάκελο στο google drive με όλα τα αρχεία για την Μ2000 (και το M2000Language.exe δηλαδή το αρχείο εγκατάστασης).

Folder ExportM2000

Κυριακή, 25 Ιουλίου 2021

Προβλήματα κατονόησης στο Προγραμματισμό με Αντικείμενα!

Πολλά προβλήματα κατανόησης στο προγραμματισμό οφείλονται στην χρήση κακών ορισμών. Θα ασχοληθώ εδώ με το ζήτημα του τι είναι ένα αντικείμενο στο προγραμματισμό.

Εδώ και πολλά χρόνια ο προγραμματισμός με αντικείμενα έχει γίνει μια συνήθεια στο χώρο των προγραμματιστών. Δυστυχώς τα βιβλία που ασχολούνται με αντικείμενα κάνουν έναν σοβαρό λάθος όταν αναφέρονται στο τι είναι ένα αντικείμενο (προγραμματιστικά).

Συνήθως ο ορισμός του αντικειμένου μιλάει για "δομές" που προσομοιάζουν τα αντικείμενα του πραγματικού κόσμου. Συνδέει κάτι που λέμε δομή (αόριστο λίγο) με το πραγματικό κόσμο, μέσω μιας άλλης έννοιας αυτής της προσομοίωσης. Άρα "δομή" και "προσομοίωση" είναι δυο άλλες έννοιες που μπορούν να σημαίνουν οτιδήποτε, και όχι κάτι το χαρακτηριστικό.

Ας σκεφτούμε το τι είναι η προσομοίωση. Όταν κάτι "εκτελεί" ίδιες ενέργειες με κάτι άλλο, αλλά σε καμία περίπτωση δεν είναι ταυτόσιμο τότε λέμε ότι το προσομοιώνει; Αν ναι τότε με αυτήν την έννοια κάθε αυτοκίνητο προσομοιώνει το αρχικό αυτοκίνητο ως προς την κίνηση, καθώς και τη μεταφορά προσώπων και πραγμάτων. Ποτέ όμως δεν θα πούμε ότι το νέο μοντέλο αυτοκινήτου Χ είναι προσωμοίωση του προηγούμενου ή του πρώτου αυτοκινήτου. Γιατί το νέο μοντέλο είναι και αυτό ένα αυτοκίνητο, και έχει τα γνωρίσματα των αυτοκινήτων. Έτσι η προσομοίωση πρέπει να έχει κάτι διαφορετικό και εδώ είναι το "ανάλογο" όπως λέμε. Το τεχνικό δόμημα που εκτελεί τις ενέργειες ενός αυτοκινήτου, ο προσομοιωτής, είναι το ανάλογο του αυτοκινήτου χωρίς να είναι αυτοκίνητο.

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

Ασφαλώς όταν μιλάμε για αντικείμενα μιλάμε για μια δομή που περιέχει δυο πράγματα: Στοιχεία και Μεθόδους (που δουλεύουν με αυτά τα στοιχεία). Όμως ο ορισμός που δίνεται ως δομή που προσομειώνει πραγματικά αντικείμενα, δεν περιγράφει το πώς γίνεται. Τώρα που γνωρίζουμε ότι γίνεται με στοιχεία και μεθόδους, πρέπει να δούμε αν αυτό πράγματι είναι κάτι ξεχωριστό. Δυστυχώς δεν είναι κάτι ξεχωριστό, γιατί όλα τα προγράμματα έχουν μέρη και μέρη αυτών μπορού να σχετίζονται με στοιχεία και μεθόδους (τις λέμε διαδικασίες ή υπορουτίνες ή συναρτήσεις). Ένα μέρος προγράμματος ανάλογα το πως χρησιμοποιείται αποτελεί δομή, ή δομικό στοιχείο του. Επειδή όμως υπάρχει η γνωστή έννοια Δομή Δεδομένων, όταν λέμε δομή στο προγραμματισμό χωρίς να βάλουμε έναν επιθετικό προσδιορισμό το μυαλό μας πάει στα δεδομένα, δηλαδή στα στοιχεία που μπορούμε να οργανώσουμε μαζι. 

Ο ορισμός λοιπόν παραπάνω, υποννοεί πράγματα τα οποία τα καταλαβαίνει ένας προγραμματιστής και έτσι μπορεί να τον πάρει στα σοβαρά, να τον αποδεχτεί. Δεν γίνεται όμως αυτός να γίνει αντιληπτός από αυτόν που δεν γνωρίζει προγραμματισμό τουλάχιστον σε ένα μέτριο επίπεδο.

Πάμε να δούμε την βασική χρήση των αντικειμένων στο προγραματισμό. Σε οποιοδήποτε προγραμματιστικό παράδειγμα υπάρχει η λεγόμενη κλήση υποπρογράμματος (είτε λέγεται διαδικασία, ή συνάρτηση). Ένα υποπρόγραμμα μπορεί να απαιτεί ορίσματα ή όχι. Προϊόν ενός υποπρογράμματος είναι ή τελικές ενέργειες που γίνονται πάνω στο υλικό (hardware, πχ εντολή καθαρισμού οθόνης ή εισαγωγής σελίδας στον εκτυπωτή)  ή ενδιάμεσες ενέργειες πρόσκαιρα στη μνήμη, όπου έχουμε μια αλλαγή κατάστασης. Αλλαγή κατάστασης στη μνήμη είναι η αλλαγή τιμής σε μια μεταβλητή, ή μιας τιμής ή περισσότερων σε ένα πίνακα ή κάποια άλλη δομή δεδομένων. Τα αντικείμενα μπαίνουν και αυτά σε ορίσματα μεθόδων, με τη διαφορά ότι αντί να δείχνουν μόνο μια δομή δεδομένων έχουν μαζί και δικές τους μεθόδους.

Με απλά λόγια η διαφορά των αντικειμένων με άλλες δομές δεδομένων είναι ότι στην κλήση υποπρογράμματος θα περάσουμε μαζί με δεδομένα και μεθόδους. Αυτές οι μέθοδοι των αντικειμένων έχουν την δυνατότητα να βλέπουν τα ξεχωριστά στοιχεία που σχετίζονται με ένα αντικείμενο. Ο ορισμός λοιπόν για τα αντικείμενα θα έπρεπε να δείχνει ότι έχουμε δεδομένα (στοιχεία) που γράφονται προσωρινά στη μνήμη και μεθόδους που χειρίζονται αυτά τα δεδομένα. Κυριολεκτικά ένα αντικείμενο στο προγραμματισμό είναι μια βιβλιοθήκη υποπρογραμμάτων με κοινά στοιχεία στη μνήμη που λογαριάζεται σαν ένα όρισμα σε κλήση υποπρογράμματος. Αυτός είναι ο σωστός ορισμός! Χωρίς κοινά στοιχεία έχουμε απλά μια βιβλιοθήκη μεθόδων. Μια δομή με κοινά στοιχεία και μεθόδους, χωρίς να γίνεται όρισμα σε κλήση υποπρογράμματος είναι απλά ένα μέρος προγράμματος και όχι ένα αντικείμενο!

Ας δούμε πάλι τον ορισμό:

Προγραμματιστικό Αντικείμενο: βιβλιοθήκη υποπρογραμμάτων με κοινά στοιχεία στη μνήμη που λογαριάζεται σαν ένα όρισμα σε κλήση υποπρογράμματος.

Δείτε ότι δεν γίνεται αναφορά στο "πραγματικό κόσμο". Τον ξεχνάμε εδώ. Δείτε ότι δεν λέμε για προσομοίωση επειδή όλα τα προγράμματα κάτι προσομοιώνουν, σε μικρό ή μεγάλο βαθμό (φαντασία να έχουμε), οπότε αυτό δεν είναι γνώρισμα ειδικά των αντικειμένων!

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

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

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

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

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

Η ιεραρχία αντικειμένων (βάσει κληρονομικότητας) ήταν ένα πρόσθετο στον προγραμματισμό με αντικείμενα. Αυτό το πρόσθετο επειδή μπήκε τελευταία στο "πακέτο" έχει γίνει αντικείμενο έκθεσης για τον προγραμματισμό αντικειμένων. Έτσι πάμε σε παραδείγματα όπου το αντικείμενο Σκύλος κληρονόμησε από το αντικείμενο Τετράποδο το οποίο κληρονόμησε από το αντικείμενο Κατοικίδιο. Έτσι μπορώ να έχω και το αντικείμενο Χελώνα το οποίο κληρονόμησε από το αντικείμενο Κατοικίδιο. Κοινές ιδιότητες και μεθόδους βάζουμε στο αντικείμενο Κατοικίδιο που περιέχεται σε ένα Σκύλο και σε μια Χελώνα. Οπότε μπορώ να έχω μια μέθοδο που να παίρνει έναν πίνακα με Κατοικίδια, και εκεί να έχω σε μια θέση ένα Σκύλο και σε μια άλλη θέση μια Χελώνα. Τελικά αν θέλω να προσθέσω κάτι άλλο, όπως ένα Παπαγάλο, αρκεί να κληρονομήσει από το Κατοικίδιο για να μπορεί να βρίσκεται στο πίνακα τύπου Κατοικίδιο άρα χωρίς να πειράξω το υποπρόγραμμα που τον χρησιμοποιεί. Αυτή είναι η ουσία τεχνικά της Ιεραρχίας στα αντικείμενα, η οποία αναφέρεται ως ιεραρχία κλάσεων ή προτύπων ανάλογα με το πως φτιάχνονται τα αντικείμενα. Στο παράδειγμα όλα τα κατοικίδια έχουν όνομα, οπότε μια μέθοδος θέσε_όνομα θα υπάρχει στο αντικείμενο Κατοικίδιο.

Δείτε ότι αναφέρομαι σε αντικείμενο Κατοικίδιο, ενώ κάποιοι στη προηγούμενη παράγραφο θα έλεγαν Κλάση Κατοικίδιο. Δείτε πώς ξεκινάει αυτή η "παρεξήγηση". Οι πρώτες γλώσσες δημιουργούσαν χώρο για τις μεταβλητές πριν εκτελεστεί το πρόγραμμα. Κατόπιν σε επόμενες γλώσσες οι κλήσεις υποπρογραμμάτων δημιουργούσαν δυναμικά χώρο για μεταβλητές κατά τη κλήση, συνήθως μια φορά για όλες τις μεταβλητές στην αρχή της κλήσης, και ο χώρος αυτός επιστρέφονταν στο τερματισμό εκτέλεσης υποπρογράμματος, ή αλλιώς στην επιστροφή από τη κλήση του υποπρογράμματος, Το ερώτημα εδώ είναι τι γίνεται με τα αντικείμενα, πότε δημιουργούνται, πριν την εκτέλεση, ή δυναμικά κατά τη κλήση; Η μεταβλητή που δείχνει ένα αντικείμενο ακολουθεί τους ίδιους κανόνες με τις άλλες μεταβλητές, αλλά το αντικείμενο για να δημιουργηθεί πρέπει να εκτελεστεί ο κατασκευαστής του. Κάποιες γλώσσες ορίζουν αντικείμενα μέσω Κλάσεων. Ουσιαστικά η Κλάση δεν είναι αντικείμενο. Την χρησιμοποιούμε ως τύπο νέας μεταβλητής για να πάρουμε το αντικείμενο (και το κάθε νέο άλλο αντικείμενο αυτού του τύπου). Άλλος τρόπος είναι μέσω ορισμού να πάρουμε απευθείας το αντικείμενο και το κάθε επόμενο θα το πάρουμε ως αντίγραφο του αρχικού ή κάποιου άλλου όπου ήδη η κατάστασή του έχει αλλάξει (έχουν χρησιμοποιηθεί μέθοδοι και έχουν αλλάξει στοιχεία) και αυτό αποτελεί το πρóτυπο για το νέο αντικείμενο. Σε κάθε περίπτωση τα αντικείμενα θεωρούνται δυναμικά στοιχεία, δηλαδή αποδίδεται η μνήμη σε αυτά κατά την εκτέλεση. 

Η ιδέα της Ιεραρχίας Κλάσεων ως κληρονομικότητα αντικειμένων, δημιουργεί την εντύπωση ότι τα αντικείμενα έχουν δυο όψεις: ο ορισμός και η υλοποίηση στη μνήμη. Ο ορισμός, ή το πατρόν, είναι η Κλάση. Σε κάποιες γλώσσες ισχύει, σε κάποιες άλλες όχι, γιατί ο ορισμός μπορεί να φτιάχνει άμεσα το αντικείμενο, και το κάθε νέο να είναι αντίγραφο! Ιεραρχίες αντικειμένων μπορούμε να έχουμε και με τα πρότυπα! Έτσι η λέξη Κλάση απλά μπερδεύει κάποιον που δεν γνωρίζει τη διαφορά μηχανισμού Κλάσης/Πρότυπου όταν αργότερα θα πάει σε μια γλώσσα που δεν έχει κλάσεις (ή οι κλάσεις που έχει είναι στην ουσία συναρτήσεις που επιστρέφουν Αντικείμενα που μπορούν να χρησιμοποιηθούν ως Πρότυπα).

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

ΓΚ

Υ.Γ.

Καλές Καλοκαιρινές διακοπές!






Πέμπτη, 24 Ιουνίου 2021

Ranking methods

First publish there http://rosettacode.org/wiki/Ranking_methods#M2000_Interpreter

This code use stack object (the current and one as a pointer to stack). Also we have gosub to simple routines (no local variables) like BASIC Gosub label.

Use Win Dir$ to open current directory and double click to ranking.txt

Use statement in M2000 console: Edit "ranking.txt" to open file in M2000 editor.

When output$ is an empty string then the #k handler is -2 (output to screen).

Using the Wide clause we get an UTF-16LE file (else we get an ANSI file, using current Locale value)

Open output$ for wide output as #k




Module Ranking (output$, orderlist) {
      Open output$ for output as #k
      Gosub getdata
      Print #k, "Standard ranking:"
      skip=true
      rankval=1
      oldrank=0
      For i=1 to items
            Read rank, name$
            if skip then
                  skip=false
            else.if oldrank<>rank then
                  rankval=i
            end if
            oldrank=rank
            Print #k, Format$("{0::-5} {2} ({1})", rankval, rank, name$)
      Next
      Gosub getdata
      Print #k, "Modified ranking:"
      skip=true
      rankval=Items
      oldrank=0
      ShiftBack 1, -items*2 ' reverse stack items
      For i=items to 1
            Read name$, rank
            if skip then
                  skip=false
            else.if oldrank<>rank then
                  rankval=i
            end if
            oldrank=rank
            Data Format$("{0::-5} {2} ({1})", rankval, rank, name$)
      Next
      ShiftBack 1, -items ' reverse stack items
      For i=1 to items
            Print #k, letter$
      Next i
      Gosub getdata
      Print #k, "Dense ranking:"
      skip=true
      Dense=Stack
      acc=1
      oldrank=0
      For i=1 to items
            Read rank, name$
            if skip then
                  skip=false
                  oldrank=rank
            else.if oldrank<>rank then
                  oldrank=rank
                  Gosub dense
                  acc=i
            end if
            Stack Dense {data Format$(" {0} ({1})",name$, rank)}      
      Next
      Gosub dense
      Gosub getdata
      Print #k, "Ordinal ranking:"
      For i=1 to items
            Print #k, Format$("{0::-5} {2} ({1})", i, Number, letter$)
      Next
      Gosub getdata
      Print #k, "Fractional ranking:"
      skip=true
      Frac=Stack
      acc=1
      oldrank=0
      For i=1 to items
            Read rank, name$
            if skip then
                  skip=false
                  oldrank=rank
            else.if oldrank<>rank then
                  oldrank=rank
                  Gosub Fractional
                  acc=I
            end if
            Stack Frac {data Format$(" {0} ({1})",name$, rank)}      
      Next
      Gosub Fractional
      Close #k
      End
      Fractional:
            val=((len(Frac)+1)/2+(acc-1))
            Stack Frac {
                  while not empty
                        Print #k, format$("{0:1:-5}{1}", val, letter$)
                  end while
            }
      Return
      dense:
            Stack Dense {
                  while not empty
                        Print #k, format$("{0::-5}{1}", acc, letter$)
                  end while
            }
      Return
      getdata:
            flush
            stack stack(orderlist) // place a copy of items to current stack
            items=stack.size/2
      Return
}
Flush
Data 44, "Solomon", 42, "Jason", 42, "Errol"
Data 41, "Garry", 41, "Bernard", 41, "Barry"
Data 39, "Stephen"
// get all items from current stack to a new stack
alist=[]
// To screen
Ranking "", alist
// To file
Ranking "ranking.txt", alist



Standard ranking:

    1 Solomon (44)

    2 Jason (42)

    2 Errol (42)

    4 Garry (41)

    4 Bernard (41)

    4 Barry (41)

    7 Stephen (39)

Modified ranking:

    1 Solomon (44)

    3 Jason (42)

    3 Errol (42)

    6 Garry (41)

    6 Bernard (41)

    6 Barry (41)

    7 Stephen (39)

Dense ranking:

    1 Solomon (44)

    2 Jason (42)

    2 Errol (42)

    4 Garry (41)

    4 Bernard (41)

    4 Barry (41)

    7 Stephen (39)

Ordinal ranking:

    1 Solomon (44)

    2 Jason (42)

    3 Errol (42)

    4 Garry (41)

    5 Bernard (41)

    6 Barry (41)

    7 Stephen (39)

Fractional ranking:

  1.0 Solomon (44)

  2.5 Jason (42)

  2.5 Errol (42)

  5.0 Garry (41)

  5.0 Bernard (41)

  5.0 Barry (41)

  7.0 Stephen (39)


Πέμπτη, 8 Απριλίου 2021

Η Μ2000 ως εκπαιδευτικό εργαλείο

Πρόσφατα στο φόρουμ Το Στέκι των Πληροφορικών άνοιξε το θέμα “Ποια γλώσσα θέλετε για τη Γ΄ Λυκείου;”. Ο θεματοθέτης με όνομα μέλους alkisg, κάνει μια εισήγηση για την αλλαγή της υπάρχουσας γλώσσας προγραμματισμού ΓΛΩΣΣΑ και προτείνει την javascript. Ποιός είναι όμως πραγματικά ο θεματοθέτης; Είναι ο Άλκης Γεωργόπουλος, καθηγητής ΠΕ19, ο οποίος εκτός των άλλων έχει συγγράψει το Διερμηνευτή της γλώσσας ΓΛΩΣΣΑ σε ένα περιβάλλον ανάπτυξης κώδικα.

Θυμάμαι την επικοινωνία που είχα μαζί του από το 2000, για θέματα πάνω στον διερμηνευτή του, και τότε του είχα αναφέρει ότι γράφω την Μ2000, με βασικό στόχο να υπάρχει μια γλώσσα για μαθητές που θα χρησιμοποιείται σε ένα περιβάλλον με γραφικά, με βάσεις δεδομένων και με πολυμέσα (εικόνα, ήχος, βίντεο). Στις βελτιώσεις του Διερμηνευτή της ΓΛΩΣΣΑΣ αναφέρεται το όνομά μου:


Αφαιρέθηκε ο διάλογος της εισόδου χρήστη και τώρα η είσοδος γίνεται μέσα από την οθόνη χρήστη. Αρχική μου σκέψη ήταν ότι οι μαθητές είναι πιο συνηθισμένοι σε διάλογους παρά σε περιβάλλον τερματικού, αλλά το δεύτερο μάλλον είναι πιο κοντά στο σκεπτικό και του βιβλίου και των καθηγητών (Γιώργος Καρράς, Πρέβεζα).

Σκοπός μου λοιπόν για την ενασχόλησή μου με τη ΓΛΩΣΣΑ ήταν, και είναι, η βελτίωση της μαθητικής εμπειρίας πάνω στη χρήση γλώσσας προγραμματισμού, και του συνοδευτικού της περιβάλλοντος ανάπτυξης προγραμμάτων.

Η συμμετοχή μου στο φόρουμ έγινε με τρεις τρόπους:

  • Μέσα από συζητήσεις για διάφορα θέματα όπου νόμιζα ότι θα προσφέρω κάτι.

  • Με προγράμματα παραδείγματα. Κάποια στιγμή τα παραδείγματα που έδωσα κρίθηκαν πολύ προχωρημένα και μετά από προειδοποίηση από τον Άλκη τα μετέφερα στο Blog της Μ2000, και τελικά διαγράφτηκαν από το φόρουμ του.

  • Την έκθεση (και όχι διαφήμιση) της προόδου ανάπτυξης της Μ2000, από τον Ιούλιο του 2015, με την έκδοση 8 της γλώσσας.

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

Ήρθε λοιπόν η συζήτηση για την νέα γλώσσα για την τρίτη Λυκείου (Γενικό Λύκειο), στις 20 Μαρτίου 2021. Όπως φάνηκε από τις απαντήσεις στο θέμα, ο θεματοθέτης γνώριζε ότι θα ανοίξει το θέμα, από το Π.Ε.ΚΑ.Π (Πανελλήνια Ένωση Καθηγητών Πληροφορικής), Δελτίο τύπου: “Συνάντηση για τα νέα Προγράμματα Σπουδών Πληροφορικής Δευτεροβάθμιας Επαγγελματικής Εκπαίδευσης” Αθήνα 31 Μαρτίου 2021. Άρα το θέμα του θα γίνονταν απλά παπαγαλάκι για διαμόρφωση γνώμης.

Οι προτάσεις για τις γλώσσες στέκονται σε δυο: javascript και python. Η κύρια διαφορά τους είναι ως προς το εύρος των συσκευών για εκτέλεση: Η javascript χρησιμοποιείται σε περιηγητές ιστοσελίδων, δηλαδή μπορεί να εκτελεστεί σε οποιαδήποτε συσκευή. H python έχει πολλές παραλλαγές και έτσι εκτελείται σε διάφορα λειτουργικά, αλλά όχι μέσα από ιστοσελίδες τοπικά (front end) αλλά σε επίπεδο εξυπηρετητή (server, back end). Ζήτησα στο ερωτηματολόγιο στην αρχή του θέματος να μπει και η Μ2000, και τελικά μπήκε μια επιλογή “Άλλη (πείτε ποια στα σχόλια)”. Σε επόμενο μήνυμα έκανα θέμα για τη ποιότητα των βιβλιοθηκών (frameworks) των προτεινόμενων γλωσσών και των προγραμμάτων παραδειγμάτων. Οι βιβλιοθήκες ανοικτού κώδικα δεν είναι ό,τι καλύτερο, έχουν πολλά προβλήματα. Επίσης η ποιότητα των παραδειγμάτων (αναφοράς) είναι κάκιστη. Υπάρχουν εξαιρέσεις αλλά λόγω της συμμετοχής μη επαγγελματιών ενδέχεται και το καλό να εκφυλιστεί. Είναι δύσκολο να υπάρχει έλεγχος στην ανάπτυξη έργου που συμμετέχουν πολλοί, τόσο ως προς τις αποφάσεις, όσο και από το πώς η κάθε συμμετοχή ενσωματώνεται ως κώδικας.

Έθεσα ακόμα ένα ζήτημα στον γενικότερο προβληματισμό για την επόμενη γλώσσα:

Θα βάλω ένα απλό ερώτημα για όσους προτείνουν μια γλώσσα:

Πόσο καλός γνώστης είσαι στη γλώσσα που προτείνεις;

Για να γίνει πιο απλό το ερώτημα: Πόσο έχεις μελετήσει την γλώσσα; Γνωρίζεις προγραμματισμό με αντικείμενα; Έχεις φτιάξει μια παραθυρική εφαρμογή με χρήση γεγονότων; Τέλος, μπορείς να αναφέρεις τις πηγές τις οποίες μελέτησες για να μάθεις τη γλώσσα;

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

Το μέλος evry (Ευριπίδης Βραχνός) γύρισε με απάντηση ως προς εκείνους που "διαφωνούν" ως πράγματι εκείνους που δεν έχουν ασχοληθεί αρκετά για να έχουν ασφαλή άποψη περί καταλληλότητας. Όμως καταλήγει σε ένα αυθαίρετο συμπέρασμα ότι προϋπόθεση για να προταθεί μια γλώσσα είναι η υπάρχουσα εκπαιδευτική της χρήση, με γνώση των δυσκολιών των μαθητών.

Απάντησα στο μέλος evry, ότι πράγματι ένα πλεονέκτημα για μια πρόταση είναι και η διδακτική εμπειρία πάνω στη χρήση μιας γλώσσας. Στάθηκα όμως στο γεγονός ότι το μάθημα της ΑΕΠΠ δεν είναι η χρήση μιας γλώσσας προγραμματισμού, αλλά μέσω της χρήσης η ανάπτυξη της αλγοριθμικής σκέψης. Έτσι μια γλώσσα πρέπει να μπορεί να σταθεί στην ανάπτυξη της αλγοριθμικής σκέψης σε όλα τα θέματα που καταπιάνεται η ΑΕΠΠ. Ειδικά σε θέματα αντικειμένων και προγραμματισμού με γεγονότα η υπάρχουσα ΓΛΩΣΣΑ δεν μπορεί να χρησιμοποιηθεί. Η διδακτική εμπειρία για μια οποιαδήποτε γλώσσα έπεται της πρότασης για χρήση αυτής στο σχολείο. Δεν μπορεί να αποτελεί προαπαιτούμενο, αλλιώς καμία νέα γλώσσα δεν θα μπορούσε να ενταχθεί στο μέλλον σε διδακτικό πρόγραμμα.


Έρχεται λοιπόν και το μήνυμα από τον alkisg προς εμένα (bugman ως όνομα χρήστη):


@bugman, άνοιξα αυτό το θέμα ώστε οι καθηγητές δευτεροβάθμιας να συζητήσουμε με βάση και την διδακτική ή ερευνητική εμπειρία μας, όχι μόνο με την προγραμματιστική εμπειρία μας. Είτε κάποιος μας μεταφέρει την εμπειρία του από τη διδασκαλία της ΓΛΩΣΣΑΣ στο Λύκειο, της Python στα ΕΠΑΛ, κάποιο paper που διάβασε για το τι γίνεται στην εκπαίδευση στο εξωτερικό, ή κάποιο άρθρο για τον κόσμο των επαγγελματιών προγραμματιστών, είναι όλα τους ανεκτίμητα.

Το να προτείνει ο καθένας αυτό που ήδη ξέρει είναι το πιο εύκολο· αλλά έτσι μπορεί να συνεχίσουμε να διδάσκουμε Pascal ή Visual Basic στον αιώνα τον άπαντα, και να δυσκολευόμαστε να εξηγήσουμε στους μαθητές τι σχέση έχει το είσοδος/επεξεργασία/έξοδος με τις διάτρητες κάρτες και τις εντολές εκτύπωσης.

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

Στο πρώτο σκέλος της απάντησής του υπάρχει μια θετική ατμόσφαιρα. Πράγματι οι πηγές (αναφορές) για τη χρήση μιας γλώσσας στην εκπαίδευση έχουν αξία.

Στο δεύτερο σκέλος της απάντησής του υποβαθμίζεται το πρώτο, όπου γλώσσες όπως η Pascal και η Basic είναι αποδεδειγμένα για χρόνια ενταγμένες στην εκπαίδευση. Δεν υπάρχουν αρνητικές κριτικές για αυτές τις δυο γλώσσες. Και οι δυο παραπάνω γλώσσες έχουν αναπτυχθεί σε μεγάλο βαθμό. Τι σημαίνει “ξεπερασμένη γλώσσα” και το αντίθετο τι θα θέλαμε για μια νέα γλώσσα;

Έδωσα τη παρακάτω απάντηση η οποία διαγράφτηκε δυο φορές! Επειδή δεν έπρεπε να εμφανιστεί στο κοινό, επειδή ενοχλούσε!


@alkisg

Αν βάλουμε ως μέτρο τη ΓΛΩΣΣΑ, τότε αυτή η γλώσσα είναι στο ΜΗΔΕΝ. Ευτυχώς να λέμε που έγραψες εσύ και άλλοι, διερμηνευτές για να μπορούν οι μαθητές να εξασκηθούν σε ένα προγραμματιστικό περιβάλλον. Διαφορετικά θα έκαναν εκτέλεση με χαρτί και μολύβι!

Δεν γνωρίζω αν υπήρχε σκοπιμότητα να μην δοθεί δοθεί περιβάλλον εκτέλεσης από την αρχή. Δηλαδή η μέθοδος εκτέλεσης στο χαρτί μπορεί να ήταν αποφασισμένη.

Το να αλλάξει η γλώσσα του μαθήματος με το ίδιο σκεπτικό της χρήσης του χαρτιού, δεν αλλάζει τίποτα ως προς την αξία της γλώσσας. Δηλαδή αν αλλάξουμε το πρόγραμμα από ΓΛΩΣΣΑ σε python ή javascript με περιορισμό εντολών και συναρτήσεων ώστε να ταυτίζεται στο σύνολο της ΓΛΩΣΣΑΣ δεν κάνουμε τίποτα. Είμαι βέβαιος ότι για το λόγο αυτό δεν έγινε αλλαγή μέχρι σήμερα.

Αναφέρεσαι σε γλώσσες όπως η Pascal και η Visual Basic. Εγώ θα πάω στη BASIC. Η γλώσσα αυτή είναι ό,τι καλύτερο για εκπαίδευση. Φτιάχτηκε για εκπαιδευτικούς σκοπούς. Θυμίζω την BBC Basic που επιλέχθηκε μαζί με τα BBC micro ως το μέσο εκπαίδευσης των σχολείων στη Βρετανία. Η BBC Basic είχε διαδικασίες και συναρτήσεις, αλλά και πολλές εντολές για χρήση γραφικών και ήχου, όπως και για αρχείων, καθώς και ενσωματωμένο Assembler. Αυτό το εργαλείο προϋπήρχε της ΓΛΩΣΣΑΣ, ήταν ανώτερο, ήταν κατασκευασμένο από Βρετανούς για Βρετανούς. Οι δικοί μας ήταν πιο πονηροί...έβγαλαν μια γλώσσα χωρίς περιβάλλον εκτέλεσης, χωρίς δυνατότητες γραφικών και ήχου σχεδόν είκοσι χρόνια μετά τη κυκλοφορία της BBC Basic. Αν αυτό δεν είναι ντροπή μας, τι άλλο είναι;

Η Μ2000 είναι επέκταση της BASIC, ανώτερη από την BBC BASIC, υποστηρίζει μέσα από το περιβάλλον της εκτέλεση άλλων γλωσσών, όπως javascript και visual basic, και επειδή μπορεί να λειτουργεί ως glue language έχω δώσει παράδειγμα που με ένα script της Μ2000 περιέχεται ο πηγαίος κώδικας σε c, και κατά την εκτέλεση παράγει dll (εξωτερική βιβλιοθήκη) με χρήση του gcc και τελικά την συνδέει άμεσα και εκτελεί τις συναρτήσεις ως εξωτερικές συναρτήσεις. Δεν μιλάμε για πισογύρισμα αλλά για τη δύναμη στο προγραμματιστικό περιβάλλον να συνδέεται με οτιδήποτε έχει ο υπολογιστής.

Οι δυνατότητες είναι άπειρες, και το περιβάλλον είναι ενιαίο και στηρίζεται στο Win32 μοντέλο το οποίο ουδέποτε θα εγκαταλειφθεί επειδή είναι το βέλτιστο (ως προς την ταχύτητα) και επειδή μπορεί να χρησιμοποιηθεί άνετα σε 64bit συστήματα.

Να σημειώσω εδώ ότι η Μ2000 έχει εκτός από δυναμικούς πίνακες, λίστες και στοίβες/ουρές έτοιμες, έχει λάμδα συναρτήσεις (ως πρώτης τάξης συναρτήσεις), αντικείμενα με και χωρίς δείκτες (σαν μεταβλητές ή structures της C#), καθώς και δυαδικές δομές (όπως τα types στην c). Επίσης έχει πέρασμα με τιμή (εξ ορισμού) και με αναφορά (πρέπει να δηλωθεί, δεν γίνεται αυτόματα) και προαιρετικά μπορούμε να ορίζουμε και τύπους. Επιπλέον έχει προγραμματισμό με γεγονότα, και χρήση νημάτων.

Και όλα αυτά με χρήση δυο λεξιλογίων ελληνικών και αγγλικών (περίπου 500+500 αναγνωριστικά).

Τι άλλο χρειάζεται κανείς;

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

Ο alkis σε απάντηση του μέλους komni στο εύστοχο RIP Bugman που απλά έγραψε σε ένα μήνυμά του ήταν:

Γ΄ Λυκείου / Απ: Ποια γλώσσα θέλετε για την Γ΄ Λυκείου;

« Τελευταίο μήνυμα από alkisg στις 30-3-2021 στις 11:44:12 πμ »

Υ.Γ. ο bugman διαγράφηκε μόνος του, δεν τον διέγραψε κάποιος διαχειριστής. Ο μόνος περιορισμός που του θέσαμε ήταν να μην μας ζαλίζει με την Μ2000 σε όλες τις συζητήσεις, παρά μόνο στο θέμα που είχε ανοίξει ειδικά για τη διαφήμισή της. Ε προφανώς δεν είχε άλλο λόγο συμμετοχής στο Στέκι πέρα από αυτόν, και έφυγε.


Με απλά λόγια η "δική μου" Μ2000, κατά κάποιους στο φόρουμ "ένα έκτρωμα", που περιέχει 33k γραμμές κώδικα μόνο ως παραδείγματα, με χρήση πολλών προγραμματιστικών αντικειμένων, με χρήση αντικειμένων και γεγονότων, με ενσωματωμένο σύστημα παραθύρων (GUI), με αρκετό υλικό, εγχειρίδια χρήσης και εκπαιδευτικά βιβλία (όλα δωρεάν), ήταν απλά μια "διαφήμιση" στο φόρουμ και όχι πρόταση για ένα μέσο ανάπτυξης αλγοριθμικής σκέψης. Αυτές τις απόψεις εκθέτει ο Άλκης Γεωργόπουλος για να μην διαταραχθεί η πρόταση περί της javascript. Δεν θα του κάνω το χατίρι να γίνω εγώ το θύμα “αντιπαράθεσης”. Είναι γνωστή η τακτική του να υποβαθμίζεις το Β για να προβάλλεις το Α όταν δεν έχεις επιχειρήματα για το Α.

Η πραγματικότητα είναι πολύ διαφορετική από αυτή που παρουσιάζει ο alkisg (Άλκης Γεωργόπουλος). Όλες οι γλώσσες που δίνονται με έλλειψη ισχυρών δομών εισόδου/εξόδου, έχουν πρόβλημα ως προς την ανάπτυξη πιο σύνθετων προγραμμάτων. Η javascript πρέπει να χρησιμοποιήσει το DOM document object model του περιηγητή. H python κάνει εξ ορισμού χρήση της κονσόλας, κάτι ανάλογο της κονσόλας του διερμηνευτή της ΓΛΩΣΣΑΣ. Τι είναι αυτό που πραγματικά έχουν αυτές οι δυο γλώσσες; Έχουν αντικείμενα κατάλληλα για να διευκολύνουν το προγραμματισμό! Ακριβώς το ίδιο πράγμα ισχύει και για τη Μ2000. Επιπλέον η Μ2000 έχει έλεγχο στη θέαση μεταβλητών που δεν υπάρχει στην javascript και στην python. Μια μεταβλητή σε μια συνάρτηση, για παράδειγμα, είναι θεατή μόνο στη συνάρτηση αυτή. Υπάρχουν όμως συναρτήσεις που αυτό δεν πρέπει να γίνεται και η Μ2000 υποστηρίζει και αυτή την παραλλαγή. Αυτές οι συναρτήσεις είναι οι εξυπηρετητές γεγονότων. Δηλαδή όταν ένα γεγονός συμβαίνει και υπάρχει μια συνάρτηση συνδεδεμένη με αυτό, τότε πρέπει να υπάρχει τρόπος η συνάρτηση να κληθεί έτσι ώστε να μπορούμε προγραμματιστικά να ελέγχουμε πηγές οι οποίες δεν είναι τοπικές στη συνάρτηση! Με απλά λόγια η ΓΛΩΣΣΑ η οποία απορρίπτει την έννοια της γενικής μεταβλητής δεν θα μπορούσε ποτέ να έχει προγραμματισμό με γεγονότα! Στις python και javascript όταν κάτι δεν έχει οριστεί σε μια συνάρτηση τότε υπάρχει τρόπος να βρεθεί σε κάποιο επίπεδο παραπάνω, είτε γιατί έχει δηλωθεί να βρεθεί είτε γιατί ο μηχανισμός της γλώσσας (διερμηνευτής) ψάχνει προς τα πίσω στη στοίβα εκτέλεσης κατά την εκτέλεση.

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

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

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


Δευτέρα, 1 Φεβρουαρίου 2021

Αναθεώρηση 20, έκδοση 10.

Έγιναν διορθώσεις στις Group.Count() και Member.Type$(), όταν χρησιμοποιείται το AYTO ή THIS. Είχα αλλάξει στον κώδικα της Μ2000 μια εσωτερική GetVar() με συνέπεια να μην ελέγχεται η AYTO ή THIS (δεν ήταν απαραίτητο), αλλά είχα μια ακόμα GetVar2() που έκανε τον έλεγχο, οπότε η διόρθωση ήταν να μπει η GetVar2() σε αυτές τις δυο εντολές. Αυτές οι συναρτήσεις χρησιμεύουν για να ελέγχουμε τα στοιχεία ομάδων (αντικειμένων χρήστη). Σπάνια θέλουμε κάτι τέτοιο και για το λόγο αυτό δεν είχε ελεγχθεί στις τελευταίες εκδόσεις 9 και 10 ένα πρόγραμμα από το 2015 που έχει αναρτηθεί στο blog εδώ. Όμως χθες κάποιος διάβασε την ανάρτηση του 2015 και συνήθως όταν γίνεται κάποια "σπάνια" σελίδα να διαβαστεί ελέγχω το πρόγραμμα και έτσι βρίσκω πιθανές παραλήψεις.

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

Παρασκευή, 8 Ιανουαρίου 2021

Νέο κεφαλαιο στο βιβλίο Μαθαίνω Προγραμματισμό

Το βιβλίο Μαθαίνω Προγραμματισμό συμπλήρωσε 9 κεφάλαια. 

Τα κεφάλαια που έχουν γραφτεί:

1. Το πρώτο μου πρόγραμμα!

2. Παιχνίδι: Μάντεψε έναν Αριθμό

3. Το κόσκινο του Ερατοσθένη

4. Το δένδρο του Πυθαγόρα

5. Παραγγελία Αυγών

6. Απόσταση Λιβενστέϊν

7. Ακολουθία Φιμπονάτσι με πολύ μεγάλους αριθμούς

8. Δυαδικός Αθροιστής

9. Ψηφιοποίηση Δεδομένων (Ελεύθερο Σχέδιο)

Το 9ο κεφάλαιο έχει 19 σελίδες (είναι το μεγαλύτερο). Έχει ένα πρόγραμμα με τρεις παραλλαγές (βάσει ολοκλήρωσης). Φτιάχνουμε με Ελεύθερο Σχέδιο σχήματα και τα καταχωρούμε και τα αναπαράγουμε. Φτιάχνουμε τα εργαλεία για το Ελεύθερο Σχέδιο.

Κατεβάστε το βιβλίο εδώ!


Πέμπτη, 7 Ιανουαρίου 2021

Αναθεώρηση 19, Έκδοση 10

 Βρήκα ένα Bug, μυστήριο! Ξεκίνησα σήμερα τον υπολογιστή και δουλεύοντας με τη Μ2000 βγήκε ένα πρόβλημα που κανονικά δεν έπρεπε να υπήρχε! Δηλαδή ο Timecount έδειχνε ότι είχαν περάσει 26 μέρες από την εκκίνηση. Λογικά όταν ξεκινάει ο υπολογιστής ο βασικός μετρητής του ξεκινάει από το μηδέν. Έτσι θα έπρεπε να είχε δείξει το πολύ μισή ώρα (σε χιλιοστά του δευτερολέπτου). Με την υψηλή τιμή η τιμή πήγαινε για καταχώρηση σε έναν Long (32bit) πράγμα που έβγαζε Overflow. To περιβάλλον της Μ2000 το έλεγε αλλά ήταν αδύνατο να συμβαίνει. Οπότε το εκτέλεσα μέσα από το περιβάλλον της VB6 και το διόρθωσα βάζοντας αντί για long τύπο Currency που δεν έχει ανάγκη (έχει μεγάλη ακρίβεια 21 ψηφίων όπου τα τέσσερα είναι δεκαδικά).

Πιθανόν το πρόβλημα να προέρχεται από αναβάθμιση των Windows. Αν και η τελευταία αναβάθμιση όπως θυμάμαι ήταν του Defender την προηγούμενη μέρα. Οπότε λογικά υπήρχε εδώ και 26 μέρες. Πιθανόν τότε έγινε και η αναβάθμιση των Windows 10. Έκανα κράτηση του υπολογιστή και επανεκκίνηση και διορθώθηκε και ο μετρητής Timecount. (αν δεν χρησιμοποιήσουμε το Profiler δεν μηδενίζει και δείχνει την διάρκεια που εκτελείται το λειτουργικό, δηλαδή από την εκκίνηση).