Δευτέρα, 4 Μαΐου 2020

Αναθεώρηση 22, έκδοση 9.9

Ανέβηκε η αναθεώρηση 22. Σε αυτήν προστέθηκαν οι τελεστές |Δια |υπολ και |υπόλοιπο και τα ίδια με το # στο τέλος για ευκλείδια διαίρεση και υπόλοιπο ώστε το Α=Α Δια 5 να γίνεται Α|Δια 5, όπως το Α=Α/5 γίνεται Α/=5. Η ιδέα εδώ ήταν να χρησιμοποιηθεί το | με τα αναγνωριστικά των ακεραίων διαιρέσεων και υπολοίπου.
Στη Μ2000 το αποτέλεσμα ακεραιας διαίρεσης 10 δια 2.5 δίνει 4, δηλαδή πόσες φορές χωράει ο διαιρέτης στον διαιρεταίο.  Το 11 υπολ 2.5 δίνει 1 ενώ το 11.2 υπόλοιπο 2.5 δίνει 1.2. Δηλαδή το υπόλοιπο μπορεί να έχει δεκαδικά. Αυτό που δεν έχει είναι η ακέραια διαίρεση.
Οι αριθμοί 1, 2.5, 2.ε-5 είναι πραγματικοί με τύπο Double. Αν χρησιμοποιήσουμε ακέραιους όπως τύπου Long τότε τα υπόλοιπα θα βγουν του ίδιου τύπου με τον διαιρεταίο. Το 20& είναι 32bit Long, ενώ το 10% είναι 16bit is Integer. Επιπλέον υπάρχουν άλλοι τρεις αριθμητικοί τύποι, το 30@ είναι Decimal με 29 ψηφια και δυνατότητα χρήσης κινητής υποδιαστολής, χωρίς τα προβλήματα των πραγματικών , ο 40# είναι Cuurency με 15 ακέραια ψηφια και έως 4 δεκαδικά χωρίς τα προβλήματα των πραγματικών,, και τέλος υπάρχει και ο απλός πραγματικός πχ ο 60~ ο οπoίος λέγεται single και σπάνια χρησιμοποιείται.
Στη Μ2000 ο τύπος μεταβλητής καθορίζεται μια φορά. Οι εκφράσεις μπορούν να βγάλουν μεγαλύτερου περιεχομένου τύπο αν χρειάζεται. Όμως κατά την ανάθεση τιμής αν δεν μπορεί να γίνει μετατροπή βγαίνει λάθος υπερχείλισης. Υπάρχει η σταθερά Άπειρο, και η -Άπειρο. Αυτές μόνο σε Double υπάρχουν.
Στους πίνακες όταν χρησιμοποιούμε τους άμεσους τελεστές πχ Α(5)*=10 διατηρούμε τον τύπο. Στην εκχώρηση νέας τιμής Α(5)=10 δεν τη διατηρούμε. Οι πίνακες έχουν τύπο Variant εσωτερικά όπως και οι μεταβλητές αλλά με περισσότερες ελευθερίες αλλαγής τους.
Εκτός από μεταβλητές και πίνακες και ομάδες αυτών, η Μ2000 έχει και δομές, ή structures. Ενώ στις ομάδες, τα μελη τους είναι όπως οι μεταβλητές και οι πίνακες, στις δομές επειδή σχετίζονται με τις διαρθρώσεις μνήμης,  υπάρχει περιορισμός ως προς τους τύπους. Έτσι στη δομή ο double έχει την πραγματική αποτύπωση σε μνήμη 64bit. Σε μια μεταβλητή έχει θέση 64bit σε έναν Variant 128bit., 16bytes O Decimal στον Variant χρησιμοποιεί 14bytes, είναι ο μεγαλύτερος. Έτσι ένας πίνακας double σε δομή έχει μέγεθος 8*αριθμό στοιχείων σε bytes, ενώ σε ένα πίνακα κανονικό έχει 16*αριθμό στοιχείων, και αυτό ισχύει για κάθε τύπο ακόμα και Boolean
Οι δομές χρησιμοποιούνται για κλήσεις σε εξωτερικές συναρτήσεις όπου δίνουμε τη διεύθυνση της δομής και η συνάρτηση περιμένει να βρει σε αυτήν την διεύθυνση στοιχεία με μια καθορισμένη διάταξη και τύπο. Οι δομές λέγονται UDT ή user defined type. Η Μ2000 μπορεί να κάνει κλήσεις σε εξωτερικές συναρτήσεις (μεθόδους) είτε του λειτουργικού είτε τύπου C. Επιπλέον μπορεί να περνάει τους variant σε μεθόδους αντικειμένων τύπου com, ακόμα και με αναφορά, τα οποία μπορεί να τα ανοίγει είτε είναι εσωτερικά (του περιβάλλοντος της Μ2000) είτε εξωτερικά.

