Η γλώσσα Μ2000 σχεδιάστηκε το 1999 σε μια προσπάθεια να φτιάξω μια εφαρμογή ασχολίας με το προγραμματισμό, κύρια για εκπαιδευτικούς λόγους.
Γράφω ασχολίας διότι δεν ήθελα να είναι ένα εργαλείο επαλήθευσης αλγορίθμων. Τέτοιο εργαλείο χρειάζονται οι καθηγητές πληροφορικής και υπάρχει η απλή ΓΛΩΣΣΑ και εφαρμογές πολύ καλές όπως η ΓΛΩΣΣΟΜΑΘΕΙΑ για παράδειγμα, και ο Διερμηνευτής της Γλώσσας.
Επιπλέον στόχο είχα βάλει να περιλαμβάνει διπλό σύνολο εντολών, Ελληνικών και Αγγλικών. Άλλη "προδιαγραφή" ήταν να χρησιμοποιεί το λειτουργικό σύστημα για τις περισσότερες εργασίες παρά εξειδικευμένες βιβλιοθήκες. Έπρεπε να φτιάξω ένα περιβάλλον που θα θύμιζε υπολογιστή της δεκαετίας του 80. Έτσι το πρώτο πράγμα που έφτιαξα ήταν τον μεταφραστή γραμμής και την εντολή ΤΥΠΩΣΕ.
Ασφαλώς υπάρχουν γλώσσες προγραμματισμού "τεράστιες". Όμως είναι πολύ "Αφηρημένες" δηλαδή αφήνουν πολλά πράγματα στην πρωτοβουλία του προγραμματιστή, πράγμα που δεν μπορεί να έχει ένας νέος στο χώρο! Από την άλλη πλευρά δεν γίνεται να φτιάξει κανείς κάτι καλό αν δεν εξειδικεύσει σε αυτό που απλά λέμε δυνατότητες του συστήματος. Έτσι η Μ2000 είχε σαν στόχο από την αρχή να δίνει δυνατότητες μέσα στην "κονσόλα" της να μπορεί κανείς να χαράζει γραμμές, καμπύλες, πολύγωνα και κύκλους. Επίσης να γεμίζει την οθόνη με σχήματα από αρχεία emf και wmf , να φορτώνει εικόνες jpg σε μεταβλητές αλφαριθμητικών, να μετακινεί την "Οθόνη" πάνω στο "Περιθώριο" και το τελευταίο να μετακινείται στην οθόνη του υπολογιστή. Άλλες "προδιαγραφές" ήταν η χρήση χαρακτήρων ο ένας κάτω από τον άλλο, όπως στις κονσόλες εντολών και επιλογή τύπου γραμματοσειράς (όλες οι γραμματοσειρές ακόμα και οι αναλογικές μπορούν να χρησιμοποιηθούν με μη αναλογική γραφή). Φυσικά μπορούσε κανείς να βάλει και επιγραφές με αναλογική γραφή και μάλιστα και με γωνία σε ακτίνια. Επιπλέον ήθελα και ένα ωραίο χαρακτηριστικό, την χωριστή οθόνη, όπου ένα μέρος της πάνω δεν ολισθαίνει όταν "ζητάμε" γραμμή, καθώς γεμίζει η οθόνη. Δεν έμεινα μόνο σε αυτά για την οθόνη. Οι εντολές εκτύπωσης οδηγούνται ή στην Οθόνη, ή στο Περιθώριο ή στον Εκτυπωτή.
Επιπλέον στις πρώτες εκδόσεις έβαλα και την διαχείριση βάσεων δεδομένων τύπου MDB. Με απλές εντολές μπορούμε να χτίσουμε μια βάση και με ερωτήματα SQL ή πιο απλά , να πάρουμε στοιχεία. Παρακάτω είναι το σύνολο εντολών για τις βάσεις δεδομένων. Περιλαμβάνει την ΔΟΜΗ για την ανάγνωση της Δομής της, τις ΒΑΣΗ, ΠΙΝΑΚΑΣ και ΤΑΞΗ που δημιουργούμε τα βασικά (μια βάση με πίνακες και σε κάθε πίνακα τον τρόπο ταξινόμησης)
Αναζητηση, Search, Ανακτηση, Retrieve, Αρχειο, Table, Αφαιρεση, Delete, Βαση, Base, Δειξε, View, Δομη, Structure, Επιστροφη, Return, Προσθηκη, Append, Συμπιεση, Compress, Ταξη, Order
Ακολουθεί το πρόγραμμα που εμφανίζει η βοήθεια (υπάρχει ενσωματωμένη στη γλώσσα π.χ. γράφουμε βοηθεια δομη χωρίς τόνους και ανοίγει ένα παράθυρο με τα σχετικά). Παρακάτω αναφέρεται μια λίστα επιλογών. Αυτή είναι ένα κοινό Listbox το οποίο εμφανίζεται στην θέση των χαρακτήρων της οθόνης. Π.χ. Επιλογη "Ναι","Όχι" θα δώσει μια λίστα με δυο στοιχεία, δυο επιλογές. Την λίστα την χρησιμοποιούν η εντολή Αρχεια και η Δειξε για να επιλέξουμε στοιχεία από πίνακα της Βάσης (ή από SQL ερώτημα)
\\ Διορθώθηκε στις τάξεις. Δεν γίνεται επιστροφή μήκους, μόνο όνομα πεδίου και αν είναι Αύξουσα ή Φθίνουσα Τάξη. Επίσης με την ΒΑΣΗ.ΠΑΡΟΧΟΣ "" κάθε φορά επαναφέρουμε στον βασικό πάροχο σε περίπτωση που αυτόματα η Μ2000 άλλαξε πάροχο για να ανοίξει μια παλιά βάση mdb.
ΦΟΡΜΑ 80,50
ΒΑΣΗ.ΠΑΡΟΧΟΣ "" ' ρυθμίζει τον πάροχο στον βασικό (ενδέχεται να αλλαχθεί αυτόματα αν δεν μπορεί να ανοίξει μια βάση η Μ2000)
α=ΣΤΗΛΗ ' κρατάμε στο α το πλάτος νοητής στήλης στην οθόνη
ΤΥΠΩΣΕ $(0,8) ' ορίζουμε πλάτος 8
ΕΠΙΛΟΓΗ ' σβήνουμε την λίστα επιλογών
ΑΡΧΕΙΑ + "mdb" ' βάζουμε στην λίστα επιλογών όλα τα αρχεία τύπου "mdb"
' από τον τρέχον κατάλογο
ΑΝ ΕΠΙΛΟΓΕΣ>0 ΤΟΤΕ { ' αν υπάρχουν επιλογές στην λίστα
ΤΥΠΩΣΕ "Επέλεξε ένα αρχείο:";
ΕΠΙΛΟΓΗ ! ' εμφάνιση της λίστας για να επιλέξουμε
ΑΝ ΕΠΙΛΟΓΗ>0 ΤΟΤΕ {
ΒΑΣΗ$=ΕΠΙΛΟΓΗ$( ΕΠΙΛΟΓΗ )
ΤΥΠΩΣΕ ΠΕΖ$(ΒΑΣΗ$)+".mdb"
ΤΥΠΩΣΕ "Δομή"
ΤΥΠΩΣΕ "Αρχεία:";
ΔΟΜΗ ΒΑΣΗ$
ΔΙΑΒΑΣΕ ΑΡΧΕΙΑ ' εδώ δεν έχουμε την εντολή ΑΡΧΕΙΑ
'αλλά φτιάχνουμε μια μεταβλητή με το ίδιο όνομα και δίνουμε τιμή
' από τον σωρό
ΤΥΠΩΣΕ ΓΡΑΦΗ$(ΑΡΧΕΙΑ)
ΑΝ ΑΡΧΕΙΑ>0 ΤΟΤΕ {
ΓΙΑ Ι=1 ΕΩΣ ΑΡΧΕΙΑ {
ΔΙΑΒΑΣΕ ΟΝΟΜΑΤΑ$, ΤΑΞΕΙΣ
ΤΥΠΩΣΕ Ι,") "+ΟΝΟΜΑΤΑ$
ΔΟΜΗ ΒΑΣΗ$, ΟΝΟΜΑΤΑ$
ΔΙΑΒΑΣΕ ΠΕΔΙΑ, ΤΑΞΕΙΣ
' αν υπάρχει αριθμός στο σωρό και όχι λέξη τότε...
ΑΝ ΠΕΔΙΑ>0 ΤΟΤΕ {
ΓΙΑ Π=1 ΕΩΣ ΠΕΔΙΑ {
ΔΙΑΒΑΣΕ ΠΕΡΙΓΡΑΦΗ$, ΤΥΠΟΣ$, ΜΗΚΟΣ
ΤΥΠΩΣΕ "",Π,") "+ΠΕΔΙΟ$(ΠΕΡΙΓΡΑΦΗ$,17),"",ΤΥΠΟΣ$, ΜΗΚΟΣ
}
}
ΑΝ ΤΑΞΕΙΣ>0 ΤΟΤΕ {
ΤΥΠΩΣΕ "","ΤΑΞΗ:"
ΔΙΑΒΑΣΕ ΠΕΔΙΑ
ΑΝ ΠΕΔΙΑ>0 ΤΟΤΕ {
ΓΙΑ Π=1 ΕΩΣ ΠΕΔΙΑ {
ΔΙΑΒΑΣΕ ΠΕΡΙΓΡΑΦΗ$, ΤΥΠΟΣ$
ΤΥΠΩΣΕ "",Π,") "+ΠΕΔΙΟ$(ΠΕΡΙΓΡΑΦΗ$,17),"",ΤΥΠΟΣ$
}
}
}
}
}
}
}
ΤΥΠΩΣΕ $(0,α)
Εκτός από γραφικά και βάσεις δεδομένων ήθελα να έχω και πολυμέσα, δηλαδή μουσική και βίντεο, να παίζει αρχεία δηλαδή πολυμέσων. Στις πρώτες εκδόσεις οι πίνακες είχαν μόνο μια διάσταση.Από την πέμπτη έκδοση έχουμε μέχρι δέκα διαστάσεις και μάλιστα από την νέα έκδοση (ήδη από τον 6.1) έχουμε και δυναμικό τρόπο ανάπτυξης, μπορούν να οριστούν ξανά χωρίς να χάσουν στοιχεία, και μπορεί να γίνει αυτό ακόμα και αλλάζοντας τις διαστάσεις τους.
Τα σημεία που άλλαζαν την έκδοση ήταν: Η δεύτερη έκδοση απέκτησε την SELECT CASE (ΕΠΙΛΕΞΕ ΜΕ) και άλλες βελτιώσεις. Η τρίτη βελτίωσε τα γραφικά με πρόσθετες εντολές όπως γέμισμα χρώματος. Η τέταρτη έφερε την ενσωματωμένη βοήθεια. Η πέμτη έφερε τις συναρτήσεις χρήστη με δυνατότητα αναδρομής (κλήση του εαυτού της), τους πολυδιάστατους πίνακες. Σε αυτήν την έκδοση χώρισε ο σωρός, έτσι ώστε οι συναρτήσεις να μπορούν να έχουν τμήματα στο δικό της σωρό. Ο σωρός είναι το μέρος που από την πρώτη έκδοση πέρναγαν από και προς τα τμήματα τιμές, αριθμοί και αλφαριθμητικά (by value, με τιμή όπως λέμε). Μέχρι εδώ δεν υπήρχε μεταφορά τιμών με αναφορά. Πέρασαν αρκετά χρόνια (πάνω από δέκα) όπου ξεκίνησα να φτιάχνω την έκτη έκδοση. Από θέμα εντολών "κόρμού" μπήκε το πέρασμα με αναφορά. Με κλήση π.χ. ΟνομαΤμηματος &Α() αφήνει στον σωρό ένα αλφαριθμητικό που δηλώνει τον δείκτη που δείχνει τη θέση της "γνήσιας" μεταβλητής ή πίνακα. Έτσι με μια Διαβασε &Β() κάνουμε την Β() να δείχνει ότι και η Α(). Από την 6.2 μπορούμε να αλλάζουμε μέγεθος στον πίνακα Β() και θα αλλάξει (αφού είναι ο ίδιος) και στην Α(), και έτσι φτιάχτηκε και εντολή που "ρωτάει" για το πόσες διαστάσεις έχει ένας πίνακας και τι μέγεθος έχει σε κάθε μία!
Μια ιδιότητα που βρήκα. χωρίς να την είχα υπολογίσει είναι ότι επειδή οι πίνακες και οι μεταβλητές τουλάχιστον μέχρι την 6η έκδοση είχαν τιμές σε έναν δυναμικά αναπτυσσόμενο πίνακα τύπου variant, ώστε όπου ήθελα έβαζα αλφαριθμητικά και όπου ήθελα αριθμούς, μέσα από τον μηχανισμό αναφορών το εξέθεσα καλώς!
Να ένα παράδειγμα. Ένας μόνο πίνακας υπάρχει ο a(), ενώ ο b$() είναι η αναφορά στον α() αλλά επειδή είναι αλφαριθμητικός περνάει τιμές αλφαριθμητικών! Αυτόματα έχουμε μετατροπή από αριθμό σε αλφαριθμητικό όταν ζητάει ο b$() και το ανάποδο, μετατροπή του aaaa σε αριθμό (0). Αν αντί του "aaaa" είχα δώσει ας πούμε το 123 θα έδινε αριθμό 123 η a(3)
Dim a( 10 )
a( 2 ) = 1000
Push "aaaa"
Push &a( )
Read &b$( )
Read b$( 3 )
? b$( 2 ), b$( 3 )
' τυπώνει 1000 και aaaa ως αλφαριθμητικά
? a( 2 ), a( 3 )
' τυπώνει 1000 και 0 (επειδή τα βλέπει ως τιμές).
Η έκτη έκδοση έγινε λοιπόν 10 χρόνια μετά και προστέθηκαν εκτός από αυτό τον μηχανισμό, τα νήματα δηλαδή πολυεπεξεργασία, αυλοί επικοινωνίας, 32 επίπεδα (σαν hardware sprites), μουσική με νότες και επιλογή οργάνων, καθώς και η Repeat Until που δεν την έβαλα από την αρχή αφού υπήρχε τρόπος να στηθεί "περιφραστικά". ειδικά τα νήματα άλλαξαν τα πάντα. Στην έκδοση που φτιάχνω το σύστημα αντέχει να τρέχει "πολυεπίπεδα" νήματα, δηλαδή νήματα σε διαφορετικά τμήματα (αν το κάνει κανείς στην έκδοση έξι, ρισκάρει να δημιουργήσει μεταβλητές με ένα νήμα , και ενώ το τμήμα που το δημιούργησε έχε καλέσει ήδη ένα άλλο τμήμα). Ο κανόνας μέχρι την έκδοση έξι έλεγε ότι όταν ένα τμήμα τερματίζει ότι έχει φτιαχτεί από τον χρόνο που ξεκίνησε...θα σβήσει. Αν όλα τα νήματα τρέχουν στο ίδιο τμήμα δεν φοβάται κανείς το σβήσιμο, αφού αυτό θα γίνει όταν τερματίοει το τμήμα! Ο άλλος τρόπος είναι όπως αυτός που σχεδιάζω τώρα..όπου τα τμήματα δημιουργούν μεταβλητές στο δικό τους χώρο Έτσι φαίνονταν και παλιά αλλά η διαφορά είναι ότι παλιά ο τρόπος που έβρισκε κανείς τις μεταβλητές τις έκανε να ξεχωρίζουν και όχι ο τρόπος αποθήκευσης και αυτό γιατί δεν είχα την ιδέα πώς να πετύχω την πολυεπεξεργασία. Την οποία κάπου τη βρήκα βέβαια αλλά αυτός που την έφτιαξε δεν είχε καν κάνει το κόπο να κάνει κάτι με αυτή, ήταν ένα απλό ομιχλώδες σχέδιο! Εγώ ξεκίνησα να την χρησιμοποιώ με τη μουσική και μετά σκέφθηκα τα νήματα επεξεργασίας.
Αυτό είναι από την βοήθεια των εντολών Φωνη και Παιξε
Score 3, 1000, "C5F#@2B@2C5F#@2B"
Score 1, 1000, "D@2E@2C#3 @2D5@2V90 @3F#4V127"
'/ C C# D D# E F F# G G# A# B
'/
Play 1, 19, 3, 22 ' VOICE, INSTRUMENT
'Υπάρχουν 16 φωνές Φωνη 12, 1000,"C5"
'βάζουμε στη φωνή 12 να παίξει μια νότα Από την 5η οκτάβα για 1000 χιλιοστά
'Αν βάλουμε @2 θα παίξει σε χρόνο 1000/2, μέχρι @6 δηλαδή 1000/32
'Αν βάλουμε V και έναν αριθμό Από 1 μέχρι 127 αλλάζουμε την Ενταση
'Αν δεν βάλουμε γράμμα νότας και βάλουμε διάστημα Τότε παίζει παύση Με το διαιρέτη @ Αν υπάρχει
'Για να παίξουμε τη κάθε φωνή αρκεί να δώσουμε μια εντολή Παιξε Η Play
'όπου συνδιάζουμε φωνή και όργανο
'Η Παιξε 0 κλείνει την μουσική.
'Η Ενταση αλλάζει την Ενταση του ήχου συνολικά.
'Η Επιλεξε.Οργανο δίνει το νούμερο στο όργανο που θα επιλέξουμε από μια λίστα οργάνων
'Για να το χρησιμοποιήσουμε στην Παιξε (το διαβάζουμε με την Επιλογη)
Προσθήκη 13-4-2019
Η τρέχουσα έκδοση είναι η 9.8 (αναθεώρηση 17)
Από την αρχική Μ2000 έχει αφαιρεθεί ο προεπεξεργαστής με εντολές που ξεκίναγαν στην γραμμή με το σύμβολο #. Όλες οι άλλες εντολές εκτελούνται όπως είχαν σχεδιαστεί, και εμπλουτίστικαν στην πορεία.
Η γλώσσα είναι σε μια όριμη φάση, και το μόνο που σκέφτομαι να κάνω μέσα στο υπόλοιπο 2019, αν τα καταφέρω, είναι να φτιάξω έναν AST interpreter, που σημαίνει ότι θα σκανάρεται το κείμενο και θα δημιουργείται ένα δένδρο το οποίο αυτό θα εκτελείται. Υποτίθεται ότι θα κερδίσω σε ταχύτητα, αφού δεν θα χρειάζεται σε μια επανάληψη να διαβάζονται σταθερές αριθμητικές, και επίσης όλες οι δομές ροής θα είναι ενσωματομένες στο δέντρο (ως επιλογές κατά δεξιό ή αριστερό κλάδο). Προς το παρόν η γλώσσα είναι γραμμένη με συναρτήσεις, που δέχονται ένα αντικείμενο εκτέλεσης (ένας δείκτης σε αυτό), και ένας δείκτης σε ένα αλφαριθμητικό, το οποίο συνέχεια καταναλώνεται, δηλαδή κώδικας που διαβάζεται αφαιρείται. Ορισμένες φορές κοιτάει μπροστά ο διερμηνευτής και παίρνει αντίγραφο και το εκτελεί. Πχ σε μια Για Επόμενο, παίρνει αντίγραφο των εντολών ανάμεσα και στέλνει από αυτά ένα αντίγραφο για εκτέλεση για κάθε βήμα της επανάληψης. Η εκτέλεση είναι γρήγορη, γιατί αφενός ο εκτελεστής έχει μεταφραστεί από την Visual Basic 6 σε γρήγορη γλώσσα μηχανής και αφετέρου, ο κώδικας βρίσκεται σε μικρότερο αλφαριθμητικό και μπορεί να δουλευτεί γρήγορα στην γρήγορη μνήμη του επεξεργαστή.
Σκοπός της γλώσσας δεν είναι ο παραγωγικός κώδικας, δηλαδή να φτιάξουμε επαγγελματικές εφαρμογές. Για το σκοπό αυτό η ταχύτητα δεν είναι προτεραιότητα για τη Μ2000. Πολλές φορές δεν χρειαζόμαστε τον γρήγορο κώδικα, αλλά γρήγορες εντολές που έχει η γλώσσα, όπως για παράδειγμα την περιστροφή εικόνων, ή τη χρήση λιστών με συνάρτηση κατακερματισμού (Hash). Επειδή η εφαρμογή του διερμηνευτή τρέχει σε παραθυρικό περιβάλλον, δηλαδή όπως και να έχει τρέχει το σύστημα παραθύρων (άρα και το message loop), γίνεται πάντα διαχείριση μηνυμάτων. Αυτό από μόνο του είναι μια καθυστέρηση για το σύστημα. Όμως έχει και τα καλά του, επειδή μπορούμε να φτιάχνουμε δικά μας παράθυρα χρήση (φόρμες χρήστη) και να χρησιμοποιούμε στοιχεία ελέγχου.
Οι φόρμες χρήστη χρησιμοποιούν ένα συγκεκριμένο (φτιαγμένο από μένα) στοιχείο ελέγχου, το οποίο παίρνει διάφορες διαμορφώσεις. Η βασική του λειτουργία είναι του listbox, αλλά μέσω άλλων κλάσεων που το έχουν ως βάση, και διαβάζουν τα γεγονότα του, το διαμορφώνουν διαφορετικά.
Για παράδειγμα υπάρχει το στοιχείο Κείμενο ή Editbox το οποίο εμφανίζει ένα στοιχείο για να γράφουμε κείμενο σε πολλές γραμμές, έχει πολλές ιδιότητες, μια εκ των οποίων είναι ο χρωματισμός κειμένου. Όλα τα στοιχεία ελέγχου προγραμματίζονται με εντολές της Μ2000, τόσο για την σχεδίαση, όσο και για την λειτουργία.
Αν και η γλώσσα χρησιμοποιεί το μπλοκ κώδικα με αγκύλες, στην έκδοση 9 έχουν μπει οι δομές επανάληψης χωρίς τις αγκύλες.καθώς και η δομή Αν.
Έχει αναφερθεί παραπάνω η χρήση του & για πέρασμα με αναφορά. Αυτό που πρέπει να γίνει κατανοητό είναι ότι αν κάτι χρειάζεται να περαστεί με αναφορά πρέπει να περαστεί με αναφορά, σε αντίθεση με μερικές γλώσσες που ακόμα και το πέρασμα με τιμή δύναται να περαστεί εκεί που ζητάμε με αναφορά (πχ γίνεται στην Visual Basic, να ορίσουμε ByValue πριν την μεταβλητή, ή να δώσουμε έκφραση, άρα να μπει ByValue αυτόματα). Στη Μ2000 αν ζητάμε κάτι με αναφορά θα πρέπει να το περάσουμε με αναφορά.
Υπάρχει παράδειγμα όπου φτιάχνουμε ένα dll σε c, καλώντας τον gcc compiler, και στο ίδιο πρόγραμμα φορτώνουμε το dll και το συνδέουμε σε συνάρτηση χρήση (user function) η οποία παίρνει παραμέτρους και καλεί τη συνάρτηση στο dll όπως ορίσαμε, και μας γυρνάει το αποτέλεσμα.
Επίσης μπορούμε να δημιουργούμε αντικείμενα τύπου COM αν είναι καταχωρημένα στο registry των Windows, και είναι για δημόσια χρήση. Υπάρχει πρόγραμμα που στέλνει κείμενο στο αντικείμενο SAPI (speech API) και αυτό όχι μόνο διαβάζει το κείμενο, αλλά μας ενημερώνει με γεγονότα που έχουμε ορίσει ότι θα παίρνουμε, για κάθε λέξη που λέει, και έτσι το πρόγραμμα εμφανίζει ότι "μιλάει" το πρόγραμμα στο ρυθμό που μιλάει!
Στα αντικείμενα COM ανοίκει και το Office, και μπορούμε όχι μόνο να ανοίξουμε το Word αλλά και να δημιουργήσουμε κείμενο και να γράφει η Μ2000 σε αυτό. Μπορούμε να χειριστούμε και γεγονότα από το Word.
Υπάρχουν γλώσσες που κάνουν όλα αυτά, όπως η Python. Η διαφορά εδώ είναι ότι έχουμε ένα περιβάλλον που τα έχει όλα μέσα. Κάτι παρόμοιο λέει και η Python, αλλά ουσιαστικά χρειάζεται κάποιος να συμπεριλάβει πακέτα, και εδώ υπάρχουν πακέτα για ίδιες δουλείες με διαφορετικό τρόπο, δηλαδλη υπάρχει μια "πολυγλωσσία" η οποία αυξάνει την απαότηση για γνώση. Η Μ2000 κρατάει μικρότερο ποσό γνώσης που χρειάζεται κανείς για να την μάθει. Είναι προβλέψιμη γλώσσα.
Κύρια χαρακτηριστικά της Μ2000 που βοηθούν τον εκπαιδευόμενο είναι τα παρακάτω:
Στο πρόγραμμα εγκατάστασης υπάρχει το info.gsb, ένα αρχείο με τμήματα (το καθένα είναι και ένα πρόγραμμα) το οποίο αποτελείται από 12310 γραμμές κώδικα. Μέσα σε αυτό υπάρχει το τμήμα meditor ο οποίος είναι ένα παραθυρικός διορθωτής προγράμματος της Μ2000 (γραμμένος στη Μ2000), όπου γράφουμε το πρόγραμμά μας και το εκτελούμε σε έναν νέο διερμηνευτή που φορτώνει αυτόματα το πρόγραμμα δίνοντας το αρχείο με κατάλληξη gsb για εκτέλεση. Ο διερμηνευτής μπορεί να εκτελείται πολλές φορές, δηλαδή να εκτελούμε στον ίδιον υπολογιστή πολλά προγράμματα σε Μ2000 κώδικα.
Για να μεταφέρουμε το πρόγραμμa info.gsb στον φάκελο χρήση υπάρχουν οδηγίες στο readme.txt, το οποίο φαίνεται και κατά την εγκατάσταση, και οι οποίες αντιγράφονται εδώ:
dir appdir$
load info
then press F1 to save info.gsb to M2000 user directory
Αλλάζουμε τον τρέχον φάκελο στο φάκελο της εφαρμογής του διερμηνευτή, φορτώνουμε το info.gsb το οποίο εκτελεί άμεσα ένα τμήμα και ρυθμίζει τα πλήκτρα λειτουργιών ή Function Keys του πληκτρολογίου. Με το F1 (βάσει του προγραμματισμού που κάνει το info) κάνουμε άμεσα αλλαγή καταλόγου στον κατάλογο του χρήστη και σώνει το πρόγραμμα εκ νέου, μαζί με την εντολή εκτέλεσης. Αν ανοίξουμε έναν δεύτερο διερμηνευτή της Μ2000 αρκεί να γράψουμε Φόρτωσε info ή Load info και θα φορτωθούν οι 12k+ γραμμές άμεσα.
Κάτι παρόμοιο θα ήθελα και για την Python, να μπορώ να έχω σε ένα περιβάλλον διαδραστικό, φορτωμένα δυο ή περισσότερα προγράμματα και να μπορώ να αλλάζω το κώδικα και να τα εκτελώ άμεσα. Για να κάνει κανείς κάτι τέτοιο πρέπει να χρησιμοποιήσει κάποιο IDE, πχ το PyCharm, το οποίο όμως κάθε φορά εκτελεί το κώδικα σαν να είναι η πρώτη φορά. Η διαφορά με το περιβάλλον της Μ2000 είναι ότι μπορούμε να έχουμε γενικές μεταβλητές, δηλαδή να έχουμε σώσει κάποια κατάσταση, καθώς επίσης και στατικές μεταβλητές στις οποίες τμήματα και συναρτήσεις μπορούν να έχουν σώσει κάποια κατάσταση και να την χρησιμοποιήσουν στην επόμενη κλήση. Αν και η χρήση των γενικών μεταβλητών είναι "προβληματική" στο προγραμματισμό εντούτοις είναι χρήσιμη κατά την διαδικασία ελέγχου για τους εκπαιδευόμενους. Πχ θέλει κάποιος να μετρήσει πόσες φορές περνάει από ένα σημείο το πρόγραμμα. Αρκεί να φτιάξει πριν την κλήση του προγράμματος (το οποίο έχει φορτωθεί) μια γενική μεταβλητή έστω Κ και να βάλει στο κώδικα εκεί που θέλει το Κ++ το οποίο το αυξάνει κατά ένα. Με την έξοδο από το πρόγραμμα γράφει το Τύπωσε Κ ή ? Κ (το ? είναι το Τύπωσε) και εμφανίζει την τιμή άμεσα. Με τη ΓΛΩΣΣΑ της Γ' Λυκείου δεν μπορεί να γίνει η μέτρηση, γιατί δεν υπάρχουν γενικές μεταβλητές που να έχουν πρόσβαση τα υποπρογράμματα, και θα πρέπει να οριστεί στο κύριο σώμα, να υπάρχει η Γράψε (η αντίστοιχη της Τύπωσε) στο ίδιο πρόγραμμα, και όπου καλούμε το υποπρόγραμμα πρέπει να περνάμε την μεταβλητή ως παράμετρο. Δηλαδή πολύ δουλειά για μια απλή εισαγωγή του Κ++.
Ο λόγος που θέλω φορτωμένα δυο ή περισσότερα προγράμματα είναι για να μπορώ να έχω πολλές εκδόσεις του ίδιου προγράμματος, και να μπορώ να βλέπω τις διαφορές τους. Κερδίζει ο χρήστης από το να βλέπει κώδικα να εκτελείται, άμεσα σε δυο ή περισσότερες εκδόσεις. Κερδίζει σε κατανόηση, και έτσι βγάζει πιο καλά συμπεράσματα, δηλαδή μαθαίνει καλύτερα.
Συνεχίζεται...
Γράφω ασχολίας διότι δεν ήθελα να είναι ένα εργαλείο επαλήθευσης αλγορίθμων. Τέτοιο εργαλείο χρειάζονται οι καθηγητές πληροφορικής και υπάρχει η απλή ΓΛΩΣΣΑ και εφαρμογές πολύ καλές όπως η ΓΛΩΣΣΟΜΑΘΕΙΑ για παράδειγμα, και ο Διερμηνευτής της Γλώσσας.
Επιπλέον στόχο είχα βάλει να περιλαμβάνει διπλό σύνολο εντολών, Ελληνικών και Αγγλικών. Άλλη "προδιαγραφή" ήταν να χρησιμοποιεί το λειτουργικό σύστημα για τις περισσότερες εργασίες παρά εξειδικευμένες βιβλιοθήκες. Έπρεπε να φτιάξω ένα περιβάλλον που θα θύμιζε υπολογιστή της δεκαετίας του 80. Έτσι το πρώτο πράγμα που έφτιαξα ήταν τον μεταφραστή γραμμής και την εντολή ΤΥΠΩΣΕ.
Ασφαλώς υπάρχουν γλώσσες προγραμματισμού "τεράστιες". Όμως είναι πολύ "Αφηρημένες" δηλαδή αφήνουν πολλά πράγματα στην πρωτοβουλία του προγραμματιστή, πράγμα που δεν μπορεί να έχει ένας νέος στο χώρο! Από την άλλη πλευρά δεν γίνεται να φτιάξει κανείς κάτι καλό αν δεν εξειδικεύσει σε αυτό που απλά λέμε δυνατότητες του συστήματος. Έτσι η Μ2000 είχε σαν στόχο από την αρχή να δίνει δυνατότητες μέσα στην "κονσόλα" της να μπορεί κανείς να χαράζει γραμμές, καμπύλες, πολύγωνα και κύκλους. Επίσης να γεμίζει την οθόνη με σχήματα από αρχεία emf και wmf , να φορτώνει εικόνες jpg σε μεταβλητές αλφαριθμητικών, να μετακινεί την "Οθόνη" πάνω στο "Περιθώριο" και το τελευταίο να μετακινείται στην οθόνη του υπολογιστή. Άλλες "προδιαγραφές" ήταν η χρήση χαρακτήρων ο ένας κάτω από τον άλλο, όπως στις κονσόλες εντολών και επιλογή τύπου γραμματοσειράς (όλες οι γραμματοσειρές ακόμα και οι αναλογικές μπορούν να χρησιμοποιηθούν με μη αναλογική γραφή). Φυσικά μπορούσε κανείς να βάλει και επιγραφές με αναλογική γραφή και μάλιστα και με γωνία σε ακτίνια. Επιπλέον ήθελα και ένα ωραίο χαρακτηριστικό, την χωριστή οθόνη, όπου ένα μέρος της πάνω δεν ολισθαίνει όταν "ζητάμε" γραμμή, καθώς γεμίζει η οθόνη. Δεν έμεινα μόνο σε αυτά για την οθόνη. Οι εντολές εκτύπωσης οδηγούνται ή στην Οθόνη, ή στο Περιθώριο ή στον Εκτυπωτή.
Επιπλέον στις πρώτες εκδόσεις έβαλα και την διαχείριση βάσεων δεδομένων τύπου MDB. Με απλές εντολές μπορούμε να χτίσουμε μια βάση και με ερωτήματα SQL ή πιο απλά , να πάρουμε στοιχεία. Παρακάτω είναι το σύνολο εντολών για τις βάσεις δεδομένων. Περιλαμβάνει την ΔΟΜΗ για την ανάγνωση της Δομής της, τις ΒΑΣΗ, ΠΙΝΑΚΑΣ και ΤΑΞΗ που δημιουργούμε τα βασικά (μια βάση με πίνακες και σε κάθε πίνακα τον τρόπο ταξινόμησης)
Αναζητηση, Search, Ανακτηση, Retrieve, Αρχειο, Table, Αφαιρεση, Delete, Βαση, Base, Δειξε, View, Δομη, Structure, Επιστροφη, Return, Προσθηκη, Append, Συμπιεση, Compress, Ταξη, Order
Ακολουθεί το πρόγραμμα που εμφανίζει η βοήθεια (υπάρχει ενσωματωμένη στη γλώσσα π.χ. γράφουμε βοηθεια δομη χωρίς τόνους και ανοίγει ένα παράθυρο με τα σχετικά). Παρακάτω αναφέρεται μια λίστα επιλογών. Αυτή είναι ένα κοινό Listbox το οποίο εμφανίζεται στην θέση των χαρακτήρων της οθόνης. Π.χ. Επιλογη "Ναι","Όχι" θα δώσει μια λίστα με δυο στοιχεία, δυο επιλογές. Την λίστα την χρησιμοποιούν η εντολή Αρχεια και η Δειξε για να επιλέξουμε στοιχεία από πίνακα της Βάσης (ή από SQL ερώτημα)
\\ Διορθώθηκε στις τάξεις. Δεν γίνεται επιστροφή μήκους, μόνο όνομα πεδίου και αν είναι Αύξουσα ή Φθίνουσα Τάξη. Επίσης με την ΒΑΣΗ.ΠΑΡΟΧΟΣ "" κάθε φορά επαναφέρουμε στον βασικό πάροχο σε περίπτωση που αυτόματα η Μ2000 άλλαξε πάροχο για να ανοίξει μια παλιά βάση mdb.
ΦΟΡΜΑ 80,50
ΒΑΣΗ.ΠΑΡΟΧΟΣ "" ' ρυθμίζει τον πάροχο στον βασικό (ενδέχεται να αλλαχθεί αυτόματα αν δεν μπορεί να ανοίξει μια βάση η Μ2000)
α=ΣΤΗΛΗ ' κρατάμε στο α το πλάτος νοητής στήλης στην οθόνη
ΤΥΠΩΣΕ $(0,8) ' ορίζουμε πλάτος 8
ΕΠΙΛΟΓΗ ' σβήνουμε την λίστα επιλογών
ΑΡΧΕΙΑ + "mdb" ' βάζουμε στην λίστα επιλογών όλα τα αρχεία τύπου "mdb"
' από τον τρέχον κατάλογο
ΑΝ ΕΠΙΛΟΓΕΣ>0 ΤΟΤΕ { ' αν υπάρχουν επιλογές στην λίστα
ΤΥΠΩΣΕ "Επέλεξε ένα αρχείο:";
ΕΠΙΛΟΓΗ ! ' εμφάνιση της λίστας για να επιλέξουμε
ΑΝ ΕΠΙΛΟΓΗ>0 ΤΟΤΕ {
ΒΑΣΗ$=ΕΠΙΛΟΓΗ$( ΕΠΙΛΟΓΗ )
ΤΥΠΩΣΕ ΠΕΖ$(ΒΑΣΗ$)+".mdb"
ΤΥΠΩΣΕ "Δομή"
ΤΥΠΩΣΕ "Αρχεία:";
ΔΟΜΗ ΒΑΣΗ$
ΔΙΑΒΑΣΕ ΑΡΧΕΙΑ ' εδώ δεν έχουμε την εντολή ΑΡΧΕΙΑ
'αλλά φτιάχνουμε μια μεταβλητή με το ίδιο όνομα και δίνουμε τιμή
' από τον σωρό
ΤΥΠΩΣΕ ΓΡΑΦΗ$(ΑΡΧΕΙΑ)
ΑΝ ΑΡΧΕΙΑ>0 ΤΟΤΕ {
ΓΙΑ Ι=1 ΕΩΣ ΑΡΧΕΙΑ {
ΔΙΑΒΑΣΕ ΟΝΟΜΑΤΑ$, ΤΑΞΕΙΣ
ΤΥΠΩΣΕ Ι,") "+ΟΝΟΜΑΤΑ$
ΔΟΜΗ ΒΑΣΗ$, ΟΝΟΜΑΤΑ$
ΔΙΑΒΑΣΕ ΠΕΔΙΑ, ΤΑΞΕΙΣ
' αν υπάρχει αριθμός στο σωρό και όχι λέξη τότε...
ΑΝ ΠΕΔΙΑ>0 ΤΟΤΕ {
ΓΙΑ Π=1 ΕΩΣ ΠΕΔΙΑ {
ΔΙΑΒΑΣΕ ΠΕΡΙΓΡΑΦΗ$, ΤΥΠΟΣ$, ΜΗΚΟΣ
ΤΥΠΩΣΕ "",Π,") "+ΠΕΔΙΟ$(ΠΕΡΙΓΡΑΦΗ$,17),"",ΤΥΠΟΣ$, ΜΗΚΟΣ
}
}
ΑΝ ΤΑΞΕΙΣ>0 ΤΟΤΕ {
ΤΥΠΩΣΕ "","ΤΑΞΗ:"
ΔΙΑΒΑΣΕ ΠΕΔΙΑ
ΑΝ ΠΕΔΙΑ>0 ΤΟΤΕ {
ΓΙΑ Π=1 ΕΩΣ ΠΕΔΙΑ {
ΔΙΑΒΑΣΕ ΠΕΡΙΓΡΑΦΗ$, ΤΥΠΟΣ$
ΤΥΠΩΣΕ "",Π,") "+ΠΕΔΙΟ$(ΠΕΡΙΓΡΑΦΗ$,17),"",ΤΥΠΟΣ$
}
}
}
}
}
}
}
ΤΥΠΩΣΕ $(0,α)
Εκτός από γραφικά και βάσεις δεδομένων ήθελα να έχω και πολυμέσα, δηλαδή μουσική και βίντεο, να παίζει αρχεία δηλαδή πολυμέσων. Στις πρώτες εκδόσεις οι πίνακες είχαν μόνο μια διάσταση.Από την πέμπτη έκδοση έχουμε μέχρι δέκα διαστάσεις και μάλιστα από την νέα έκδοση (ήδη από τον 6.1) έχουμε και δυναμικό τρόπο ανάπτυξης, μπορούν να οριστούν ξανά χωρίς να χάσουν στοιχεία, και μπορεί να γίνει αυτό ακόμα και αλλάζοντας τις διαστάσεις τους.
Τα σημεία που άλλαζαν την έκδοση ήταν: Η δεύτερη έκδοση απέκτησε την SELECT CASE (ΕΠΙΛΕΞΕ ΜΕ) και άλλες βελτιώσεις. Η τρίτη βελτίωσε τα γραφικά με πρόσθετες εντολές όπως γέμισμα χρώματος. Η τέταρτη έφερε την ενσωματωμένη βοήθεια. Η πέμτη έφερε τις συναρτήσεις χρήστη με δυνατότητα αναδρομής (κλήση του εαυτού της), τους πολυδιάστατους πίνακες. Σε αυτήν την έκδοση χώρισε ο σωρός, έτσι ώστε οι συναρτήσεις να μπορούν να έχουν τμήματα στο δικό της σωρό. Ο σωρός είναι το μέρος που από την πρώτη έκδοση πέρναγαν από και προς τα τμήματα τιμές, αριθμοί και αλφαριθμητικά (by value, με τιμή όπως λέμε). Μέχρι εδώ δεν υπήρχε μεταφορά τιμών με αναφορά. Πέρασαν αρκετά χρόνια (πάνω από δέκα) όπου ξεκίνησα να φτιάχνω την έκτη έκδοση. Από θέμα εντολών "κόρμού" μπήκε το πέρασμα με αναφορά. Με κλήση π.χ. ΟνομαΤμηματος &Α() αφήνει στον σωρό ένα αλφαριθμητικό που δηλώνει τον δείκτη που δείχνει τη θέση της "γνήσιας" μεταβλητής ή πίνακα. Έτσι με μια Διαβασε &Β() κάνουμε την Β() να δείχνει ότι και η Α(). Από την 6.2 μπορούμε να αλλάζουμε μέγεθος στον πίνακα Β() και θα αλλάξει (αφού είναι ο ίδιος) και στην Α(), και έτσι φτιάχτηκε και εντολή που "ρωτάει" για το πόσες διαστάσεις έχει ένας πίνακας και τι μέγεθος έχει σε κάθε μία!
Μια ιδιότητα που βρήκα. χωρίς να την είχα υπολογίσει είναι ότι επειδή οι πίνακες και οι μεταβλητές τουλάχιστον μέχρι την 6η έκδοση είχαν τιμές σε έναν δυναμικά αναπτυσσόμενο πίνακα τύπου variant, ώστε όπου ήθελα έβαζα αλφαριθμητικά και όπου ήθελα αριθμούς, μέσα από τον μηχανισμό αναφορών το εξέθεσα καλώς!
Να ένα παράδειγμα. Ένας μόνο πίνακας υπάρχει ο a(), ενώ ο b$() είναι η αναφορά στον α() αλλά επειδή είναι αλφαριθμητικός περνάει τιμές αλφαριθμητικών! Αυτόματα έχουμε μετατροπή από αριθμό σε αλφαριθμητικό όταν ζητάει ο b$() και το ανάποδο, μετατροπή του aaaa σε αριθμό (0). Αν αντί του "aaaa" είχα δώσει ας πούμε το 123 θα έδινε αριθμό 123 η a(3)
Dim a( 10 )
a( 2 ) = 1000
Push "aaaa"
Push &a( )
Read &b$( )
Read b$( 3 )
? b$( 2 ), b$( 3 )
' τυπώνει 1000 και aaaa ως αλφαριθμητικά
? a( 2 ), a( 3 )
' τυπώνει 1000 και 0 (επειδή τα βλέπει ως τιμές).
Η έκτη έκδοση έγινε λοιπόν 10 χρόνια μετά και προστέθηκαν εκτός από αυτό τον μηχανισμό, τα νήματα δηλαδή πολυεπεξεργασία, αυλοί επικοινωνίας, 32 επίπεδα (σαν hardware sprites), μουσική με νότες και επιλογή οργάνων, καθώς και η Repeat Until που δεν την έβαλα από την αρχή αφού υπήρχε τρόπος να στηθεί "περιφραστικά". ειδικά τα νήματα άλλαξαν τα πάντα. Στην έκδοση που φτιάχνω το σύστημα αντέχει να τρέχει "πολυεπίπεδα" νήματα, δηλαδή νήματα σε διαφορετικά τμήματα (αν το κάνει κανείς στην έκδοση έξι, ρισκάρει να δημιουργήσει μεταβλητές με ένα νήμα , και ενώ το τμήμα που το δημιούργησε έχε καλέσει ήδη ένα άλλο τμήμα). Ο κανόνας μέχρι την έκδοση έξι έλεγε ότι όταν ένα τμήμα τερματίζει ότι έχει φτιαχτεί από τον χρόνο που ξεκίνησε...θα σβήσει. Αν όλα τα νήματα τρέχουν στο ίδιο τμήμα δεν φοβάται κανείς το σβήσιμο, αφού αυτό θα γίνει όταν τερματίοει το τμήμα! Ο άλλος τρόπος είναι όπως αυτός που σχεδιάζω τώρα..όπου τα τμήματα δημιουργούν μεταβλητές στο δικό τους χώρο Έτσι φαίνονταν και παλιά αλλά η διαφορά είναι ότι παλιά ο τρόπος που έβρισκε κανείς τις μεταβλητές τις έκανε να ξεχωρίζουν και όχι ο τρόπος αποθήκευσης και αυτό γιατί δεν είχα την ιδέα πώς να πετύχω την πολυεπεξεργασία. Την οποία κάπου τη βρήκα βέβαια αλλά αυτός που την έφτιαξε δεν είχε καν κάνει το κόπο να κάνει κάτι με αυτή, ήταν ένα απλό ομιχλώδες σχέδιο! Εγώ ξεκίνησα να την χρησιμοποιώ με τη μουσική και μετά σκέφθηκα τα νήματα επεξεργασίας.
Αυτό είναι από την βοήθεια των εντολών Φωνη και Παιξε
Score 3, 1000, "C5F#@2B@2C5F#@2B"
Score 1, 1000, "D@2E@2C#3 @2D5@2V90 @3F#4V127"
'/ C C# D D# E F F# G G# A# B
'/
Play 1, 19, 3, 22 ' VOICE, INSTRUMENT
'Υπάρχουν 16 φωνές Φωνη 12, 1000,"C5"
'βάζουμε στη φωνή 12 να παίξει μια νότα Από την 5η οκτάβα για 1000 χιλιοστά
'Αν βάλουμε @2 θα παίξει σε χρόνο 1000/2, μέχρι @6 δηλαδή 1000/32
'Αν βάλουμε V και έναν αριθμό Από 1 μέχρι 127 αλλάζουμε την Ενταση
'Αν δεν βάλουμε γράμμα νότας και βάλουμε διάστημα Τότε παίζει παύση Με το διαιρέτη @ Αν υπάρχει
'Για να παίξουμε τη κάθε φωνή αρκεί να δώσουμε μια εντολή Παιξε Η Play
'όπου συνδιάζουμε φωνή και όργανο
'Η Παιξε 0 κλείνει την μουσική.
'Η Ενταση αλλάζει την Ενταση του ήχου συνολικά.
'Η Επιλεξε.Οργανο δίνει το νούμερο στο όργανο που θα επιλέξουμε από μια λίστα οργάνων
'Για να το χρησιμοποιήσουμε στην Παιξε (το διαβάζουμε με την Επιλογη)
Προσθήκη 13-4-2019
Η τρέχουσα έκδοση είναι η 9.8 (αναθεώρηση 17)
Από την αρχική Μ2000 έχει αφαιρεθεί ο προεπεξεργαστής με εντολές που ξεκίναγαν στην γραμμή με το σύμβολο #. Όλες οι άλλες εντολές εκτελούνται όπως είχαν σχεδιαστεί, και εμπλουτίστικαν στην πορεία.
Η γλώσσα είναι σε μια όριμη φάση, και το μόνο που σκέφτομαι να κάνω μέσα στο υπόλοιπο 2019, αν τα καταφέρω, είναι να φτιάξω έναν AST interpreter, που σημαίνει ότι θα σκανάρεται το κείμενο και θα δημιουργείται ένα δένδρο το οποίο αυτό θα εκτελείται. Υποτίθεται ότι θα κερδίσω σε ταχύτητα, αφού δεν θα χρειάζεται σε μια επανάληψη να διαβάζονται σταθερές αριθμητικές, και επίσης όλες οι δομές ροής θα είναι ενσωματομένες στο δέντρο (ως επιλογές κατά δεξιό ή αριστερό κλάδο). Προς το παρόν η γλώσσα είναι γραμμένη με συναρτήσεις, που δέχονται ένα αντικείμενο εκτέλεσης (ένας δείκτης σε αυτό), και ένας δείκτης σε ένα αλφαριθμητικό, το οποίο συνέχεια καταναλώνεται, δηλαδή κώδικας που διαβάζεται αφαιρείται. Ορισμένες φορές κοιτάει μπροστά ο διερμηνευτής και παίρνει αντίγραφο και το εκτελεί. Πχ σε μια Για Επόμενο, παίρνει αντίγραφο των εντολών ανάμεσα και στέλνει από αυτά ένα αντίγραφο για εκτέλεση για κάθε βήμα της επανάληψης. Η εκτέλεση είναι γρήγορη, γιατί αφενός ο εκτελεστής έχει μεταφραστεί από την Visual Basic 6 σε γρήγορη γλώσσα μηχανής και αφετέρου, ο κώδικας βρίσκεται σε μικρότερο αλφαριθμητικό και μπορεί να δουλευτεί γρήγορα στην γρήγορη μνήμη του επεξεργαστή.
Σκοπός της γλώσσας δεν είναι ο παραγωγικός κώδικας, δηλαδή να φτιάξουμε επαγγελματικές εφαρμογές. Για το σκοπό αυτό η ταχύτητα δεν είναι προτεραιότητα για τη Μ2000. Πολλές φορές δεν χρειαζόμαστε τον γρήγορο κώδικα, αλλά γρήγορες εντολές που έχει η γλώσσα, όπως για παράδειγμα την περιστροφή εικόνων, ή τη χρήση λιστών με συνάρτηση κατακερματισμού (Hash). Επειδή η εφαρμογή του διερμηνευτή τρέχει σε παραθυρικό περιβάλλον, δηλαδή όπως και να έχει τρέχει το σύστημα παραθύρων (άρα και το message loop), γίνεται πάντα διαχείριση μηνυμάτων. Αυτό από μόνο του είναι μια καθυστέρηση για το σύστημα. Όμως έχει και τα καλά του, επειδή μπορούμε να φτιάχνουμε δικά μας παράθυρα χρήση (φόρμες χρήστη) και να χρησιμοποιούμε στοιχεία ελέγχου.
Οι φόρμες χρήστη χρησιμοποιούν ένα συγκεκριμένο (φτιαγμένο από μένα) στοιχείο ελέγχου, το οποίο παίρνει διάφορες διαμορφώσεις. Η βασική του λειτουργία είναι του listbox, αλλά μέσω άλλων κλάσεων που το έχουν ως βάση, και διαβάζουν τα γεγονότα του, το διαμορφώνουν διαφορετικά.
Για παράδειγμα υπάρχει το στοιχείο Κείμενο ή Editbox το οποίο εμφανίζει ένα στοιχείο για να γράφουμε κείμενο σε πολλές γραμμές, έχει πολλές ιδιότητες, μια εκ των οποίων είναι ο χρωματισμός κειμένου. Όλα τα στοιχεία ελέγχου προγραμματίζονται με εντολές της Μ2000, τόσο για την σχεδίαση, όσο και για την λειτουργία.
Αν και η γλώσσα χρησιμοποιεί το μπλοκ κώδικα με αγκύλες, στην έκδοση 9 έχουν μπει οι δομές επανάληψης χωρίς τις αγκύλες.καθώς και η δομή Αν.
Έχει αναφερθεί παραπάνω η χρήση του & για πέρασμα με αναφορά. Αυτό που πρέπει να γίνει κατανοητό είναι ότι αν κάτι χρειάζεται να περαστεί με αναφορά πρέπει να περαστεί με αναφορά, σε αντίθεση με μερικές γλώσσες που ακόμα και το πέρασμα με τιμή δύναται να περαστεί εκεί που ζητάμε με αναφορά (πχ γίνεται στην Visual Basic, να ορίσουμε ByValue πριν την μεταβλητή, ή να δώσουμε έκφραση, άρα να μπει ByValue αυτόματα). Στη Μ2000 αν ζητάμε κάτι με αναφορά θα πρέπει να το περάσουμε με αναφορά.
Υπάρχει παράδειγμα όπου φτιάχνουμε ένα dll σε c, καλώντας τον gcc compiler, και στο ίδιο πρόγραμμα φορτώνουμε το dll και το συνδέουμε σε συνάρτηση χρήση (user function) η οποία παίρνει παραμέτρους και καλεί τη συνάρτηση στο dll όπως ορίσαμε, και μας γυρνάει το αποτέλεσμα.
Επίσης μπορούμε να δημιουργούμε αντικείμενα τύπου COM αν είναι καταχωρημένα στο registry των Windows, και είναι για δημόσια χρήση. Υπάρχει πρόγραμμα που στέλνει κείμενο στο αντικείμενο SAPI (speech API) και αυτό όχι μόνο διαβάζει το κείμενο, αλλά μας ενημερώνει με γεγονότα που έχουμε ορίσει ότι θα παίρνουμε, για κάθε λέξη που λέει, και έτσι το πρόγραμμα εμφανίζει ότι "μιλάει" το πρόγραμμα στο ρυθμό που μιλάει!
Στα αντικείμενα COM ανοίκει και το Office, και μπορούμε όχι μόνο να ανοίξουμε το Word αλλά και να δημιουργήσουμε κείμενο και να γράφει η Μ2000 σε αυτό. Μπορούμε να χειριστούμε και γεγονότα από το Word.
Υπάρχουν γλώσσες που κάνουν όλα αυτά, όπως η Python. Η διαφορά εδώ είναι ότι έχουμε ένα περιβάλλον που τα έχει όλα μέσα. Κάτι παρόμοιο λέει και η Python, αλλά ουσιαστικά χρειάζεται κάποιος να συμπεριλάβει πακέτα, και εδώ υπάρχουν πακέτα για ίδιες δουλείες με διαφορετικό τρόπο, δηλαδλη υπάρχει μια "πολυγλωσσία" η οποία αυξάνει την απαότηση για γνώση. Η Μ2000 κρατάει μικρότερο ποσό γνώσης που χρειάζεται κανείς για να την μάθει. Είναι προβλέψιμη γλώσσα.
Κύρια χαρακτηριστικά της Μ2000 που βοηθούν τον εκπαιδευόμενο είναι τα παρακάτω:
- Ενσωματωμένος διορθωτής για συγγραφή προγραμμάτων με χρωματισμό προγράμματος.
- Ενσωματωμένη βοήθεια στα ελληνικά και τα αγγλικά (όλα τα αναγνωριστικά είναι σε δυο γλώσσες, ελληνικά και αγγλικά).
- Εκτέλεση βηματική με επίδειξη του κώδικα καθώς εκτελείται.
Στο πρόγραμμα εγκατάστασης υπάρχει το info.gsb, ένα αρχείο με τμήματα (το καθένα είναι και ένα πρόγραμμα) το οποίο αποτελείται από 12310 γραμμές κώδικα. Μέσα σε αυτό υπάρχει το τμήμα meditor ο οποίος είναι ένα παραθυρικός διορθωτής προγράμματος της Μ2000 (γραμμένος στη Μ2000), όπου γράφουμε το πρόγραμμά μας και το εκτελούμε σε έναν νέο διερμηνευτή που φορτώνει αυτόματα το πρόγραμμα δίνοντας το αρχείο με κατάλληξη gsb για εκτέλεση. Ο διερμηνευτής μπορεί να εκτελείται πολλές φορές, δηλαδή να εκτελούμε στον ίδιον υπολογιστή πολλά προγράμματα σε Μ2000 κώδικα.
Για να μεταφέρουμε το πρόγραμμa info.gsb στον φάκελο χρήση υπάρχουν οδηγίες στο readme.txt, το οποίο φαίνεται και κατά την εγκατάσταση, και οι οποίες αντιγράφονται εδώ:
dir appdir$
load info
then press F1 to save info.gsb to M2000 user directory
Αλλάζουμε τον τρέχον φάκελο στο φάκελο της εφαρμογής του διερμηνευτή, φορτώνουμε το info.gsb το οποίο εκτελεί άμεσα ένα τμήμα και ρυθμίζει τα πλήκτρα λειτουργιών ή Function Keys του πληκτρολογίου. Με το F1 (βάσει του προγραμματισμού που κάνει το info) κάνουμε άμεσα αλλαγή καταλόγου στον κατάλογο του χρήστη και σώνει το πρόγραμμα εκ νέου, μαζί με την εντολή εκτέλεσης. Αν ανοίξουμε έναν δεύτερο διερμηνευτή της Μ2000 αρκεί να γράψουμε Φόρτωσε info ή Load info και θα φορτωθούν οι 12k+ γραμμές άμεσα.
Κάτι παρόμοιο θα ήθελα και για την Python, να μπορώ να έχω σε ένα περιβάλλον διαδραστικό, φορτωμένα δυο ή περισσότερα προγράμματα και να μπορώ να αλλάζω το κώδικα και να τα εκτελώ άμεσα. Για να κάνει κανείς κάτι τέτοιο πρέπει να χρησιμοποιήσει κάποιο IDE, πχ το PyCharm, το οποίο όμως κάθε φορά εκτελεί το κώδικα σαν να είναι η πρώτη φορά. Η διαφορά με το περιβάλλον της Μ2000 είναι ότι μπορούμε να έχουμε γενικές μεταβλητές, δηλαδή να έχουμε σώσει κάποια κατάσταση, καθώς επίσης και στατικές μεταβλητές στις οποίες τμήματα και συναρτήσεις μπορούν να έχουν σώσει κάποια κατάσταση και να την χρησιμοποιήσουν στην επόμενη κλήση. Αν και η χρήση των γενικών μεταβλητών είναι "προβληματική" στο προγραμματισμό εντούτοις είναι χρήσιμη κατά την διαδικασία ελέγχου για τους εκπαιδευόμενους. Πχ θέλει κάποιος να μετρήσει πόσες φορές περνάει από ένα σημείο το πρόγραμμα. Αρκεί να φτιάξει πριν την κλήση του προγράμματος (το οποίο έχει φορτωθεί) μια γενική μεταβλητή έστω Κ και να βάλει στο κώδικα εκεί που θέλει το Κ++ το οποίο το αυξάνει κατά ένα. Με την έξοδο από το πρόγραμμα γράφει το Τύπωσε Κ ή ? Κ (το ? είναι το Τύπωσε) και εμφανίζει την τιμή άμεσα. Με τη ΓΛΩΣΣΑ της Γ' Λυκείου δεν μπορεί να γίνει η μέτρηση, γιατί δεν υπάρχουν γενικές μεταβλητές που να έχουν πρόσβαση τα υποπρογράμματα, και θα πρέπει να οριστεί στο κύριο σώμα, να υπάρχει η Γράψε (η αντίστοιχη της Τύπωσε) στο ίδιο πρόγραμμα, και όπου καλούμε το υποπρόγραμμα πρέπει να περνάμε την μεταβλητή ως παράμετρο. Δηλαδή πολύ δουλειά για μια απλή εισαγωγή του Κ++.
Ο λόγος που θέλω φορτωμένα δυο ή περισσότερα προγράμματα είναι για να μπορώ να έχω πολλές εκδόσεις του ίδιου προγράμματος, και να μπορώ να βλέπω τις διαφορές τους. Κερδίζει ο χρήστης από το να βλέπει κώδικα να εκτελείται, άμεσα σε δυο ή περισσότερες εκδόσεις. Κερδίζει σε κατανόηση, και έτσι βγάζει πιο καλά συμπεράσματα, δηλαδή μαθαίνει καλύτερα.
Συνεχίζεται...
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.