Γλώσσα Προγραμματισμού Μ2000 έκδοση 8

Ξεκίνησε από bugman, 24 Ιουλ 2015, 11:59:33 ΜΜ

« προηγούμενο - επόμενο »

bugman

#90
Ανέβηκε η Αναθεώρηση 31, η οποία πάει το θέμα αντικειμένων ένα στάδιο πιο πάνω.
1. Αρχικά υπήρχε η σύνθεση αντικειμένων από άλλα αντικείμενα. Αυτό που μπήκε τώρα είναι η σύνθεση κλάσεων. Δηλαδή φτιάχνουμε κλάσεις από κλάσεις χωρίς να εκκινήσουμε κάποιον κατασκευαστή.
Ο διερμηνευτής "ενώνει" τους ορισμούς. Μπορούμε να φτιάξουμε μια κλάση (τον ορισμό αντικειμένου, πριν φτιάξουμε κάποιο αντικείμενο), να κληρονομεί από άλλες κλάσεις με διαδοχική σειρά. Ακόμα και αν μια από αυτές τις κλάσεις ήδη κληρονομεί από μια άλλη που επίσης έχουμε στη σειρά. δεν μας ενοχλεί. Απαραίτητα τα ονόματα που δίνουμε μετά το ΩΣ πρέπει να είναι κλάσεις (το ελέγχει ο διερμηνευτής).
Πχ το
Κλάση Α ως Β ως Γ ως Δ {
}

Θα βάλει τον ορισμό του Δ πριν του Γ, του Γ πριν του Β, του Β πριν του Α και τέλος θα βάλει το Α. Αν τα Δ, Β, Γ έχουν κατασκευαστές (μεθόδους) τότε δεν θα χρησιμοποιηθούν. Ισχύει δηλαδή μόνο ο κατασκευαστής της Α (αν έχουμε βάλει).

2. Σε σχέση με το συνδυασμό αντικειμένων μπήκε ένας τελεστής Με
Στο παράδειγμα το Α είναι ο συνδυασμός του Β(10) όπου το 10 πάει στον κατασκευαστή της κλάσης Β και του Γ(30) όπου ομοίως το 30 πάει στο κατασκευαστή της κλάσης Γ. Εδώ έχουμε κάτι σαν Mixins. Επίσης όπου κλάσεις μπορούμε να έχουμε άλλα αντικείμενα ή οποιαδήποτε έκφραση επιστρέφει ομάδα (αντικείμενο)
Α= Β(10) Με Γ(30)

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


Στο blog υπάρχει παράδειγμα με ιεραρχία Ζώο, Κατοικίδιο, Σκύλος, Γάτα, Πουλί

Παράθεση
Κλάση Ζώο {

}
Κλάση Κατοικίδιο ως Ζώο {

}
Κλάση Σκύλος ως Κατοικίδιο {

}
Κλάση Γάτα ως Κατοικίδιο {

}
Κλάση Πουλί ως Κατοικίδιο {

}

bugman

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

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

Οπότε στπ παράδειγμα τα αντικείμενα μας ανακοινώνουν πότε διαγράφονται.

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

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


Τμήμα ΧρήσηΕπώνυμωνΟμάδων {
   Κλάση Άλφα {
   ιδιωτικό:
      Πίνακας α()
   δημόσιο:
      Τμήμα άλλαξεΑυτό (&Λ ως Άλφα) {
         Κ=Λ.α()
         Κ+=10
         Τύπωσε Τύπος$(Κ)
      }
      Τμήμα Δείξε {
         Τύπωσε Αυτό.α()
      }
      Διαγραφή {
         Τύπωσε "Άλφα τύπος αντικειμένου διαγράφτηκε"
      }
   Κλάση:
      Τμήμα Άλφα (ν) {
         Πίνακας .α(10)=ν
      }
   }
   Β=Άλφα(3)
   Δ=Άλφα(6)
   Β.Δείξε
   Δ.Δείξε

   Β.άλλαξεΑυτό &Β
   Β.άλλαξεΑυτό &Δ
   Β.Δείξε
   Δ.Δείξε

   Καθαρό Β, Δ
}
ΧρήσηΕπώνυμωνΟμάδων