Οι variant φτιάχτηκαν για χρήση με το λεγόμενο OLE, τη μέθοδο object linking and embedding, η οποία υποστηρίζεται απ' όλα τα λειτουργικά τύπου Windows   Όταν ορίζουμε μια μεταβλητή έστω Α να είναι ένα αντικείμενο συγκεκριμένο τότε ο Variant περιέχει έναν δείκτη στο αντικείμενο και εμφανίζει με το Τύπος$(Α) το τύπο του αντικειμένου. Εδώ η Μ2000 κάνει τον Α να μην μπορεί να αλλάξει τιμή εκτός της τιμής Τίποτα ή Nothing, και αυτό μια μόνο φορα. Δηλαδή τα εξωτερικά αντικείμενα σε μεταβλητές είναι μιας χρήσης μέχρι να διαγραφεί η μεταβλητή, η να μηδενιστεί με το Τίποτα. Ο λόγος του μηδενισμού όταν το θέλουμε έχει να κάνει με το ότι ο μηδενισμός είναι μια διαδικασία που δεν φαίνεται στο αντικείμενο com, και μπορεί να απαιτηθεί χρόνος. Τα αντικείμενα com λειτουργούν  σύγχρονα ή και ασύγχρονα. Στο info υπάρχει το textout το οποίο ανοίγει το Sapi5 το αντικείμενο που ασχολείται με την ομιλία, και με έλεγχο γεγονότων το χρησιμοποιεί ασύγχρονα, ώστε καθώς αναπαράγεται ομιλία να στέλνει τα γεγονότα που επιτρέπουν στη Μ2000 να δείχνει τις λέξεις την στιγμή που τις λέει! Η επικοινωνία με το αντικείμενο γίνεται με Variants. Το αντικείμενο βρίσκεται σε δικό του πραγματικό νήμα, και το πρόγραμμα μας βρίσκεται σε αναμονή. Όταν ένα γεγονός συμβεί (γίνει πυροδότηση σε μετάφραση του fired), τότε φτάνει στον διερμηνευτή με όνομα και τυχόν παραμέτρους. Από κει και πέρα καλεί η Μ2000 την συνάρτηση πχ Α_όνομα με μια τύπου κλήση Τοπικά όπου η συνάρτηση τρέχει σαν ο κώδικας να είναι μέρος του τμήματος που ορίσαμε το Α (το Sapi5), για να έχουμε θέαση όλων των μεταβλητων, ενώ μπορούμε να φτιάχνουμε νέες που πρόσκαιρα σκιάζουν υπάρχουσες. Μπορούμε να ξεκινήσουμε δύο ή τρία αντικείμενα να μιλάνε ταυτόχρονα! Αν ο δείκτης στο αντικείμενο γίνει Τίποτα, χάνεται η αναφορά στο αντικείμενο και λογικά αφού δεν υπάρχει άλλος το αντικείμενο ξεκινάει την διαγραφή του, την καταστροφή του. Αλλά αυτό μπορεί να γίνει σε χρόνο αργότερα επειδή κάτι να θέλει ολοκλήρωση. Οπότε ενώ πιστεύουμε ότι εχουμε διαγράψει το αντικείμενο αυτό να υπάρχει ακόμα! Αυτό σημαίνει ότι πρέπει να υπολογίζουμε κάποια χρονο αναμονής πριν προχωρήσουμε σε άλλες ενέργειες, που ίσως φέρουν το διερμηνευτή με το αντικείμενο σε ανταγωνισμό. Πολλά αντικείμενα έχουν μια μέθοδο quit ,για να πάρουν το μήνυμα ότι έρχεται η καταστροφή τους πριν αυτή απαιτηθεί!
Υπάρχουν γεγονότα που γυρίζουν παραμέτρους με αναφορά. Αυτό σημαίνει ότι με το πέρας εκτέλεσης της εξυπηρέτησης του γεγονότος η τιμή στη μεταβλητή με αναφορά θα αλλάξει στο αντικείμενο. Θα μπορούσε κανείς να διαγραφεί το αντικείμενο όταν αυτό έχει δώσει πχ ένα αλφαριθμητικό με αναφορά; Λοιπόν ίσως και να γίνεται. Η ουσία με τα αλφαριθμητικά στους Variant είναι ότι πάντα βγαίνουν αντίγραφα. Δηλαδή αυτό που θα πάρουμε με αναφορά είναι αντίγραφο εκείνου που τελικά θα αλλαχθεί. Ο κανόνας στα αλφαριθμητικά των Variants είναι ότι μια αλλαγή δημιουργεί νέο αλφαριθμητικό με την αλλαγή αυτή  Ο Variant κρατάει ένα δείκτη (4bytes 32bit)  pπου δείχνει το πρώτο γράμμα ή είναι Null δηλαδή κενό αλφαριθμητικό. Το μήκος του αλφαριθμητικού είναι σε θέση -4 από εκεί που δείχνει ο δείκτης. Η κωδικοποίηση είναι η Utf16LE με 2bytes το ελάχιστο (υπάρχουν και τα surrogates, όπου σε 4bytes γράφεται ένας χαρακτήρας). Έτσι το μέγιστο μήκος μπορεί να είναι 2GB.
Εσωτερικά στη Visual Basic 6,η οποία φτιάχτηκε για το Com , μοντέλο (λέγεται και ActiveX) μπορεί να πειράξει ένα αλφαριθμητικό με χρήση δεικτών, σπάζοντας το κανόνα. Για το λόγο της χρήσης γυμνών δεικτων θεωρείται και μη ασφαλή γλώσσα. Στη Μ2000 υπάρχουν περιθώρια για χρήση γυμνών δεικτων αλλά δεν συνιστάται. Οι διαρθρώσεις μνήμης είναι αντικείμενα που συνδέουν μνήμη με πρόγραμμα με ασφάλεια. Η μνήμη που απασχολούν είναι κλειδωμένη ως προς την εκτέλεση. Μπορούμε να φτιάξουμε μνήμη για εκτέλεση κώδικα, αλλά όταν αυτός εκτελείται είναι κλειδωμένος για αλλαγές. Δίνουμε στον προς εκτέλεση κώδικα τους Udt ή διαρθρώσεις μνήμης ή buffers (το ίδιο είναι) που θα γίνονται οι αποθηκεύσεις. Αυτός ο κανόνας επιλέχθηκε για ασφάλεια στη Μ2000. 
Τώρα ετοιμάζω τον compiler της γλωσσας. Τα τμήματα θα μεταφράζονται σε κώδικα για εικονική μηχανή. Στόχος μου είναι να διατηρηθεί η συμβατότητα, και να βελτιωθεί η ταχύτητα. Θέλω όλα τα προγράμματα στο info ,να εκτελούνται όπως και στον διερμηνευτή.
Τώρα η γλώσσα έχει ότι θεώρησα απαραίτητο, κατά τη διάρκεια πολλών αναθεωρήσεων.
Γιώργος Καρράς.

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου