Δευτέρα, 24 Αυγούστου 2015

Μ2000 παράδειγμα: Σκακιέρες

Σκοπός του παραδείγματος είναι να κατανοήσει ο μαθητής την χρήση γραφικών με πολλαπλασιαστή που αυξάνει το μέγεθός τους, ώστε να σχηματίσει στην οθόνη τρείς φορές μια σκακιέρα με πιόνα σε τρία μεγέθη. Έχει προστεθεί κώδικας που εξάγει την οθόνη στο δίσκο και δείχνει την χρήση της εντολής Εικόνα Εξαγωγή για αρχείο jpg με 100% ποιότητα, όπου καταφέρνει ο αλγόριθμος να μειώσει το μέγεθος αρχείου (το βλέπουμε) και  να διατηρήσει την αρχική ποιότητα. Για να το δούμε αυτό τυπώνουμε την εικόνα μεγεθυμένη τρεις φορές!

Σε ένα αρχείο "σκακιερες.gsb" βάζουμε το παρακάτω. Μέσα από το περιβάλλον της γλώσσας ανοίγουμε το φάκελο του χρήστη με την εντολή Win Dir$ ή Σύστημα Κατ$ και εκεί μεταφέρουμε το αρχείο. Άλλος τρόπος είναι μέσα από το περιβάλλον να δώσουμε σ Α και να αντιγράψουμε το Α μετά σ Π και να αντιγράψουμε το Π και τέλος να σώσουμε Σώσε σκακιερες  (δεν χρειάζεται εισαγωγικά - Στην αναθερώρηση 49 αν έχουμε τελικό ς θέλει εισαγωγικά στο όνομα,Σώσε "σκακιερες" , θα διορθωθεί στην 50). Ξεκινάει το πρόγραμμα με το Α και enter.


ΤΜΗΜΑ Α {
οθονη #103399,0
ανανεωση 10000
λ=0
μ=αληθες
σχ=1000
για λλ=1 εως 3 {
      σχ=σχ+λ*9
      συ=1000
      λ=300*λλ
      για κ=0 εως 7 {
            για ι=0 εως 7 {
                  θεση σχ+ι*λ, συ+κ*λ
                  αν μ τοτε { χ=3 } αλλιως χ=7
                  πολυγωνο χ, 0,λ,λ,0,0,-λ,-λ,0
                  μ~
                  θεση σχ+ι*λ, συ+κ*λ
                  αν κ=1 τοτε Π 1, λ
                  αν κ=6 τοτε Π 0, λ
            }
                  μ~     \\ εδώ έχουμε το μ = όχι μ
      }
      για ι=0 εως 7 {
            θεση σχ+ι*λ+λ/2.5, συ+κ*λ
            επιγραφη χαρ$(ι+65),"Arial", λ/50
            θεση σχ-λ/3, συ+ι*λ+λ/3
            επιγραφη γραφη$(ι+1),"Arial", λ/50
      }
     ανανεωση
}
ανανεωση 10
θεση 0,0 \\ εδώ είναι το πρόσθετο μέρος για να σώσει την  οθόνη με δυο φορμά, Jpg και Bmp
καθαρο α$
αντεγραψε κλιμαξ.χ, κλιμαξ.υ στο α$ \\ αντιγράφουμε την οθόνη σε ένα αλφαριθμητικό
εικονα α$ εξαγωγη "screen001.jpg", 100
αντεγραψε "screen001.bmp"   \\ αυτή είναι μια εντολή για απευθείας σώσιμο της οθόνης
\\ εδώ  μας δείχνει το μήκος των αρχείων
Τύπωσε αρχειου.μηκος("screen001.jpg"), αρχειου.μηκος("screen001.bmp")
}
ΤΜΗΜΑ Π {
\\ εδώ φτιάχνουμε το άσπρο ή μαύρο πιόνι, χρησιμοποιούμε σχετικές συντεταγμένες
ΔΙΑΒΑΣΕ ΧΡ, ΠΛΕΥΡΑ
Λ=ΠΛΕΥΡΑ/7000
ΑΝ ΧΡ<>0 ΤΟΤΕ ΧΡ=15
ΒΗΜΑ 3500*λ,2500*λ
Κ=ΠΕΝΑ
ΠΕΝΑ ΧΡ
ΠΟΛΥΓΩΝΟ ΧΡ,3000*Λ,4000*Λ,-6000*Λ,0,3000*Λ,-4000*Λ
ΚΥΚΛΟΣ ΓΕΜΙΣΜΑ ΧΡ, 2000*Λ
ΒΗΜΑ -3500*Λ,-2500*Λ
ΠΕΝΑ Κ
}



χρωματισμένα αυτόματα (έκδοση 8. αναθ. 69)



Κυριακή, 23 Αυγούστου 2015

Μ2000: Αναθεώρηση 40 (έκδοση 8).

Στην νέα αναθεώρηση 40 πέρασε και η λύση στο bug στο IDE (περιβάλλον προγραμματισμού) της Vb6 που βρήκα σε Windows 8 εξηντατετράμπιτα. Σε 32Bit Windows 7 και XP δεν υπάρχει θέμα. Το πρόβλημα δεν υπάρχει στο EXE (στο εκτελέσιμο).

Η γλώσσα Μ2000 σχεδόν έχει τελειώσει - δυο τρια πραγματάκια σκέφτομαι να προσθέσω. Θα ετοιμάσω το ελληνικό εγχειρίδιο "Μ2000: Ορισμός γλώσσας". Προς το παρόν υπάρχει το Αγγλικό Αυτό το καιρό εμπλουτίζω το παράρτημα εντολών και παράλληλα τεκμηριώνω την γλώσσα, δοκιμάζοντας τα παραδείγματα και αυτό παίρνει χρόνο.






Παρασκευή, 21 Αυγούστου 2015

Μ2000. Συμβατότητα με Windows 8 και 10.

Επιτέλους μετά από πειράματα έβγαλα εντελώς την σύνδεση με το GDI plus, που χρησιμοποιούσα στην Μ2000 για την εξαγωγή jpg αρχείου, και είχε πρόβλημα στα Windows 8  και 10 κατά την εξαγωγή jpg αρχείου. Βρήκα κωδικοποιητή σε vb6 και τον πέρασα στο κώδικα της γλώσσας και τώρα μπορώ να κάνω το ίδιο πράγμα μάλλον καλύτερα. Και αυτό γιατί αυτός που το έφτιαξε ακολούθησε τον ορισμό του βιβλίου..κατά γράμμα και δίνει την δυνατότητα να σώσουμε με ποιότητα ψηφιακής κάμερας.
Πώς γίνεται αυτή η διαφοροποίηση μεταξύ "εξαγωγής κάμερας" και μη; Λοιπόν υπάρχει αυτό SetSamplingFrequencies 1, 1, 1, 1, 1, 1 το οποίο δηλώνει τις τρεις συνιστώσες του μοντέλουYCbCr του jpg (δεν είναι το RGB αλλά φέρνει τοίδιο αποτέλεσμα, την εικόνα) πόσες δειγματοληψίες θα έχει στον αλγόριθμο. Περισσότερες δειγματοληψίες δημιουργούν μια απαλότητα, λιγότερες αφήνουν πιο "σκληρή" την εικόνα, με περισσότερο "γρέζι". Για εκτυπώσεις δεν χρειάζεται τόσο "γρέζι" και έτσι χρησιμοποιούν αυτό SetSamplingFrequencies 2, 2, 1, 1, 1, 1 Τα δυο πρώτα είναι η φωτεινότητα, και αυτής την διαφοροποίηση καταλαβαίνει περισσότερο το μάτι από τα άλλα δύο. Ο αλγόριθμος τελικά για το 2,2,1,1,1,1 θα πάρει για κάθε Pixel τη φωτεινότητα και τις συνιστώσες χρωμάτων μια για κάθε 2Χ2 pixel.
Στην γλώσσα Μ2000 η εξαγωγή γίνεται με την Image A$ Export "image1.jpg", 60   όπου για >50 ποιότητα έχουμε τις συχνότητες 1,1,1,1,1,1 και ίσο και κάτω (<=50) έχουμε το 2,2,1,1,1,1  οπότε μικρότερη ποιότητα σε μεγάλη φωτογραφία δεν φαίνεται η διαφορά (λόγω πολλών μεγαπίξελ). H μεταβλητή α$ κρατάει φωτογραφία ή εικόνα ασυμπίεστη. Μπορούμε να φορτώσουμε ένα αλφαριθμητικό με εικόνα από άλλο αλφαριθμητικό αλλάζοντας μέγεθος, να φορτώσουμε από αρχείο ή να φορτώσουμε από μέρος της οθόνης, δίνοντας πλάτος και ύψος με πάνω αριστερή γωνία τον δρομέα γραφικών. Τις εικόνες από τα αλφαριθμητικά μπορούμε να τις τυπώσουμε στην οθόνη ή στον εκτυπωτή με αλλαγή μεγέθους και περιστροφή, Ειδικές περιπτώσεις είναι η Διαφάνεια όπου ορίζουμε χρώμα για 100% διαφάνεια και παράμετρο για συνολικό ποσοστό διαφάνειας, με ταυτόχρονη αλλαγή μεγέθους και περιστροφή. Επίσης μπορούμε να ορίσουμε 32 επίπεδα (ή παίκτες) όπου βρίσκονται σε σειρά πάνω από την οθόνη χωρίς να "πατάνε" σε αυτήν και μπορούμε να τα μετακινήσουμε όπου θέλουμε. Οι παίκτες μπορούν να πάρουν εικόνα με περιστροφή και μλέγεθοςκαι να οριστεί χρώμα διαφάνειας αλλά και περιοχή διαφάνειας (πόσα γειτωνικά χρώματα επίσης θα είναι 100% διάφανα).

Έκδοση διερμηνευτή-περιβάλλοντος 8 αναθεώρηση 39.


Τρίτη, 18 Αυγούστου 2015

Χειρισμός Εγγράφων στη Μ2000 μέρος 1ο

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

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

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

Επίσης εδώ χρησιμοποιούμε την Για Επόμενο και όχι την Για {} χωρίς κάποιο ιδιαίτερο λόγο (η Για {} είναι πιο γρήγορη αλλά δεν μας ενδιαφέρει εδώ) .

Δείτε πως με μια ανάθεση τιμών γεμίζουμε τον πίνακα α$() με τέσσερα στοιχεία.

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

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

Τύπωσε μορφή$("Α={0:2}, Β={1:2}", 2.567, 3.789)
 Μπορεί κανείς να το αντιγράψει σε ένα τμήμα. Με μια εντολή Σ α ανοίγει ο διορθωτής στο τμήμα α και αντιγράφουμε το παρακάτω (απαιτεί την τελευταία αναθεώρηση 34 της έκδοσης 8, δείτε τον σύνδεσμο δεξιά στη στήλη)

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

Τα αρχεία σώνονται στο κατάλογο του χρήστη (δεν ορίσαμε κάτι άλλο εδώ)

Φόρμα 60,32
οθονη 15 \\ άσπρο
πένα 0 \\ μαύρο
Πίνακας α$(4) : α$(0)="UTF-16LE","UTF-16BE","UTF-8","ANSI"
Τύπωσε πάνω $(6),"Παράδειγμα για αποθήκευση εγγράφου με τέσσερις τρόπους"
Για ι=0 έως 3
       Καθαρό δοκίμασέμε$
      Εγγραφο δοκίμασέμε$ = {1η γραμμή
                              2η γραμμή
                              3η γραμμή
                              }
       δοκίμασέμε$={4η γραμμή  \\ πάτα απλά Esc
                               }
       Τύπωσε υπό  "Σώνω μια φορά και προσθέτω άλλη μια:"  : Τύπωσε
      \\ 10 χαρακτήρες δεξί περιθώριο για την αναφορά
      Τύπωσε @(10), : Αναφορά δοκίμασέμε$ : Τύπωσε @(0),   \\ επιστρέφει ο δρομέας τέρμα αριστερά
      Σώσε.έγγραφο δοκίμασέμε$, "alfa1.txt", ι
       Πρόσθεσε.έγγραφο δοκίμασέμε$, "alfa1.txt", ι
      Τύπωσε μέρος μορφή$({Μήκος αρχείου "{0}" σε bytes {1} τύπος {2}, συνολικοί χαρακτήρες {3}}, "alfa1.txt", αρχείου.μήκος("alfa1.txt"), α$(ι), Εγγράφου.μήκος(δοκίμασέμε$)*2)
       συγγραφή "alfa1.txt"
Επόμενο ι
Τύπωσε υπό


(κάθε φορά που μας ανοίγει το διορθωτή το σύστημα πατάμε Esc για να βγεί)
στην εικόνα εμφανίζονται συνολικοί χαρακτήρες 132, αλλά βγαίνουν 124, και σε Linux/Wine και σε Windows (μάλλον είναι παλιά η εικόνα)

Κυριακή, 9 Αυγούστου 2015

Copy In - Copy Out

Διαβάζω για την ΓΛΩΣΣΑ του Λυκείου ότι έχει χρησιμοποιηθεί η τεχνική του Copy in - copy out στις διαδικασίες. Ουσιαστικά αυτή η τεχνική έχει νόημα όταν μιλάμε για πέρασμα τιμής σε καταχωρητή (ίσως και αλλού αλλά εδώ θα το προσπεράσω). Δηλαδή όταν ο μεταφραστής πρέπει να χρησιμοποιήσει μια παράμετρο τύπου μεταβλητής και μπορεί να τον μεταφέρει σε ένα εσωτερικό καταχωρητή που δουλεύει πολύ πιο γρήγορα από την μνήμη τότε κάνει ένα αντίγραφο στο καταχωρητή και όταν τελειώσει την διαδικασία ότι τιμή έχει ο καταχωρητής σώνεται ξανά στη μεταβλητή. Αν κάποιος περάσει με αναφορά την ίδια μεταβλητή δυο φορές και εφόσον ο μεταφραστής βρει δυο καταχωρητές, τότε μπορεί να βάλει την ίδια τιμή και ότι αλλαγές γίνουν η μεταβλητή θα πάρει την τελευταία από το σώσιμο του τελευταίου καταχωρητή! Γιατί να το κάνει κάποιος αυτό; Η ιδέα που διαβάζω (άλλων) είναι ότι στην πολυεπεξεργασία (η ΓΛΩΣΣΑ δεν έχει τέτοιο πράγμα), ενδέχεται να αλλάξει κάποιος τιμή σε μια μεταβλητή ενώ αυτή "δουλεύει" σε μια διαδικασία, περασμένη με αναφορά. Τα συστήματα πολυεπεξεργασίας δεν δουλεύουν έτσι ατάκτως ριγμένα, κοινές αποθήκες (πίνακες ας πούμε) δεν διαβάζονται από όλους αλλά με αιτήματα, κάνεις αίτημα, και περιμένεις τη σειρά σου για να πάρεις τιμές. Η Μ2000 χρησιμοποιεί κάτι ανάλογο με τα semaphores δηλαδή έχει μπλοκ εντολών που μπορούν να τρέξουν όταν μια μεταβλητή λέει "οκ", και την ώρα που τρέχουν αυτή η μεταβλητή λέει "οχι οκ" δηλαδή οποιοδήποτε άλλο μπλοκ εντολών με την ίδια μεταβλητή χειρισμού δεν μπορεί να τρέξει.
To Κ εδώ το φτιάχνει η Μερος {} ως μεταβλητή
\\ semaphore Κ
Μερος {
      τυπωσε Κ
      τυπωσε "εδώ τυπώνει"
      μερος {
            τυπωσε "δεν τυπώνει ποτέ"
      } ως Κ
} ως Κ

Όμως σαν άσκηση ας δούμε πως γίνεται στην Μ2000 η Copy-in Copy-out. Βάζω στα αγγλικά τα ονόματα των τμημάτων για να δείξω το πέρασμα όπως λέγεται (By Value με τιμή, By Reference με αναφορά). χρησιμοποιώ την αύξηση με το ++   (ίδιο με το +=1). Στην πρώτη περίπτωση περνάμε με τιμή άρα η α παραμένει ως έχει με τιμή μηδέν. Στη δεύτερη περίπτωση περνάμε με το τρόπο της ΓΛΩΣΣΑΣ δηλαδή με αντιγραφή στην είσοδο (copy in) και στην έξοδο (copy out). Εδώ βλέπουμε ότι η α πήρε την τελευταία τιμή που αλλάξαμε, το 1. Στην τελευταία περίπτωση, την κανονική για πέρασμα με αναφορά, έχουμε τιμή στο α το 2 γιατί δυο φορές αλλάξαμε την α, επειδή έχουμε δυο μεταβλητές που αναφέρονται στην α, άρα δυο ενέργειες ++ έδωσαν λογικά το 2.

τμημα ByValue {
       διάβασε α, β
      α++
       β++
}
τμημα ByReference {
       διάβασε,
      α++
       β++
}
τμημα CopyInCopyOut {
       Διάβασε,
      Στη α1=α, β1=β \\ copy in
       α1++
       β1++
       Στη α=α1, β=β1 \\ copy out
}
α=0
ByValue α, α
Τύπωσε α \\ 0
α=0
CopyInCopyOut &α,
Τύπωσε α \\ 1
α=0
ByReference &α,
Τύπωσε α \\ 2


Και επειδή είναι ωραίο να βλέπουμε και μια άλλη εικόνα στο πρόγραμμα, να μαθαίνουμε και κάτι, θα μπορούσε κανείς να φτιάξει μια συνάρτηση (φεύγουμε από τις διαδικασίες ή τμήματα στην Μ2000) που να αλλάζει την συμπεριφορά μιας συνάρτησης που την καλούμε ως τμήμα (γίνονται αυτά στην Μ2000).
Εδώ λοιπόν έχουμε δυο συναρτήσεις που παίρνουν τιμές με αναφορά, την Πρόσθεσε1 και την Πρόσθεσε2. Μπορούμε να τις καλέσουμε απευθείας, ώστε να αλλάζουν τιμές "κανονικά" ή να τις καλέσουμε μέσω μιας άλλης συνάρτησης που αλλάζει το πέρασμα με αναφορά σε πέρασμα CopyInCopyOut. Εδώ χρησιμοποιούμε την αναφορά σε συνάρτηση (δεν υπάρχει στη ΓΛΩΣΣΑ).
Η αναφορά σε συνάρτηση είναι μια αντιγραφή συνάρτησης οπότε στην Διάβασε &Συν2() φτιάχνεται μια νέα συνάρτηση με τον ορισμό που βρίσκει στο σωρό! Πραγματικά εδώ είναι μια copy in διαδικασία (χωρίς να έχει έννοια η copy out αφού δεν αλλάζουμε τον ορισμό της συνάρτησης που περνάμε με αναφορά). Στη βιβλιογραφία το πέρασμα με αναφορά πολλές φορές μπορεί να είναι πέρασμα με τιμή...απλά και μόνο επειδή οι έννοιες μπορούν κάλλιστα να επικαλύπτονται, όπως εδώ με την "αναφορά" στην συνάρτηση που είναι αντιγραφή ορισμού (άρα πραγματικά μια αναφορά, αφού ο ορισμός είναι η συνάρτηση).

Συνάρτηση ΣυνΣτηΣυν {
     Διάβασε &Συν2(),,
     στη α1=α, β1=β
     καλεσε Συν2(&α1, &β1)
      στη α=α1, β=β1
}
Συνάρτηση Προσθεσε1 {
       Διάβασε,
      α++
       β++
}
Συνάρτηση Προσθεσε2 {
       Διάβασε,
      α+=2
       β+=2
}
α=0
καλεσε ΣυνΣτηΣυν(&Προσθεσε1(), , &α)
Τυπωσε α \\1
α=0
καλεσε Προσθεσε1( &α, &α)
Τυπωσε α \\2
α=0
καλεσε ΣυνΣτηΣυν(&Προσθεσε2(), , &α)
Τυπωσε α \\ 2
α=0
καλεσε Προσθεσε2( &α, &α)
Τυπωσε α \\ 4




Για να φτιάξουμε μια συνάρτηση χωρίς όνομα:
Βάλε "{Διάβασε Χ : =Χ**2}" : Διάβασε &Κ() : Τυπωσε Κ(2) \\ 4
Βάλε "{Διάβασε Χ : =Χ**2+10}" : Διάβασε &Κ() : Τυπωσε Κ(2) \\14

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

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

Πινακας Κ(20)=2, Ν(30)=3
Βαλε &Κ() : Διάβασε &Λ()
Βαλε &Κ() : Διάβασε &Μ() \\ αυτό γίνεται, να έχουμε διπλή αναφορά
Λ(10)+=10 \\ και το Μ(10) θα γίνει 12
για αυτό { \\ το μπλοκ για αυτο {} σβήνει κάθε νέο στο πέρας του
Δες ενταξει {
       Βαλε &Κ() : Διάβασε &Μ() \\ αυτό δεν γίνεται διότι ήδη υπάρχει...και βγάζει λάθος.
}
αν οχι εντάξει τότε Τύπωσε "Αυτό δεν γίνεται"
Βαλε &Ν() : Διάβασε &Μ() \\ αυτό θα φτιάξει μια νέα Μ() ενώ θα υπάρχει ήδη μια.
Τυπωσε Μ(10), Διάσταση(Μ(),1) \\ η νέα Μ() επισκιάζει την προηγούμενη
Βαλε &Μ() : Διάβασε &Κ() \\ εδώ φτιάχνουμε μια νέα Κ() που επισκιάζει την προηγούμενη Κ()
}
\\ τώρα τα νέα Μ() και Κ() δεν υπάρχουν και έχουν δώσει τη θέση τους στα παλιά
\\ λιστα   \\ με την εντολή λίστα βλέπουμε τι έχουμε σε μεταβλητές και πίνακες.
Τυπωσε Μ(10), Διάσταση(Μ(),1)

Παρασκευή, 7 Αυγούστου 2015

Μ2000 και εκπαιδευτική κοινότητα

Εδώ και δεκαπέντε χρόνια προσπαθώ να περάσω την "αναγκαιότητα" για μια εφαρμογή γλώσσας προγραμματισμού που να περιλαμβάνει διάφορες δραστηριότητες όπως χρήση γραφικών, βάσεων δεδομένων και πολυμέσων (βίντεο, ήχων και εικόνας).
Φυσικά αυτό μετά από δεκαπέντε χρόνια φαντάζει ακατόρθωτο. Και εδώ λοιπόν θα γράψω τις σκέψεις μου για το τι μπορεί να συμβαίνει!
Να ξεκαθαρίσω ότι δεν έχει σημασία η εργασία μου πάνω στην ιδέα μιας Ελληνικής γλώσσας προγραμματισμού, αλλά γενικά αν θα έπρεπε να φτιαχτεί κάτι τέτοιο.
Υπάρχει μάθημα στο λύκειο η ΑΕΠΠ που είναι μάλιστα και εξεταζόμενο πανελλαδικά, στις εξετάσεις για την εισαγωγή στη τριτοβάθμια εκπαίδευση. Για αυτό το μάθημα έχει γίνει πολύ καλή εργασία ετοιμασίας μιας γλώσσας προγραμματισμού απλής με σκοπό να μάθει ο μαθητής την αλγοριθμική, τον τρόπο να αναλύει ένα πρόβλημα με διακριτά απλά βήματα. Βεβαίως έχω ορισμένες ενστάσεις ως προς το πόσα θέματα αλγορίθμων πάνω σε ιδιαίτερες δομές δεδομένων είναι απαραίτητες να συμπεριληφθούν στην ύλη. Είναι ύλη που θα έπρεπε να ήταν στο πανεπιστήμιο! Αλλά δεν είναι πρώτη φορά που αναβαθμίζεται το λύκειο με την εισαγωγή εννοιών που διδάσκονται στην τριτοβάθμια εκπαίδευση. Ενώ δηλαδή φαντάζει καλή η αναβάθμιση εντούτοις αυτό που κάνει είναι να απαιτεί επιπρόσθετο κόπο και ίσως και χρήμα για ιδιαίτερα μαθήματα ώστε να ανταπεξέλθει ο μαθητής στις απαιτήσεις των εξετάσεων.
Μια γλώσσα προγραμματισμού σήμερα μπορεί να δίνεται δωρεάν από μεγάλες εταιρείες ή και ιδρύματα ή και από την κοινότητα των προγραμματιστών ελεύθερου λογισμικού. Υπάρχει μια διαφορά στο τι είναι αυτό που δίνουν ελεύθερα και το τι ακόμα χρειάζεται κανείς για να ολοκληρώσει μια εφαρμογή. Αυτό που δίνουν δεν είναι ένα μαγικό κουτί να πατήσεις δυο τρια κουμπιά και να πάρεις μια εφαρμογή. Απαιτεί πρώτα απ΄όλα ένα περιβάλλον ανάπτυξης, όπου θα γραφτεί ο πηγαίος κώδικας, θα δοκιμαστεί και θα διορθωθεί. Όμως ακόμα και αυτό το περιβάλλον απαιτεί εμπειρία για να το χρησιμοποίησει κανείς και σίγουρα κάποια μαθήματα ή και διάβασμα εγχειριδίου. Επιπλέον οι γλώσσες δίνονται με ένα μικρό αριθμό εντολών και για εξειδικευμένα θέματα ή θα πρέπει να ανακαλύψεις τον τροχό  (πράγμα αδύνατον) ή να συνδέσεις τη γλώσσα με έτοιμα εργαλεία, με κώδικα δηλαδή που κάνει αυτό που θέλεις.
Με απλά λόγια σε όλες αυτές τις δωρεάν γλώσσες το να φτιάξεις μια εφαρμογή που θα ανοίγει σε όλη την οθόνη μια φωτογραφία από ένα αρχείο στο δίσκο...για τον μην έμπειρο, για τον νέο δηλαδή αποτελεί μια προσπάθεια "βουνό", Η διαδικασία δηλαδή απαιτεί αρκετά βήματα, και η κατανόηση αυτών είναι δύσκολη, ίσως μηχανικά να είναι εύκολο αλλά θα πρέπει να ξέρει κανείς τι κάνει! Με καμία γλώσσα δεν μπορούμε να κάνουμε τα πάντα εύκολα. Η έννοια "εύκολο" δεν υπάρχει στο προγραμματισμό. Αυτό που υπάρχει είναι η έννοια "παραγωγικό". Δηλαδή αν κάτι θέλει πέντε βήματα σε σχέση με το άλλο που θέλει τρία είναι λιγότερο παραγωγικό. Φυσικά και ο χρόνος εκτέλεσης μετράει αλλά συνήθως περισσότερα βήματα σημαίνει περισσότερη καθυστέρηση με δεδομένο ότι οι εσωτερικές διαδικασίες στον υπολογιστή γίνονται γρήγορα. Στον αντίποδα όταν μειώνει κανείς τα βήματα μειώνει τις επιλογές, άρα χάνει σε ευελιξία, σε προσαρμογή. Το βέλτιστο είναι να πετύχει κανείς σε βάθος χρόνου να είναι και παραγωγικός και να προσαρμόζεται σε νέες απαιτήσεις στην εργασία του, και ο προγραμματισμός είναι μια εργασία. Έτσι ο γνώστης μπορεί να σχεδιάζει με περισσότερα βήματα (ευέλικτος) χωρίς καθυστερήσεις (παραγωγικός).
Ένα ερώτημα που μπαίνει εδώ είναι: "Τι εργασία είναι ο προγραμματισμός". Η απάντηση δεν είναι "η παραγωγή αλγορίθμων" και αυτό το αναφέρω γιατί σε επίπεδο γνώσεων λυκείου έχει περάσει η αντίληψη ότι πρόγραμμα είναι ο αλγόριθμος.  Ουσιαστικά το αντίθετο συμβαίνει, ένας αλγόριθμος μπορεί να προγραμματιστεί σε μια γλώσσα προγραμματισμού, αλλά δεν αποτελεί αυτός το πρόγραμμα. Το πρόγραμμα είναι το εργαλείο που το βάζουμε να μας κάνει μια δουλειά. Αν περιέχει ένα αλγόριθμο για να βάζει σε μια τάξη μερικά πράγματα τότε μπορούμε να λέμε ότι στο πρόγραμμά μας χρησιμοποιούμε τον τάδε αλγόριθμο. Υπήρχε μια εποχή που ο αλγόριθμος ήταν σαν μια εφαρμογή. Για παράδειγμα μέσα από το DOS μπορούσε κανείς να καλέσει ένα πρόγραμμα ταξινόμησης δίνοντας για παράμετρο ένα αρχείο ονομάτων και να πάρει γισ έξοδο (αποτέλεσμα), ένα αρχείο με ταξινομημένα τα ονόματα αλφαβητικά, και φυσικά το πρόγραμμα χρησιμοποιούσε έναν αλγόριθμο ταξινόμησης. Όμως ως πρόγραμμα είχε κάτι σημαντικά πραγματάκια που το έκαναν κάτι παραπάνω από έναν αλγόριθμο: Είχε ένα τρόπο να αναλύει την είσοδο και ανάλογα να ενεργήσει, και επιπλέον περιλάμβανε και μια λογική του τι θα γίνει αν δεν μπορεί να γράψει στο δίσκο, αν κάτι δηλαδή πάει στραβά. Ο αλγόριθμος ταξινόμησης δεν περιλαμβάνει το τμήμα αποκωδικοποίησης της εισόδου και το τμήμα λαθών κατά την εκτέλεση. Θα μπορούσε να πει κανείς ότι και αυτά αποτελούν αλγόριθμους, αλλά στην ουσία ένας αλγόριθμος οφείλει να είναι κάτι το γενικό, και για το λόγο αυτό του δίνουμε και ένα όνομα που αντιπροσωπεύει αυτό τον αλγόριθμο...οπουδήποτε. Έτσι ουσιαστικά η εργασία του προγραμματισμού είναι να φτιάχνει κανείς μια αυτοματοποιημένη διαδικασία, με χρήση γνωστών αλγορίθμων ή όχι, υπολογίζοντας όλες τις πιθανές καταστάσεις και τα προβλήματα που τυχόν θα προκύψουν. Αυτή η αυτοματοποιημένη διαδικασία λέγεται εφαρμογή και έχει όνομα που δηλώνει το αντικείμενό της. Έτσι ένας επεξεργαστής κειμένου είναι μια αυτοματοποιημένη διαδικασία με αντικείμενο το κείμενο. Κάθε εφαρμογή έχει όρια και αυτά πολλές φορές δεν είναι γνωστά στον χρήστη της εφαρμογής. Για το λόγο αυτό οι εφαρμογές "δίνονται ως έχουν" ή αγγλικά "AS-IS". Σημασία δηλαδή είναι για τις τρέχουσες  απαιτήσεις να ανταποκρίνονται. Εκείνος λοιπόν που φτιάχνει μια εφαρμογή, με μια γλώσσα προγραμματισμού, δουλεύει πάνω σε μια ιδέα του τι μπορεί να φορτώσει την εφαρμογή, τι μπορεί να προκύψει, τι λάθη πιθανόν θα κάνει ο χρήστης. Δεν μιλάμε δηλαδή για αλγόριθμους αλλά για πρόβλεψη καταστάσεων και προσδιορισμό απαιτήσεων. Ο προγραμματισμός λοιπόν είναι ουσιαστικά η "κατασκευή" μιας ιδέας.
Για να μπορείς να υλοποιείς όμως ιδέες πρέπει η γλώσσα που θα χρησιμοποιήσεις να σου παρέχει τα μέσα, και αυτά είναι κύρια οι έτοιμες βιβλιοθήκες ρουτινών. Οι ρουτίνες είναι μικρά προγράμματα εφαρμογές που μπορούμε να συνδέσουμε με το πρόγραμμά μας. Η κορυφαία γλώσσα C++ έχει μια μεγάλη συλλογή ρουτινών
Μέχρι εδώ ανέπτυξα το τι είναι εργασία προγραμματισμού και έδειξα την αναγκαιότητα για έτοιμα βοηθητικά προγράμματα. Οι μεγάλες γλώσσες (με μεγάλες βιβλιοθήκες ρουτινών) είναι μέρος της τριτοβάθμιας εκπαίδευσης. Στην πρωτοβάθμια και δευτεροβάθμια εκπαίδευση η δική μου πρόταση είναι μια γλώσσα προγραμματισμού με ενσωματωμένες εντολές γραφικών, βάσεων δεδομένων και πολυμέσων αντί για χρήση εξωτερικών βιβλιοθηκών, και ανάπτυξη εφαρμογών ώστε να μπορεί ο μαθητής να αντιληφθεί τι σημαίνει "προγραμματίζω", πώς σκέφτομαι να φτιάξω όχι απλά ένα τρόπο επίλυσης ενός προβλήματος αλλά μια αυτοματοποιημένη διαδικασία που θα συνδέεται με τις ενέργειες τους χρήστη.
Για την παραγωγικότητα λοιπόν του μαθητή μια γλώσσα πρέπει να έχει τα λιγότερα βήματα για τη δημιουργία μιας εφαρμογής. Επίσης πρέπει να δίνονται επιλογές στο μαθητή να ασχοληθεί με έναν τομέα όπως γραφικά, βάσεις δεδομένων και πολυμέσα. Για την επιτυχία της εργασίας του θα χρειαστεί να πειραματιστεί, να σχεδιάσει, να δοκιμάσει, πότε να εγκρίνει και πότε να απορρίψει μεθόδους προγραμματισμού. Μια γλώσσα προγραμματισμού με πολλά πεδία αλλά προσβάσιμα από τον μαθητή μαζί με προγράμματα εκπαίδευσης που θα ζητούν να εργαστεί ο μαθητής πάνω στην συγγραφή προγραμμάτων για την υλοποίηση μιας εφαρμογής, μόνος του ή με τη συμμετοχή άλλων (διαμοιρασμός εργασίας), μαθαίνει τον μαθητή όχι την χρήση της αλλά την συνεργασία, την αντίληψη του τι μπορεί να ζητάει κανείς από τον χρήστη, το πώς κάτι είναι εφικτό και πότε όχι, δηλαδή πολλά πράγματα που δεν έχουν να κάνουν με την γλώσσα την ίδια, τις ιδιοτροπίες της, αλλά με την χρήση της, με το αποτέλεσμά της, την εφαρμογή. Βάζουμε το μαθητή να υλοποιεί ιδέες και αντιμετωπίζει όλα τα προβλήματα που συμβαίνουν στη φάση της υλοποίησης. Δεν χρειάζεται να μάθει "απ' έξω" να εργάζεται. Αυτό θα το καταφέρει αν του γίνει συνήθεια. Ο μαθητής πρέπει να σκέφτεται πως μια ιδέα μπορεί να υλοποιηθεί και να ξεκινάει κάνοντας τα αρχικά βήματα, σχεδιάζοντας μια μικρή λύση, ελαττώνοντας τις απαιτήσεις. Κατόπιν αφού φτιάξει έναν σκελετό της κατασκευής, αρχίζει να την εμπλουτίζει μέχρι να πληροί τις απαιτήσεις. Αυτή η μετάβαση από την μη ικανοποιητική στην ικανοποιητική εφαρμογή είναι και η ουσία της εργασίας. Ο δάσκαλος πρέπει να κατευθύνει το μαθητή όχι στο πώς θα βρει τη λύση αλλά στο να του δείξει πόσο έξω είναι από τη λύση, να τον αναγκάσει δηλαδή να σκεφτεί πιο σωστά, να σκεφτεί το πώς και να πειραματιστεί.
Για να έχουμε όμως μια τέτοια διαδικασία εκπαίδευσης, πρέπει να υπάρχει το κατάλληλο εργαλείο, η κατάλληλη γλώσσα προγραμματισμού, ένα περιβάλλον στο οποίο θα τρέχει, εργαλεία ελέγχου που θα περιλαμβάνονται σε αυτό καθώς και τομείς πάνω στους οποίους η γλώσσα θα μπορεί να χρησιμοποιηθεί.
Η γλώσσα Μ2000 από το 2003 είχε ολοκληρώσει την αρχική ιδέα για την χρήση γραφικών, βάσεων δεδομένων και πολυμέσων (έκδοση 5), είχε πίνακες δέκα διαστάσεων, αναδρομή στις συναρτήσεις, χρήση αρχείων και βάσεων δεδομένων τύπου Access, και μπορούσε κανείς ότι παρήγαγε στην οθόνη (γραφικά και κείμενο) να τα παράγει και στον εκτυπωτή.
Η τωρινή έκδοση 8 έχει επιπλέον τύπο μεταβλητής το έγγραφο (όχι απλά ένα αλφαριθμητικό αλλά το κείμενο με τις παραγράφους του) και την ομάδα (μπορεί κανείς να βάλει μεταβλητές, πίνακες, τμήματα και συναρτήσεις και ομάδες σε μια ομάδα). Το έργο τελειώνει με το εγχειρίδιο χρήσης. Προς το παρόν τελειώνει το αγγλικό και ετοιμάζεται και το ελληνικό. Υπάρχει όμως ήδη ενσωματωμένη βοήθεια στα Ελληνικά και τα Αγγλικά (π.χ. γράφουμε Βοήθεια ΟΛΑ και παίρνουμε όλες τις εντολές σε μια φόρμα όπου με απλό κλικ με το ποντίκι βλέπουμε άμεσα κάθε εντολή με παραδείγματα).
Βεβαίως στο εκπαιδευτικό κομμάτι, πρέπει να γραφτούν "ιδέες" για εκπόνηση εφαρμογών. Προς το παρόν σε φροντιστήριο έχει χρησιμοποιηθεί η γλώσσα για εκμάθηση απλών εντολών σε παιδιά Τετάρτης δημοτικού και πολύ μικρών προγραμμάτων π.χ. βρες έναν αριθμό..όπου ο υπολογιστής θέτει έναν τυχαίο και ρωτάει τον χρήστη ποιος είναι και απαντάει αν είναι μεγαλύτερος ή μικρότερος ή αν τον βρήκε ο χρήστης. Οι εντολές γράφτηκαν με ελληνικά (η Μ2000 έχει όλες τις εντολές σε δυο γλώσσες, ελληνικά και αγγλικά). Επιπλέον οι μαθητές είδαν πως φτιάχνουμε διάφορα γραφικά, γραμμές και κύκλους και είδαν πως φτιάχτηκε μια σκακιέρα με πιόνια. Επιπλέον είδαν πώς γίνεται να έχουμε με μια μεταβλητή την σκακιέρα σε διάφορα μεγέθη! Ασφαλώς δεν βρήκαν οι μικροί μαθητές τη λύση, αλλά έδειξαν ενδιαφέρον και έγραψαν τις εντολές στον ενσωματωμένο διορθωτή και τις έτρεξαν. Ένα παιδί με μεγάλο πρόβλημα όρασης χρησιμοποίησε άνετα την Μ2000 αφού στις ρυθμίσεις βάλαμε μεγάλο μέγεθος γραμμάτων! Το κάθε παιδί διαμόρφωσε το δικό του περιβάλλον με τις επιλογές χρωμάτων. Είναι βασικό για τα παιδιά να μην περιορίζονται στα ίδια αλλά να έχουν αυτά που φτιάχνουν την προσωπική τους σφραγίδα, όπως είναι η ζωγραφιά τους!
Συνοψίζοντας: Το εργαλείο που έχω φτιάξει από μόνο του δεν μπορεί να ενταχθεί σε μια εκπαιδευτική διαδικασία. Πρέπει να φτιαχτούν ασκήσεις, και να το δει κανείς στην πράξη. Δεν είναι παράξενο πως δεν υπάρχει άλλη ελληνική γλώσσα προγραμματισμού με αυτήν την ολοκλήρωση της Μ2000 γιατί απαιτεί πολλά χρόνια ανάπτυξης. Έτσι η ουσιαστική ανυπαρξία ενδιαφέροντος εστιάζεται στο γεγονός ότι δεν "παραγγέλθηκε" μια γενικού σκοπού γλώσσα για την πρωτοβάθμια και την δευτεροβάθμια εκπαίδευση. Ακόμα και η ΓΛΩΣΣΑ στο λύκειο δεν παραγγέλθηκε ως μια υπαρκτή γλώσσα, αλλά απλά περιγράφονταν σε ένα βιβλίο, και ανεξάρτητα δυο Έλληνες έφτιαξαν ο καθένας την δική του εκδοχή της ΓΛΩΣΣΑΣ, η μια τελικά έγινε και επίσημα αποδεχτή από το σχολείο (την μια την έφτιαξε εκπαιδευτικός σε δημόσιο σχολείο και την άλλη εκπαιδευτικός στον ιδιωτικό τομέα, και τελικώς προτιμήθηκε η γλώσσα του πρώτου). Όμως όπως αναφέρθηκε και παραπάνω η ΓΛΩΣΣΑ εστιάζει στον αλγόριθμο, και όχι στο πρόγραμμα, δεν έχει βιβλιοθήκες ρουτινών ούτε εντολές για αρχεία, γραφικά, βάσεις δεδομένων και πολυμέσα. Μόνο πίνακες φτιάχνει και εκτελεί  συγκρίσεις και επαναλήψεις (όπως όλες οι γλώσσες). Οι δε έτοιμες συναρτήσεις είναι ελάχιστες.
Ουσιαστικά αν δεν υπήρχε ο Διερμηνευτής της Γλώσσας και η Γλωσσομάθεια το μάθημα θα γίνονταν στα χαρτιά. Εδώ δηλαδή έχουμε ασκήσεις μεν αλλά χωρίς το εργαλείο! Ασφαλώς σήμερα υπάρχει το εργαλείο (ο Διερμηνευτής της ΓΛΩΣΣΑΣ) αλλά δεν έχει τομείς δραστηριοτήτων εκτός από τους πίνακες!

Η ιδέα μου βασίζεται σε ένα υπολογιστή της δεκαετίας του 80 όπου στην Αγγλία φτιάχτηκε μετά από προκήρυξη ενδιαφέροντος για την παραγωγή εκπομπών τηλεόρασης. Το μοντέλο λέγονταν BBC Model B και καθιερώθηκε όχι μόνο στο κανάλι BBC αλλά και σε όλα τα σχολεία. Βρήκα τέτοια μοντέλα στο ΤΕΙ σε εργαστήριο χειρισμού εργαλειομηχανών CNC (computer numerical control). Τα πολύ καλά χαρακτηριστικά του μοντέλου το έκαναν χρήσιμο σε πολλές εργασίες. Εκτός από το Hardware εκείνο που είχε επίσης τη σημασία του ήταν το Software. Περιλάμβανε μια εκπληκτική Basic με δυνατότητες γραφικών και ήχου (δεν είχαμε πολυμέσα τότε). Έμαθα την χρήση του από το εγχειρίδιο και από το μηνιαίο Acorn User. Αγόρασα ξεχωριστό βιβλίο για γραφικά και το προχωρημένο εγχειρίδιο. Δεν είχα δάσκαλο και δεν υπήρχε διαδίκτυο για πληροφόρηση, μόνο περιοδικά. Σε αντίθεση στην Αγγλία είχαν τα πάντα! Σήμερα σκεφτόμαστε γιατί εμείς δεν είμαστε τόσο ανταγωνιστικοί όσο οι άλλοι. Και πώς να είμαστε όταν μας χωρίζουν χρόνια διαφοράς στην εκπαίδευση; Θυμάμαι ακόμα τον υπολογιστη ΚΑΤ της Gigatronics, το 1987, μιας ελληνικής εταιρείας που εκθείαζε ο Ανδρέας Παπανδρέου. Δεν περπάτησε. Δεν περπατάνε ιδέες στην Ελλάδα! Χωρίς ιδέες δεν πάμε μπροστά! Τα σημερινά αποτελέσματα δεν είναι τυχαία...έχουν αίτια στην κακή εκπαίδευση και την αντιμετώπιση του Έλληνα για κάθε νέα ιδέα.
Θέλω να είμαι αισιόδοξος ότι η δουλειά μου δεν θα πάει χαμένη (δεν συζητώ για υλική ανταμοιβή), και ότι κάποια στιγμή κάποια άτομα από την εκπαιδευτική κοινότητα δεν θα θελήσουν να ανακαλύψουν τον τροχό αλλά θα πάρουν κάτι έτοιμο και θα το αξιοποιήσουν!