Τμήμα ΧρήσηΔεικτώνΣεΟμάδες {
   Κλάση Άλφα {
   ιδιωτικό:
      Πίνακας α()
   δημόσιο:
      Τμήμα άλλαξεΑυτό (Λ ως *Άλφα) {
         Κ=Λ=>α()
         Κ+=10
         Τύπωσε Τύπος$(Κ)
      }
      Τμήμα Δείξε {
         Τύπωσε Αυτό.α()
      }
      Διαγραφή {
         Τύπωσε "Άλφα τύπος αντικειμένου διαγράφτηκε"
      }
   Κλάση:
      Τμήμα Άλφα (ν) {
         Πίνακας .α(10)=ν
      }
   }
   
   Β->Άλφα(3)
   Δ->Άλφα(6)
   Β=>Δείξε
   Δ=>Δείξε
   Β=>άλλαξεΑυτό Β
   Β=>άλλαξεΑυτό Δ
   Β=>Δείξε
   Δ=>Δείξε
}
ΧρήσηΔεικτώνΣεΟμάδες






bugman

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

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

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

Στο πρόγραμμα το μ είναι Επαναλήπτης, και παράγεται από την Κάθε() (παίρνει παραμέτρους αλλά εδώ δεν έδωσα, θέλω όλα τα στοιχεία). Τα α και β είναι δείκτες στα αντικείμενα αυτά. Το OXI ή NOT γράφεται και σαν ΔΕΝ. Η γλώσσα έχει εντολές και στα αγγλικά. Δείτε ότι στην Ενώ και στην Αν έχω χρησιμοποιήσει τις μορφές χωρίς αγκύλες. Υπάρχουν και τα ισοδύναμα με αγκύλες. Η τελευταία γραμμή του κώδικα χρησιμοποιεί ανώνυμες ουρές. Υπάρχουν ακόμα ανώνυμες λίστες, πίνακες, σωροί τιμών και συναρτήσεις λάμδα. Πχ το Τύπωσε λάμδα (χ)->{=χ*χ}(3)=9 δίνει αληθές. Στη Μ2000 οι λάμδα συναρτήσεις μπορούν να έχουν πολλές γραμμές. Στην python δεν μπορούν να γραφτούν τέτοιες δομές γιατί υπάρχει θέμα σύνταξης!


Παράθεσηα=Ουρά:= 20, -45, -3, 100, 4, 2, 5
β=Ουρά:= 4, 100, 3, -20, 4, -3, 100
Συνάρτηση Θετική_Ένωση(α ως ουρά, β ως ουρά) {
   Αποτέλεσμα=Ουρά
   μ=Κάθε(α)
   Ενώ μ
      στοιχείο=εκφρ(μ)
      Αν στοιχείο>0 και υπάρχει(β,στοιχείο) και δεν υπάρχει(Αποτέλεσμα, στοιχείο) Τότε
         Προσθήκη Αποτέλεσμα, στοιχείο
      Τέλος Αν
   Τέλος Ενώ
   =Αποτέλεσμα
}
Τύπωσε Θετική_Ένωση(α, β)  ' δίνει 100 4
Τύπωσε Θετική_Ένωση((Ουρά:=1,2,3,11,2,4),(Ουρά:=3,4,5))    ' δίνει 3 4

bugman

#93
Όλοι γνωρίζουν ότι η αλλαγή τιμής δυο μεταβλητών γίνεται με χρήση μιας τρίτης μεταβλητής ή με πρόσθεση/αφαίρεση. Η δεύτερη περίπτωση έχει το πρόβλημα να βγει ο αριθμός εκτός ορίων, βάσει τύπου.
Υπάρχει ένας ακόμα τρόπος, αν οι αριθμοί είναι 32bit χωρίς πρόσημο με τρεις Xor. Η
Xor στην Μ2000 λέγεται στα ελληνικά ΑΠΟ, όπου  Αληθής Από Ψευδής δίνει Αληθής, και το  Ψευδής από Αληθής δίνει Αληθής ενώ αν έχουμε όμοιες συνθήκες δίνει Ψευδής, δηλαδή Αληθής Από Αληθής δίνει Ψευδής και Ψευδής Από Ψευδής δίνει Ψευδής .
Εκτός από τα ΌΧΙ (ΔΕΝ), ΚΑΙ, Η και ΑΠΟ, για χρήση με λογικές μεταβλητές, υπάρχουν οι αντίστοιχες δυαδικές συναρτήσεις όπου εφαρμόζονται οι "πύλες" σε bit (δυαδικά ψηφία). Εδώ θα χρησιμοποιήσουμε την Δυαδικό.Από(α, β) όπου τα α και β είναι αριθμητικές τιμές. Για την Μ2000 η επιστροφή της συνάρτησης είναι τύπου Λογιστικό αλλά μόνο οι τιμές από 0x0 έως 0xFFFFFFFF ή σε δεκαδικό σύστημα από 0 έως 4294967295. Μπορούμε να δώσουμε ότι τύπο θέλουμε και θα γίνει αυτόματα προσαρμογή στο τύπο που δουλεύει (Λογιστικό ή Currency).

