Κυριακή, 1 Νοεμβρίου 2015

Προδιαγραφές της Μ2000

Προδιαγραφές της Μ2000

Σκοπός του έργου αυτού είναι να φτιαχτεί μια γλώσσα με δυνατότητες για εκπαιδευτικούς σκοπούς. 

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

Για το σκοπό αυτό πρέπει να περιλαμβάνει:

Κονσόλα με χωριστή οθόνη (μια σταθερή πάνω και μια ολισθαίνουσα κάτω)
Διορθωτής κώδικα με χρωματισμό για τεράστια κείμενα, με απεριόριστο UNDO/REDO, με εύρεση, με πολλαπλή αλλαγή, με δείκτες παραγράφων για γρήγορη μετάβαση.
Γραφικά με καρτεσιανές και πολικές συντεταγμένες, έλεγχο πλάτους γραμμής, χρώματος, τύπου διαγράμμισης. Έλεγχος περιοχής εκτύπωσης. τρόπος εκτύπωσης (xor για rubber band)
Χειρισμός διαφανειών Sprites
Χειρισμός εικόνων, περιστροφή, μεγέθυνση, διαφάνεια, αλλαγή αναλογιών
Εικόνες τύπου wmf, emf, bmp, jpg, png, tif
Ήχοι/μουσική τύπου wav, mp3 και άλλα
Μουσική με νήματα για Midi κανάλια
Εκφορά λόγου, με οδήγηση γεγονότων.
Ταινίες mpg, avi
Βάσεις Δεδομένων τύπου mdb αλλά και μέσω ODBC.
Αρχεία κειμένου Utf-8, Utf-16LE, Utf-16BE, Ansi
Χειρισμός Εκτύπωσης

Ειδικές φόρμες που μεγενθύνονται όπως:

  • Φόρμα μηνύματος
  • Φόρμα μηνύματος με εισαγωγή απάντησης
  • Επιλογέας Χρωμάτων
  • Επιλογέας Εικόνας με προεπισκόπηση εικόνας
  • Επιλογέας Αρχείου για Αποθήκευση
  • Επιλογέας Αρχείου για Φόρτωση
  • Επιλογέας Φακέλου
  • Επιλογέας Γραμματοσειράς
  • Φόρμα Βοήθειας
  • Φόρμα Ελέγχου   - με βηματική εκτέλεση και θέαση κώδικα καθώς και τιμών μεταβλητών
  • Φόρμα Ρύθμισης
  • Φόρμες χρήστη που φτιάχνονται με απλές εντολές, με δυνατότητα πολλαπλών modal.

Στοιχεία ελέγχου για φόρμες χρήστη.

  • Πλήκτρο (Button) - χρησιμοποιείται και σαν απλό label, αλλά και σαν timer.
  • Εισαγωγή (Textbox) - χρησιμοποιείται και για αριθμητικές τιμές με γρήγορη αλλαγή τιμής με βελάκια και με το ροδελάκι στο ποντίκι
  • Επιλογή (Checkbox)
  • Κείμενο (Editbox) - μπορεί να χρωματίζει κώδικα με πολλούς τρόπους
  • Λίστα (Listbox) - έχει εσωτερική λίστα αλλά δέχεται και εξωτερική
  • Λίστα.Εισαγωγής (Combo) - έχει τρεις διαμορφώσεις - και αυτόματη συμπλήρωση.
  • Η Λίστα.Εισαγωγής χρησιμοποιείται και σε διαμόρφωση για μενού επιλογής
Στα στοιχεία της γλώσσας εκτός από τις μεταβλητές και τους πίνακες, που όλοι περιμένουν να υπάρχουν, πρέπει να χειρίζεται αντικείμενα, τόσο δικά της όσο και ξένα, και με γεγονότα.
Επίσης θέλουμε να εκτελείται κώδικας βάσει χρόνου, καθώς και με νήματα, που να εκτελούνται είτε διαδοχικά(να τελειώσει το ένα για να ξεκινήσει στην ώρα του το άλλο), ή ταυτόχρονα, να εκτελούνται εντολές παράλληλα.

Πάνω σε αυτά έχουμε την Μ2000:

Το όνομα της γλώσσας και το εικονίδιό της

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

Το συντακτικό της γλώσσας