Εδώ δεν έχουμε πρόβλημα υπερχείλισης. Όλα τα bit χρησιμοποιούνται από την πύλη Xor, το καθένα από τον πρώτο αριθμό με το αντίστοιχο από το δεύτερο, χωρίς να μας ενδιαφέρει τι έχει το διπλανό του.

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

Α=10
Β=31
Τύπωσε Α=10, Β=31
Α=Δυαδικό.Από(Α, Β)
Β=Δυαδικό.Από(Α, Β)
Α=Δυαδικό.Από(Α, Β)
Τύπωσε Α=31, Β=10

Αν θέλουμε να δουλέψουμε με αριθμούς με πρόσημο (32bit), τότε πρέπει να τους κάνουμε αναγωγή σε ακέραιους χωρίς πρόσημο. Και οι δυο αριθμοί πρέπει να δίνουν τα ίδια bit. Η συνάρτηση Δυαδικό.Ακέραιο() παίρνει έναν αριθμό με πρόσημο και δίνει τον ανάλογο χωρίς πρόσημο όπου αποθηκεύεται με ίδια bits. Η ανάποδη συνάρτηση είναι η Ακέραιο.Δυαδικό() η οποία παίρνει ένα αριθμό χωρίς πρόσημο και τον διαβάζει σαν αριθμό με πρόσημο με τα ίδια bits.

Α=Δυαδικό.Ακέραιο(-10)
Β=Δυαδικό.Ακέραιο(-45)
Α=Δυαδικό.Από(Α, Β)
Β=Δυαδικό.Από(Α, Β)
Α=Δυαδικό.Από(Α, Β)
Τύπωσε Ακέραιο.Δυαδικό(Α)=-45, Ακέραιο.Δυαδικό(Β)=-10

bugman

#94
Εχω ανεβάσει στο blog δυο μοτίβα (patterns) του αντικειμενοστραφή προγραμματισμού. Με αγγλικές εντολές. Θα τα γράψω και με ελληνικές στο άρθρο που γράφω γενικά για τον αντικειμενοστραφή προγραμματισμό στη Μ2000.
Πρώτο Παράδειγμα, Singleton Pattern.
Το πρώτο παράδειγμα δείχνει πώς γίνεται να φτιάχνουμε μια μοναδική παρουσία αντικειμένου (instance). Όποιο αντικείμενο και να δημιουργήσσυμε θα δώσει το ίδιο, ακόμα και αν το αντιγράψουμε!
Singleton Pattern
Δεύτερο Παράδειγμα, Factory Method Pattern.
Εδώ είναι μια πιο προχωρημένη περίπτωση. Ένα αντικείμενο διαχειρίζεται άλλα αντικείμενα, και παράγεται από δυο άλλα, δυο μέρη. Το ένα μέρος έχει τη περισσότερη λογική αλλά δεν γνωρίζει τα αντικείμενα. Η γνώση των αντικειμένων γίνεται από το δεύτερο μέρος. Τα δυο μέρη παράγουν ένα αντικείμενο όπου το δεύτερο μέρος αλλάζει κενές μεθόδους με συγκεκριμένες μεθόδους. Το πρώτο μέρος κρατάει λίστα αντικειμένων, βάσει ενός βασικού αντικειμένου. Το δεύτερο μέρος χρησιμοποιεί αντικείμενα που κληρονομούν από το βασικό αντικείμενο. Για ευκολία στο παράδειγμα έχουμε πολλαπλή κληρονομικότητα, δηλαδή κάθε τελικό αντικείμενο που θα μπει στη λίστα κληρονομεί από δύο άλλα. Το δεύτερο χρειάζεται για να προσθέσουμε λογική για το παράδειγμα.
Factory Method Pattern

Κάποτε θα φτάσει η πληροφική στο σχολείο να ασχολείται και με τα design patterns των αντικειμένων!

bugman

#95
Ανέβασα όλα τα παρακάτω μοτίβα, με αγγλικές εντολές της Μ2000. Θα τα γράψω με ελληνικές, αλλά θέλω ιδέες για την μετάφραση των όρων των μοτίβων.

Creational Patterns
Singleton Pattern
Factory Method Pattern
Factory Pattern
Abstract Factory Pattern
Builder Pattern
Prototype Pattern
Pool Pattern

Behavioral Patterns
Memento Pattern
Mediator Pattern
Observer Pattern
Null Object Pattern
Visitor Pattern
Interpreter Pattern
Iterator Pattern
Strategy Pattern
Command Pattern
State Pattern
Template Method Pattern
Chain of Responsibility Pattern

Structural Patterns
Adapter Pattern
Bridge Pattern
Composite Pattern
Decorator Pattern
Flyweight Pattern
Facade Pattern
Proxy Pattern


George Eco

Γιώργο καλησπέρα, να σε ρωτήσω κάτι; Υπό ποια EULA είναι ανοικτού κώδικα η Μ2000; Εννοώ την έχεις υπό το GNU GPL, LGPL, MIT License, CCBYSA;
Δυσκολεύομαι να το βρω αυτό οπότε είπα, δε ρωτάω κατ' ευθείαν το δημιουργό λέω 'γω;

bugman

#97
https://github.com/M2000Interpreter/Version9/blob/master/LICENSE

GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
Και το dll είναι διαθέσιμο σαν ActiveX αντικείμενο, δηλαδή μπορεί να φορτωθεί από άλλη γλώσσα, ενώ υπάρχουν όλα τα απαραίτητα ώστε να συγχωνευτεί σε άλλο πρόγραμμα (δηλαδή να μπει το αντικείμενο στο κώδικα και όχι σαν εξωτερικό dll).
Ήδη το m2000.exe φορτώνει τη γλώσσα με όμοιο τρόπο.

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

George Eco


bugman

Αρχίζει το ενδιαφέρον των ξένων για την Μ2000 να γίνεται πιο σοβαρό. Ήδη ένας Ολλανδός κατέβασε το κώδικα της γλώσσας και κατάφερε να την βάλει στο IDE της VB6 και να δουλέψει.

https://www.vbforums.com/showthread.php?855011-Github-For-M2000-Interpreter&p=5487401&viewfull=1#post5487401

Τώρα που είναι καλοκαίρι είναι ευκαιρία για τους εκπαιδευτικούς να δουν την Μ2000.
Γιώργος Καρράς

bugman

Ανέβασα το άρθρο (115 σελίδες) Αντικειμενοστραφής Προγραμματισμός με τη Μ2000.

Περιλαμβάνει μια εισαγωγή στη Μ2000 (όση χρειάζεται για να διαβάσει κανείς όλα τα παραδείγματα) και 26 μοτίβα για τη χρήση των αντικειμένων με ελληνικά παραδείγματα και κείμενο που επεξηγεί τα παραδείγματα. Το pdf ανοίγει στο LibreOffice κανονικά, και από εκεί καλύτερα κάποιος να αντιγράψει το κώδικα, για να διατηρούνται οι εσοχές.

Όλα τα παραδείγματα έχουν ελεγχθεί με την έκδοση 9.9 αναθεώρηση 51.


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

Βέβαια θα ήθελα την γνώμη σας για το άρθρο αυτό.
ΓΚ

Υ.Γ. Ο σύνδεσμος υπάρχει στην υπογραφή!

bugman

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

Μπήκε και η GNU FDL v1.3   ως άδεια για το άρθρο. Είναι η ίδια άδεια που λειτουργεί η Βικιπέδια.

bugman

Ανανεώθηκε δεύτερη φορά το άρθρο "Αντικειμενοστραφής Προγραμματισμός στη Μ2000",  μπήκε περισσότερο χρώμα, μπήκε αρίθμηση στα προγράμματα (συνολικά 81 προγράμματα, με το πρώτο πρόγραμμα το Κενό Πρόγραμμα).
Διακοπές Τέλος!
Καλό Χειμώνα!
Γ.Κ.
Σύνδεσμος στο pdf (ανοίγει σαν έγγραφο κειμένου σε libreoffice, για αλλαγές και αντιγραφή προγραμμάτων) υπάρχει στην υπογραφή.



bugman

Βίντεο χωρίς ήχο, περίπου 30 λεπτών, δείχνει το περιβάλλον Μ2000, με εκτέλεση κάποιων προγραμμάτων. Έχει ανάλυση 1280Χ1024.

https://youtu.be/I3BwLnxH9e8


bugman

Ανέβηκε η 10η έκδοση της γλώσσας, με σημαντικές αναβαθμίσεις στα γραφικά.
Επίσης μπήκε και το // ως αρχή σημείωσης (υπάρχουν τα \ και ')

Κυριακή 18 Οκτ 2020, κάνω παρουσίαση της Μ2000 στο CIE2020 (μέσω ZOOM, από το γραφείο μου). http://events.di.ionio.gr/cie/images/documents20/CIE2020_program.pdf
Μπορείτε να βρείτε το σύνδεσμο. Στις 11:30 Αίθουσα Α.
ΓΚ