Το συντακτικό της Μ2000 μοιάζει με την Basic, υποστηρίζει αρκετές εντολές της. Συντάσσεται γενικά με μπλοκ σε αγκύλες και σε ορισμένες δομές υπάρχουν δυο τρόποι σύνταξης, με και χωρίς αγκύλες. Σε μια γραμμή μπορούμε να έχουμε πολλές εντολές με διαχωριστικό την άνω και κάτω τελεία.
  • Τα αναγνωριστικά πρέπει να ξεκινούν με ένα γράμμα τουλάχιστον και μετά βάζουμε ότι θέλουμε, εκτός από σύμβολα - χαρακτήρες που θεωρούνται τερματικοί π.χ το + είναι τερματικός χαρακτήρας, όπως και το κλείσιμο παρένθεσης. Το άνοιγμα παρένθεσης όμως δηλώνει όνομα με παρενθέσεις, και μπορεί να εμφανίζεται στο τέλος του ονόματος.
  • Η αλλαγή γραμμών δεν είναι "white space", έχει θέση στη σύνταξη της γλώσσας. Δεν υπάρχει το ελληνικό ερωτηματικό για τέλος εντολής. Η εντολή τελειώνει όταν υπάρχει η άνω και κάτω τελεία, ή μια αλλαγή γραμμών, ή έχει τελειώσει ο κώδικας!
  • Μπορούμε να έχουμε αριθμούς γραμμών και ετικέτες με γράμματα. Τους αριθμούς γραμμών μπορούν να ακολουθούν εντολές, αλλά βρίσκονται πάντα στην αρχή μιας γραμμής (η παραγράφου εντολών). Οι ετικέτες ορίζονται με ονόματα που τερματίζουν σε άνω και κάτω τελεία, και μετά ακολουθεί ή αλλαγή γραμμής ή σύμβολο σημείωσης (' ή \).
  • Τα αλφαριθμητικά έχουν στο όνομά τους το $ ως τελευταίο γράμμα (μπορεί να ακολουθεί παρένθεση, έτσι το Α$( είναι ένα όνομα αλφαριθμητικού). Οι ακέραιες μεταβλητές έχουν το % ως τελευταίο γράμμα στο όνομά τοθς. Και οι πίνακες και οι συναρτήσεις έχουν παρενθέσεις. Τα [ και ] μπορούν να χρησιμοποιηθούν σε ονόματα ως χαρακτήρες.
  • Υπάρχουν οι λεγόμενες ρουτίνες με παρενθέσεις. Αυτές είναι παρόμοιες με τις διαδικασίες (sub) της Basic. Ένα Α() μπορεί να δηλώνει πίνακα, ή συνάρτηση ή ρουτίνα. Ο διερμηνευτής όταν βρει σε μια εντολή όνομα με παρενθέσεις παίρνει όλα τα στοιχεία που δίνουμε ανάμεσα στις παρενθέσεις και κοιτάει μετά το κλείσιμο της παρένθεσης αν έχουμε σύμβολο ανάθεσης ή τελεστή πράξεων, και αν όχι θεωρεί ότι καλούμε ρουτίνα. Σε μια έκφραση μπορεί να υπάρχει το Α() ως πίνακας ή ως συνάρτηση. Ο διερμηνευτής θεωρεί πρώτα ότι είναι πίνακας, και αν δεν είναι τότε καλεί τη συνάρτηση. Αν βάλουμε το @ μετά το Α(, δηλαδή το Α(@ τότε ο διερμηνευτής ξέρει ότι ζητάμε συνάρτηση.
  • Η επιστροφή τιμής σε συνάρτηση γίνεται με το = (χωρίς να υπάρχει κάτι αριστερά του ίσον).
  • Το = χρησιμοποιείται και για ισότητα και για εκχώρηση τιμής. Υπάρχει το == για πραγματικούς για μειωμένη ακρίβεια, ώστε να βρίσκει ίσους όταν η διαφορά τους είναι ελάχιστη. Υπάρχει και ο <=> που δεν δίνει λογικό, αλλά δίνει μια από τρεις τιμές με το 0 για το ίσον. 
  • Για εκχώρηση τιμής υπάρχουν και τα <= και := που χρησιμοποιούνται για ειδικό σκοπό.

Τύποι Μεταβλητών

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

  • Μπορούμε να έχουμε σταθερές καθώς και τιμές απαρίθμησης (enum) και αυτές είναι σταθερές.
  • Οι αριθμοί και οι ακέραιοι μπορούν να έχουν οποιοδήποτε αριθμητικό τύπο, αλλά εξ ορισμού είναι διπλοί (διπλής ακρίβειας πραγματικοί). Οι συγκρίσεις επιστρέφουν λογικό (boolean). Οι αριθμητικοί τύποι είναι οι ακέραιοι των 32 και 16 bit, o 29 ψηφίων Decimal (τον λέμε και απλά Αριθμό), ο Λογιστικός (Currency), o διπλός (double, διπλής ακρίβειας πραγματικός), ο απλός (single, απλής ακρίβειας πραγματικός). Όταν ένας από αυτούς τους τύπους χρησιμοποιείται σε βασικό ακέραιο, τα τυχόν δεκαδικά μηδενίζονται, και η εκχώρηση τιμής γίνεται με χρήση της μισής μονάδας, έτσι το Α%/2 με Α%=1 θα δώσει 1 (το 0.5 θα γίνει 1). Υπάρχει η ακέραια διαίρεση ΔΙΑ και το υπόλοιπο ως ΥΠΟΛΟΙΠΟ και ΥΠΟΛ, καθώς και τα αντίσοιχα ΔΙΑ# , ΥΠΟΛ# και ΥΠΟΛΟΙΠΟ# για την ευκλείδεια διαίρεση. Η ακέραια διαίρεση γίνεται και σε πραγματικούς: Πχ το 5 υπόλοιπο .3 θα δώσει 0.2 και το 5 δια .3 θα δώσει 16 και πράγματι 16*.3+.2 δίνει 5. Δείτε ότι το 0.3 το δίνουμε και ως .3 χωρίς το 0 μπροστά.
  • Ενώ οι μεταβλητές παίρνουν μια φορά τύπο και δεν αλλάζουν, οι πίνακες μεταβλητών δύναται να έχουν οποιονδήποτε τύπο ανά στοιχείο. Ο τρόπος που διαβάζεται από πίνακα ή εκχωρείται σε πίνακα, το στοιχείο έχει να κάνει με το όνομα του πίνακα. Η γλώσσα μπορεί να φτιάχνει ονόματα άλλου τύπου για ίδιο πίνακα, δηλαδή να φτιάχνει ένα άλλο όνομα σε άλλο τύπο που να συνδέει το περιεχόμενο ενός υφιστάμενου πίνακα.
  • Σύνθετες μεταβλητές είναι οι ομάδες, οι λάμδα συναρτήσεις και τα γεγονότα. Οι λάμδα συναρτήσεις είναι μεταβλητές που περιέχουν μια σειρά "κλεισιμάτων" και μια συνάρτηση που έχει θέαση στα κλεισίματα. Τα γεγονότα είναι λίστες συναρτήσεων με συγκεκριμένη "υπογραφή΄", που δηλώνει τι και πόσες παραμέτρους δέχεται στη κλήση, και σε κάθε κλήση καλεί όλες τις περιεχόμενες συναρτήσεις. Οι ομάδες είναι τα κύρια αντικείμενα της Μ2000 τα οποία είναι σαν προγράμματα, έχουν μέλη μεταβλητές, πίνακες, τμήματα, συναρτήσεις, ομάδες και ιδιότητες (ομάδες που επιστρέφουν ή δέχονται τιμές ή και τα δύο), καθώς επίσης μπορούν να ορίσουν και τελεστές πράξεων.
  • Καταχωρητές λέγονται τα αντικείμενα που περιλαμβάνουν στοιχεία, και έχουν τρεις κύριους τύπους, τους Πίνακες (στοιχεία με δείκτες, από 0 έως 10 διαστάσεις, μπορούμε να ορίζουμε τα όρια της κάθε διάστασης, ακόμα και με αρνητικούς αριθμούς), τις Καταστάσεις (λίστες με κλειδί/κλειδί ως τιμή, ή κλειδί/τιμή, όπου κλειδιά είναι αριθμοί ή αλφαριθμητικά και τιμές οτιδήποτε εκτός από τμήματα, αλλά μπορούμε να έχουμε ομάδες που έχουν τμήματα), και τους σωρούς τιμών (ειδικές στοίβες) όπου τα στοιχεία μπορούν εύκολα να αλλάξουν σειρά, να μετακινηθούν.
  • Ειδική περίπτωση καταχωρητή είναι οι αυτόματοι πίνακες, έτσι το Α=(1,2,3) κάνει το Α να δείχνει σε ένα πίνακα με τρία στοιχεία, ενώ το Β=(1,) να δείχνει σε ένα πίνακα ενός στοιχείου, και το Γ=(,) να δείχνει σε ένα κενό πίνακα. Το Δ=((1,2),(3,4)) κάνει το Δ να έχει ένα πίνακα με κάθε στοιχείο δυο πίνακες. Οι καταχωρητές που γράφονται σε μεταβλητές χωρίς παρενθέσεις είναι δείκτες, δηλαδή μπορούμε να έχουμε δυο ή περισσότερες μεταβλητές που να δείχνουν στον ίδιο καταχωρητή. Οι δείκτες αυτοί και να περάσουν με τιμή σε κλήση, θα περάσουν ως αντίγραφο δείκτη, έτσι θα έχουμε μια μορφή περάσματος με αναφορά, χωρίς όμως να αλλάξει ο δείκτης στο σημείο πριν την κλήση. Κλήσεις με αναφορά γίνονται με το & στο όνομα κατά τη κλήση και κατά το διάβασμα της αναφοράς στη πλευρά αυτού που καλούμε. Δεν μπορούμε να περάσουμε με τιμή κάτι που ζητάμε με αναφορά.
  • Για τους καταχωρητές υπάρχει η Κάθε() που βγάζει αντικείμενο που διατρέχει τον καταχωρητή σε μια δομή Ενώ. Δηλαδή ενώ η Ενώ παίρνει κανονικά μια έκφραση λογική, το αντικείμενο που βγάζει η Κάθε συνδέει το αντικείμενο που θέλουμε να διατρέξουμε τα στοιχεία του, και αποδίδει αληθές όταν υπάρχουν και άλλα, ή ψευδές όταν τερματίσει η μέτρηση. Η Ενώ παίρνει λίστα συνθηκών με το κόμμα, που αντιστοιχεί στο και ή AND, για τέτοια αντικείμενα, ώστε με μια Ενώ να έχουμε παράλληλη μέτρηση, μέχρι ένα τουλάχιστον από την λίστα να βγει ψευδής. Μπορούμε τα αντικείμενα αυτά να τα αναπρογραμματίζουμε μέσα στην Ενώ, γιατί και αυτά είναι με δείκτη, και στην επόμενη εκτέλεση θα βρει ο διερμηνευτής το νέο αντικείμενο. Έτσι μπορούμε να αλλάζουμε βήμα μέτρησης.
  • Ένας άλλος τρόπος να ορίζουμε τιμές είναι οι διαρθρώσεις μνήμης (buffers). Εδώ έχουμε να κάνουμε με μνήμη και το πώς την διαρθρώνουμε, σε επίπεδο byte. Μπορούμε να δώσουμε κάποιο απλό τύπο μνήμης, επί έναν αριθμό, ώστε να δώσει έναν πίνακα αυτού του τύπου, ή να φτιάξουμε μια δομή (structure) με άλλες δομές μέσα, και με ενώσεις ακόμα (unions), και να ορίσουμε μια διάρθρωση ν στοιχείων της δομής αυτής. Οι τύποι Ψηφίο (byte 8bit), Ακέραιος (Integer 16 bit) και Μακρύς (long 16bit) είναι χωρίς πρόσημο, δηλαδή από 0 και πάνω. Μπορούμε να ορίζουμε στις δομές ένα τύπο με το επί, για να δώσουμε πίνακα εντός της δομής. Οι δομές είναι τύπου Κατάστασης και επιστρέφουν το διάστημα από την αρχή (offset) για κάθε όνομα.
  • Οι διαρθρώσεις είναι αντικείμενα τα οποία χειρίζονται μπλοκ μνήμης, και μπορούν να αυξομειώνουν την μνήμη όταν το ζητάμε. Μια διάρθρωση με 10 διπλούς έχει μνήμη 10*8 byte, για την καταχώρηση αυτών των αριθμών και μπορούμε να ξέρουμε επακριβώς την θέση μνήμης κάθε αριθμού. Ένας πίνακας με δέκα διπλούς, θέλει 10*16 byte γιατί γράφονται σε μεταβλητές του συστήματος OLE τύπου Varian και δεν μας δίνεται η διεύθυνσή τους. Οι διαρθρώσεις χρησιμοποιούνται και σε κλήσεις εξωτερικών συναρτήσεων τύπου dll, όπου ζητείται δείκτης σε μνήμη. Ειδική περίπτωση διάρθρωσης είναι η τύπου Κώδικα όπου μπορεί να εκτελεί κώδικα σε γλώσσα μηχανής (επικίνδυνο αυτό για κόλλημα ή κρασάρισμα του προγράμματος). Οι διαρθρώσεις κώδικα κατά την εκτέλεση κλειδώνουν την εγγραφή σε αυτές, και για το  λόγο αυτό μόνο σταθερές μπορούν να περιέχουν. 
  • Ένα πρόγραμμα γράφεται σε ένα ή περισσότερα τμήματα. Τμήματα μπορούν να έχουν δικά του τμήματα και οτιδήποτε άλλο. Σε κάθε τμήμα η θέαση μεταβλητών (scope) περιορίζεται στο επίπεδο του τμήματος και το γενικό. Ότι όνομα-αναγνωριστικό- δημιουργούμε σε ένα τμήμα, χάνεται με το πέρας εκτέλεσης εκτός από απλές μεταβλητές που μπορούν να δηλωθούν ως στατικές. Το ίδιο ισχύει και για τις συναρτήσεις χρήστη, είναι απομονωμένες. Σε κάθε τμήμα ή και συνάρτηση μπορούμε να έχουμε ρουτίνες. Οι ρουτίνες είναι δυο ειδών. Οι απλές, με ένα όνομα και οι ρουτίνες με παρενθέσεις. Οι απλές ρουτίνες είναι σαν μέρος του τμήματος, που απλά βάζουμε μια ετικέτα και στο τέλος τους την Επιστροφή για να τις καλούμε όσες φορές θέλουμε από διάφορα σημεία του τμήματος. Οι ρουτίνες με παρενθέσεις έχουν την ιδιότητα του τμήματος να διαγράφουν ότι δημιουργούν, μπορούν να δημιουργούν τοπικές μεταβλητές και έχουν θέαση σε ότι έχει θέαση και το τμήμα που τις καλεί. Υπάρχει ειδική κλήση  συναρτήσεων και τμημάτων, με το Κλήση τοπικά που καλεί τμήματα και συναρτήσεις όπως και τις ρουτίνες με παρενθέσεις, δηλαδή χωρίς τα ονόματά τους να χρησιμοποιούνται ως νέος "σκοπός", αλλά να παρέχεται το όνομα αυτού που το καλεί. Τέτοιου τύπου κλήση είναι η κλήση γεγονότων αντικειμένων τύπου COM (αντικείμενα συνεργαζόμενα με την γλώσσα) και του συστήματος παραθύρων της Μ2000.
  • Οι συναρτήσεις δεν δηλώνουν τύπο επιστροφής εκτός από το βασικό, που φαίνεται στο όνομα. Μια συνάρτηση Α() δεν θα γυρίσει αλφαριθμητικό, αλλά μπορεί να γυρίσει πίνακα. Μια εντολή =1,2,3 θα γυρίσει πίνακα με τρεις αριθμούς, ενώ αν θέλουμε μείξη τιμών το =("α","β","γ") θα γυρίσει ένα tuple ή αυτόματο πίνακα με τρία αλφαριθμητικά.
  • Αναφέρθηκε παραπάνω η χρήστη του & για το πέρασμα με αναφορά. Μπορούμε να περάσουμε στατικές και στοιχεία πίνακα με αναφορά, αλλά και για τις δυο περιπτώσεις ο διερμηνευτής φτιάχνει μεταβλητές που τις δίνει με αναφορά και στην επιστροφή ενημερώνει ανάλογα τις στατικές  και τα στοιχεία πίνακα (copy in/copy out). Ειδικά για τα στοιχεία πίνακα αν ο πίνακας έχει μεταβληθεί στο μεταξύ, δεν βγαίνει λάθος, απλά ο διερμηνευτής βλέπει ότι δεν υπάρχει το στοιχείο που πρέπει να ενημερώσει και το προσπερνάει. Σε άλλες γλώσσες η αναφορά σε στοιχείο πίνακα κλειδώνει τον πίνακα, εδώ δεν υπάρχει κλείδωμα.
  • Ειδική περίπτωση κώδικα είναι αυτός που περιέχεται σε Νήμα. Τα νήματα είναι μέρη τμημάτων ή συναρτήσεων που εκτελούνται ανά τακτά χρονικά διαστήματα. Τα μέρη αυτά έχουν θέαση στο μέρος που δημιουργήθηκαν, έχουν δικές τους στατικές μεταβλητές και δικό τους σωρό τιμών. Μπορούμε από άλλο νήμα να εκτελέσουμε εντολές που θα αλλάξουν κατάσταση, δηλαδή κάποιες στατικές μεταβλητές και το δικό του σωρό τιμών. Τα νήματα έχουν αριθμούς για να τα χειριζόμαστε, τους οποίους κρατάμε σε μεταβλητές.
  • Εκτός από τις δομές επιλογής, επανάληψης και διακλάδωσης, έχουμε και δομές που συνδέονται με χρονισμό καθώς και με ύπαρξη ή όχι άλλων νημάτων.  Η  Κάθε ορίζει ένα μπλοκ εντολών που εκτελείται ανά τακτά χρονικά διαστήματα, χωρίς να είναι νήμα. Η Κύριο.Έργο είναι ένα νήμα που εκτελείται όσο υπάρχουν άλλα νήματα. Η Μετά ορίζει ένα νήμα που θα εκτελεστεί μετά από κάποιο χρονικό διάστημα μια φορά.
  • Η γλώσσα υποστηρίζει οκνηρή αποτίμηση αν θέλουμε, καθώς και πέρασμα συναρτήσεων με αναφορά (και συναρτήσεων ομάδων με αναφορά). Επίσης υπάρχει τρόπος να περάσουμε ένα μέρος τμήματος με αναφορά ώστε να όταν τρέχει να τρέχει σαν να είναι στο τμήμα (χωρίς να έχει τις στατικές και το σωρό τιμών του τμήματος, αλλά με θέαση μεταβλητών και άλλων τμημάτων και συναρτήσεων του τμήματος). Αυτός ο τρόπος ορίζει αυτό που λέμε call back.
  • Επιπλέον, σε ότι αφορά τον τρόπο κλήσης, μπορούμε να καλέσουμε ένα τμήμα αλλάζοντας ένα ή περισσότερα εσωτερικά τμήματα κατά την κλήση με ένα άλλο που θα δώσουμε στη κλήση (αυτό λέγεται διακόσμηση ή decoration). Έτσι ένα τμήμα μπορεί να εκτελεστεί με διαφορετικό τρόπο αν θέλουμε, και έχουμε σχεδιάσει να μπορεί να αλλάζει.

Το περιβάλλον της γλώσσας

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

  • Προκαθορισμένα αντικείμενα περιέχονται στη φόρμα της κονσόλας. Αυτή αποτελείται από αρκετά επίπεδα. Το πίσω επίπεδο, Περιθώριο, που δύναται να καταλαμβάνει όλη την οθόνη του υπολογιστή, το Επίπεδο που είναι αυτό που γράφουμε όταν ανοίγει η άμεση εκτέλεση εντολών, τα 32 επίπεδα από το Επίπεδο 1 μέχρι το Επίπεδο 32 τα οποία λειτουργούν σαν το βασικό ή και με την δυνατότητα των διαφανειών, όπου ορίζονται τα σημεία πλήρους διαφάνειας (λέγονται και Παίκτες και αναλογούν σε hardware sprites), το επίπεδο του Εκτυπωτή, και η Επιφάνεια. Το επίπεδο του εκτυπωτή έχει μέγεθος σελίδας εκτυπωτή, και μπορεί να οριστεί ο προσανατολισμός του. Η επιφάνεια είναι μια φόρμα πίσω από τη βασική φόρμα του περιβάλλοντος και καθορίζει το βάθος διαφάνειας της βασική φόρμας. Δηλαδή αν αλλάξουμε διαφάνεια στην βασική φόρμα η επιφάνεια ορίζει το αν θα βλέπουμε κάτι πίσω από τη βασική φόρμα ή ένα χρώμα πχ το μαύρο ή μια συγκεκριμένη εικόνα. Στην επιφάνεια δεν μπορούμε να γράψουμε.
  • Τα καθορισμένα από το χρήση επίπεδα είναι οι φόρμες χρήστη. Αν ορίσουμε μια φόρμα Φόρμα1 τότε θα υπάρχει το Επίπεδο Φόρμα1. Σε κάθε φόρμα χρήστη μπορούμε να χρησιμοποιούμε στοιχεία φορμών, άλλα για λίστες και άλλα για κείμενο μιας ή περισσοτέρων γραμμών, καθώς και το σύνθετο να έχουμε σε ένα στοιχείο και μια γραμμή κειμένου και μια αναδυόμενη λίστα. Αυτά τα στοιχεία τα δουλεύουμε με γεγονότα, με συναρτήσεις εξυπηρέτησης γεγονότων. Μπορούμε να φτιάξουμε πίνακες ομοειδών φορμών με πίνακες ομοειδών στοιχείων και με μια συνάρτηση εξυπηρέτησης να λαμβάνουμε τον αριθμό φόρμας και τον αριθμό στοιχείου φόρμας. Οι φόρμες μπορούν να ανοίγουν ως κυρίαρχες (modal) ώστε οι προηγούμενες από αυτές να μην μπορούν να επιλεχθούν από το χρήστη αν δεν κλείσουμε την κυρίαρχη φόρμα. Μπορούμε να έχουμε πολλαπλές κυρίαρχες φόρμες. Όλο το σύστημα διεπαφής με τις φόρμες χρήστη είναι πρωτότυπο στη Μ2000 (γράφτηκε για την Μ2000).
  • Σε κάθε επίπεδο μπορούμε να εκτελέσουμε εντολές που τυπώνουν γράμματα χωρίς να αλλάζουν το φόντο, να τυπώνουν με καθαρισμό γραμμής (μια εντολή το κάνει η Τύπωσε Πάνω). Ως προς το πως τυπώνουμε, υπάρχει η Τύπωσε που σχετίζεται με στήλες και το δρομέα χαρακτήρων, και μπορεί ανά στήλη να γράφει με την στοίχιση που θέλουμε, περιορίζοντας το αποτέλεσμα στη γραμμή, η Αναφορά χωρίς στήλες όπου αναπαράγει κείμενο  με στοίχιση ακόμα και πλήρη (και από αριστερά και από δεξιά) για όσες γραμμές θέλουμε ή όσες χρειάζονται αν δεν το ορίσουμε, ορίζοντας το πλάτος που θέλουμε σε χαρακτήρες ή σε διάστημα εικονοστοιχείων, η Επιγραφή που γράφει με διάφορους τρόπους, ακόμα και με γωνία, βάσει δρομέα γραφικών
  • Τα επίπεδα εκτός από αυτό του εκτυπωτή έχουν λειτουργία χωριστής οθόνης, όπου ορίζουμε ένα πάνω μέρος στατικό και ένα κάτω μέρος με δυνατότητα ολίσθησης. Επίσης μπορούμε να ορίζουμε περιοχή εμφάνισης ώστε ότι είναι εκτός περιοχής να μην αλλάξει (κάτι σαν μάσκα δηλαδή). Υπάρχουν δυο σύνολα εντολών, ένα για γραφικά 2 διαστάσεων, με λειτουργία καρτεσιανών και πολικών συντεταγμένων, καθώς και με επιλογή ομαλών γραμμών (GDI+) ή γρήγορων γραμμών (GDI32) και ένα για εικόνες, όπου μπορούμε να φορτώσουμε εικόνες ή να παράγουμε με αντιγραφή μέρους από το επίπεδο που θέλουμε, σε αλφαριθμητικά ή σε διαρθρώσεις μνήμης, και να τις χειριστούμε ως προς την εμφάνισή τους με το μέγεθος που θέλουμε, την αλλαγή αναλογίας ύψους/πλάτους, την περιστροφή και την διαφάνειά τους, και σε ένα χρώμα ως προς το 100% και σε όλη την εικόνα ως διαφάνεια εικόνας.
Περιλαμβάνεται ένα απλό σύστημα χρηστών, όπου με μια εντολή π.χ. Χρήστης ΑΛΕΚΟΣ αλλάζει ο χρήστης, αλλάζοντας τον φάκελο με τα αρχεία και τους υποφακέλους για τον χρήστη ΑΛΕΚΟ και επιπλέον όλες οι προσβάσεις για εγγραφή στο δίσκο περιορίζονται σε αυτόν το φάκελο και τους υποφακέλους (και στο πρόχειρο). Επιπλέον μπορεί κανείς σε ένα αρχείο Desktop.inf να βάλει εντολές που θα τρέχουν με την είσοδο στον χρήστη, ώστε να αλλάζουν τα χρώματα, το μέγεθος και η γραμματοσειρά, και το διάστιχο μεταξύ των γραμμών χαρακτήρων

Περιλαμβάνεται βοήθεια όπου με την εντολή  βοήθεια, ή την βοήθεια και μια λέξη  ή το ctrl+F1 ανοίγει η βοήθεια (στο διορθωτή μαρκάρουμε μια λέξη και με το crl+F1 βλέπουμε τον ορισμό της). Η βοήθεια υπάρχει και στα ελληνικά για τις ελληνικές εντολές και αγγλικά για τις αγγλικές.

Επιπρόσθετα αντικείμενα:

Στην κονσόλα, στη βασική φόρμα, υπάρχει αντικείμενο που δείχνει σελίδες html, και υπάρχει τρόπος να δείχνουμε φόρμες και να παίρνουμε αποτελέσματα, χωρίς χρήση server. Υπάρχει αντικείμενο που δείχνει βίντεο. Υπάρχει αντικείμενο που δείχνει μια αναδυόμενη λίστα για επιλογές (δουλεύει σύγχρονα, δηλαδή περιμένει την επιλογή μας, και ασύγχρονα, να πέρνει διαδοχικά πολλές επιλογές πριν κλείσουμε την λίστα). Για αναπαραγωγή ήχων και φωνής χρησιμοποιούμε ειδικές εντολές. Για ήχους μπορούμε να παίξουμε ένα αρχείο ήχου σύγχρονα ή ασύγχρονα, να παίξουμε νότες με το εσωτερικό μεγάφωνο - αυτό κάνει το διερμηνευτή να περιμένει την εκτέλεση της νότας, βάσει διάρκειας που δίνουμε. Υπάρχουν εντολές που δημιουργούν νήματα για το Midi, για να στέλνουμε κομμάτια μουσικής (γραμμένα σε αλφαριθμητικό με έναν συμβολικό τρόπο)  ανά φωνή με επιλογή οργάνου, τα οποία παίζουν στο περιθώριο.

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

Υπάρχουν τα αντικείμενα: Μαθηματικά που δίνει αρκετές συναρτήσεις μαθηματικών, και για 3d σχεδίαση. Πληροφορίες που δίνει πληροφορίες για το σύστημα, καθώς και άλλα όπως το Σταθμός που δημιουργεί Socket για συνδέσεις TCP/IP και το οποίο δουλεύει με γεγονότα.

Η γλώσσα χειρίζεται Έγγραφα (κείμενα), προγραμματιστικά, με τον τύπο Έγγραφο που ενώ φαίνεται ως αλφαριθμητικό εσωτερικά είναι αντικείμενο με μια διπλή συνδεδεμένη λίστα παραγράφων, όπου κάθε παράγραφος είναι ένα αλφαριθμητικό. Στη πράξη μπορεί να είναι περισσότερα, γιατί αυτό βοηθάει να ξεχωρίζουν οι γραμμές μιας παραγράφου στον διορθωτή, όταν έχουμε αναδίπλωση λέξεων (εξ ορισμού έχουμε και αλλάζει με το F1). Ένα αρχείο κειμένου μπορεί να φορτωθεί ή να σωθεί με μια εντολή και με επιλογή τρόπου ANSI (βάζουμε και κωδικοσελίδα αν θέλουμε), UTF-8, UTF-16LE και UTF-16BE, ενώ διαβάζει αυτόματα το σύστημα κατά την φόρτωση, καθώς και το σύστημα αλλαγών γραμμών. Υπάρχουν εντολές για σώσιμο σε υπάρχον αρχείο με συγχώνευση (γράφεται στο τέλος), και για φόρτωση αρχείου σε υπάρχον έγγραφο, γράφεται και αυτό στο τέλος του εγγράφου.

Χειρισμός Αρχείων

Υπάρχει χειρισμός αρχείων κειμένων κατά γραμμή με την Τύπωσε και την Γράψε (αυτή βάζει ειδικούς χαρακτήρες, και φτιάχνει CVS αρχεία), τόσο σε μορφή ANSI (8bit) όσο και σε Unicode (16bit UTF-16LE). Τα αρχεία μπορούν να είναι για εισαγωγή, εξαγωγή, συμπλήρωση ή πεδία.
Επίσης μπορούμε να χειριστούμε και δυαδικά αρχεία με χρήση διαρθρώσεων (γράφουμε ή διαβάζουμε όσο το μήκος της διάρθρωσης).
Ειδικά για τις διαρθρώσεις έχουμε εντολή που παίρνει ένα αρχείο και γυρίζει μια νέα διάρθρωση με όλο το άρχείο.
Μπορούμε να συμπεριλάβουμε στο κώδικα δυαδικά δεδομένα σε μορφή Base64 την οποία εφαρμόζει άμεσα (απλά λέμε ποιο αρχείο θέλουμε και μας το φέρνει το σύστημα στο κείμενο σε μορφή Base64)

Χειρισμός βάσεων δεδομένων

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

Έλεγχος Εκτέλεσης - Σφάλματα

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

  • Όταν συμβαίνει ένα λάθος εμφανίζεται μήνυμα. Σπάνια δεν υπάρχει μήνυμα, όπου στο κώδικα υπάρχει χαρακτήρας μη αποδεκτός και στο σημείο ο διερμηνευτής περιμένει τερματισμό εντολής το δέχεται ως τερματισμό κώδικα, χωρίς να αναφέρει λάθος. Αυτά τα λάθη φαίνονται με την έλεγχο εκτέλεσης. Μπορούμε τα λάθη να τα ελέγχουμε κατά την εκτέλεση με την δομή Δες. Υπάρχει περίπτωση το λάθος να είναι στο κώδικα της γλώσσας, και αυτό το θα μας το δείξει ο διερμηνευτής (αυτά βγαίνουν πάντα στα αγγλικά). Αν έχουμε επιλέξει Ελληνικά τότε τα μηνύματα λάθους του διερμηνευτή θα είναι στα ελληνικά αλλιώς θα είναι στα αγγλικά. Υπάρχει έλεγχος υπερχείλισης σε ακέραιους 32 και 16 bit. Υπάρχει έλεγχος ορίων στους πίνακες. Υπάρχει έλεγχος διπλού κλειδιού στις Καταστάσεις (εκτός του τύπου Ουράς, που δέχεται διπλά κλειδιά). Και στους σωρούς δεν μπορούμε να ζητάμε να φέρουμε το 15ο στοιχείο στη κορυφή όταν δεν υπάρχει 15ο στοιχείο. Μπορούμε στις παραμέτρους να ζητάμε συγκεκριμένο τύπο και εδώ θα έχουμε έλεγχο λάθους.
  • Αν έχουμε μια γενική Α και στο τμήμα δώσουμε το Α=5 τότε το Α θα είναι τοπικό, δεν θα αλλάξει η τιμή της γενικής. Αν δώσουμε το Α<=5 τότε θα αλλάξει η τιμή της γενικής. Αν πριν την εκχώρηση δώσουμε το Α++ θα αυξηθεί κατά 1 η γενική. Γενικά μπορεί να μην φανεί λάθος ενώ νομίζουμε ότι χειριζόμαστε μια γενική. Ο διερμηνευτής, επειδή δίνει προτεραιότητα στις τοπικές, θα δουλέψει με τις νέες τιμές και το πιθανότερ είναι να μην βγει λάθος. Η εκχώρηση τιμής με το <= δουλεύει για τις γενικές και τα μέλη ομάδων μέσα σε συναρτήσεις μελών ομάδων. Στους πίνακες η εκχώρηση μαζικών τιμών γίνεται με το :=, έτσι το Πίνακας Α(10) : Α(3):=1,2,3 θα βάλει από το Α(3) τις τιμές 1, 2, 3. Στις άλλες θέσεις δεν θα υπάρχει αριθμός, αλλά θα λογαριάζεται σε εκφράσεις το 0. Μια Τύπωσε Τύπος$(Α(0)) θα μας δώσει το Empty δηλαδή κενός (είναι υποτύπος μιας τύπου Variant μεταβλητής). Μια Τύπωσε Α() θα δώσει μερικές κενές στήλες και μόνο σε τρεις τα 1, 2 και 3. Η Τύπωσε δίνεται και ως ?
  • Στις διαρθρώσεις μνήμης αν δώσουμε κάτι εκτός περιοχής, είτε την αρχή του είτε σε μέγεθος, επειδή γίνεται έλεγχος μας επιστρέφει μήνυμα λάθους (οι διαρθρώσεις φτιάχτηκαν με σκοπό να μην πέφτει το σύστημα από διάβασμα ή γράψιμο ανύπαρκτης μνήμης).
  • Το πλήκτρο Esc διακόπτει το πρόγραμμα. Διακόπτει και τα νήματα. Αυτό το πλήκτρο μπορεί να γίνει ανενεργό με την εντολή Διαφυγή. Το ctrl+C κάνει διακοπή αφού μας ρωτήσει αν θέλουμε. Το Break κάνει διακοπή, πάλι με ερώτηση, σβήνοντας το πρόγραμμα- εκτός και αν έχουμε κάποια φόρμα χρήστη, η οποία δεν αφήνει άμεσα να γίνει η διακοπή, αλλά θα γίνει όταν το μήνυμα πάει στην κονσόλα (η κονσόλα είναι η αρχική οθόνη όπου δίνουμε εντολές άμεσα, όπως εκεί που συγγράφουμε τα τμήματα και τις συναρτήσεις μας).


Συνδεσιμότητα

Η γλώσσα Μ2000 μπορεί να δημιουργεί οποιοδήποτε αντικείμενο των Windows είναι διαθέσιμο και μπορεί να δημιουργηθεί χωρίς ειδική άδεια (κάτι σαν κωδικός). Μπορούμε να δούμε τι έχει ένα αντικείμενο, σε ιδιότητες και μεθόδους. Μπορούμε να καλέσουμε μεθόδους, καθώς και να αλλάξουμε ιδιότητες ή να διαβάσουμε ιδιότητες ή να ορίσουμε μεταβλητές συνδεδεμένες με ιδιότητες. Αν κάποια αντικείμενα διαθέτουν γεγονότα μπορούμε να τα διαχειριστούμε ορίζοντας το αντικείμενο με γεγονότα. Υπάρχει το παράδειγμα textout που με χρήση γεγονότων από το αντικείμενο των Windows για την ομιλία, να γράφουμε κάθε λέξη που προφέρει, την στιγμή που την προφέρει.
Μπορούμε να συνδέσουμε εξωτερικές βιβλιοθήκες dll, και των Windows, και της C (διαφέρει ο τρόπος κλήσης συναρτήσεων). Στην βοήθεια της όρισε υπάρχουν δυο παραδείγματα, το ένα ανοίγει ένα unicode message box των windows, και το άλλο καλεί την συνάρτηση printf της C.

Αρχείο Εγκατάστασης

Στο αρχείο εγκατάστασης υπάρχει το αρχείο info.gsb, ένα αρχείο περίπου 700kb, με έναν αριθμό τμημάτων τα οποία είναι παραδείγματα για τη γλώσσα.
Κατά την εγκατάσταση εμφανίζεται ένα μήνυμα στα αγγλικά και στο κάτω μέρος του μηνύματος φαίνεται πώς μπορούμε να φορτώσουμε το τμήμα αυτό (και με το F1 να το σώσουμε στο φάκελο του χρήστη). Αυτό το πρόγραμμα με το που φορτώνει δείχνει μια σελίδα με πληροφορίες και προγραμματίζει τα πλήκτρα λειτουργιών F1 έως  F12 (και επιπλέον μερικά με συνδυασμό SHIFT) για να εμφανίζει άμεσα το πρόγραμμα.

Δείτε το σκάκι!

Εικόνες από προγράμματα σε Μ2000




































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

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