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

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

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

bugman

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

bugman

Ανέβασα έναν διερμηνευτή mini Lisp γραμμένο σε Μ2000, και μάλιστα σε δυο εκδόσεις, με Τμήματα (Διαδικασίες) και με Ρουτίνες.  Στη Μ2000 ξεχωρίζουν οι Ρουτίνες από τα Τμήματα. Οι ρουτίνες έχουν δικό τους σωρό επιστροφής ενώ τα τμήματα χρησιμοποιούν τον γενικό. Επιπλέον οι ρουτίνες βλέπουν τις μεταβλητές του τμήματος που ανήκουν ενώ τα τμήματα δεν βλέπουν, παρά μόνο ότι ορίζουμε σε αυτά και ότι είναι γενικό! Παρόλα αυτά το πρόγραμμα με τα τμήματα χρησιμοποιεί μια ειδική κλήση που κάνει τα τμήματα να τρέχουν σαν να είναι το τμήμα που τα καλεί. Από την έκδοση 8.4 έχουμε όμως εξίσου γρήγορη εκτέλεση ρουτινών (η αναζήτηση γίνεται μια φορά και καταχωρείται σε λίστα), οπότε το δεύτερο πρόγραμμα εκτελεί το κώδικα της Lisp πιο γρήγορα!


bugman

#32
Ένα ωραίο πρόβλημα για προγραμματισμό είναι το γνωστό πρόβλημα με το βοσκό, το λύκο, το πρόβατο και το χορτάρι, που πρέπει να περάσουν ένα ποτάμι, με μια βάρκα που σε αυτήν μπορεί να μπαίνει μόνο ο βοσκός και το πολύ ένα από τα άλλα τρία. Όσο είναι μαζί ο βοσκός, ο λύκος δεν τρώει το πρόβατο και το πρόβατο δεν τρώει το χορτάρι. Το πρόγραμμα πρέπει να δείχνει τι υπάρχει κάθε φορά σε κάθε όχθη, και στην βάρκα. Τερματίζει όταν όλα είναι στην όχθη προορισμού.
Το πρόγραμμα πρέπει να αποφασίζει ποιοι θα είναι οι επιβάτες στη βάρκα σε κάθε μετακίνηση.
Υπάρχει λύση σε Μ2000 με χρήση αντικειμένων, αλλά είναι δυνατόν να γραφτεί σε ΓΛΩΣΣΑ του σχολείου, ή σε Python, ασφαλώς με χρήση πινάκων. Το ενδιαφέρον του προγράμματος είναι στην αναπαράσταση των μετακινούμενων, γιατί θα πρέπει να γραφτεί και τι τρώει το καθένα ώστε να γίνεται έλεγχος.

bugman

Μια και τελείωσε το σχολείο, θεώρησα καλό να ενημερώσω για την τελευταία έκδοση της Μ2000 και ίσως κάποιοι καθηγητές ρίξουν μια ματιά!

Τελευταία έκδοση η 8.8 στην αναθεώρηση 11, της Μ2000. Έχω ανεβάσει παράδειγμα για την ανάγνωση json αρχείου, σε δομή δεδομένων, και πάλι την εξαγωγή κειμένου από τη δομή. Η γλώσσα Μ2000 έχει εκτός από μεταβλητές και πίνακες, ορισμένες δομές που λειτουργούν με δείκτη, και μια από αυτές είναι και ο πίνακας με δείκτη. Δείκτες δεν μπορούμε να δώσουμε εμείς, γιατί πάντα μας δείχνει η γλώσσα αυτό που δείχνουν οι δείκτες, και σε εκχώρηση η αντιγραφή του δείκτη γίνεται "αθέατα".
Τέσσερα αντικείμενα είναι με δείκτες στη Μ2000:
1. ο πίνακας με δείκτη (δεν έχει παρενθέσεις),
2. η κατάσταση (ζευγάρια ξεχωριστών κλειδιών και τιμών) - υπάρχει παραλλαγή ως "κατάσταση ουρά" όπου δέχεται όμοια κλειδιά.
3. ο σωρός τιμών (συνδεδεμένη λίστα τιμών, χρησιμοποιείται και ως στοίβα)
4. και η διάρθρωση μνήμης (τμήματα μνήμης όπου ορίζουμε μια δομή, ή πίνακα δομών, ενώσεων δομών κ.ο,κ).
Στα τρία πρώτα οι τιμές μπορεί να είναι οτιδήποτε, πχ δείκτης σε άλλη δομή, πίνακας, αντικείμενο. Στο τέταρτο οι τιμές είναι αριθμοί χωρίς πρόσημο του ενός, των δύο και των τεσσάρων bytes, πραγματικοί των οκτώ bytes, και αλφαριθμητικά των  δυο ή του ενός byte ανά χαρακτήρα.

Οι μεταβλητές στη Μ2000 είναι αριθμητικές (με % στο τέλος είναι ακέραιες, ενώ εσωτερικά είναι πραγματικές) ή αλφαριθμητικές (έχουν το $ στο τέλος), και υπάρχουν και δυο ακόμα η τύπου Μακρύς (Long) ακέραιος 32bit και το αντικείμενο Έγγραφο ως αλφαριθμητικό με χωριστές εσωτερικά τις παραγράφους.

Σε μεταβλητές μπαίνουν και δυο ακόμα ειδικά αντικείμενα, η συνάρτηση λάμδα και το αντικείμενο γεγονός, το οποίο δέχεται συναρτήσεις με αναφορά και εκτελεί με μια εντολή παράλληλες κλήσεις σε όλες τις συναρτήσεις (multicast) (κάποιες συναρτήσεις μπορεί να είναι συναρτήσεις αντικειμένων τύπου ομάδας οπότε στέλνουμε μηνύματα μέσω των γεγονότων)

Οι ομάδες είναι αντικείμενα που μπορεί να έχουν όλα τα παραπάνω και επιπλέον τμήματα (διαδικασίες δηλαδή), συναρτήσεις, άλλες ομάδες, να επιστρέφουν τιμή ή να δέχονται τιμή ή και τα δύο, να έχουν ιδιότητες (ομάδες που δέχονται τιμές ή δίνουν ή κάνουν και τα δύο). Δεν υπάρχει χωριστή αναφορά σε διεπαφή στα αντικείμενα αυτά, και δεν έχουμε δείκτες σε αυτά. Μπορούμε έμμεσα να έχουμε δείκτες αν τοποθετήσουμε τις ομάδες σε κάποια από τα 1 έως 3 αντικείμενα με δείκτες.

Στο παράδειγμα που δίνω στο Blog για την ανάγνωση των json αρχείων, όλες οι τιμές τοποθετούνται σε ομάδες μέσα σε Καταστάσεις όταν το jsον έχει αντικείμενα με ζευγάρια τιμών και σε πίνακες με δείκτη όταν έχει πίνακα. Ακόμα όμως και οι καταστάσεις και οι πίνακες είναι πρώτα σε ομάδες καταχωρημένες. Έτσι όλη η δομή ξεκινάει με μια ομάδα που μπορεί να έχει πίνακα ή κατάσταση και μέσα σε αυτά άλλες ομάδες με οτιδήποτε τιμές δέχεται το json αρχείο. Το πρόγραμμα έχει γραφτεί με εντολές της Μ2000 στα αγγλικά. Αν κάποιος το τρέξει με Δοκιμή Α (έστω στο Α έχουμε αντιγράψει το πρόγραμμα) θα μπορέσει να το εκτελέσει βήμα προς βήμα. Μπορεί σε διάφορα σημεία να βάζει την εντολή Δοκιμή "τίτλος" και τότε σταματάει η εκτέλεση και δείχνει το σημείο του κώδικα που εκτελείται, και μπορούμε ε[πιπλέον  να επιλέξουμε αργή εκτέλεση ή να κλείσουμε το παράθυρο του ελέγχου, ή να δώσουμε διακοπή, ή να εμφανίσουμε τιμές που θέλουμε (υπάρχει μια Τύπωσε στη φόρμα αυτή για να εμφανίζει τιμές).
Οποιοσδήποτε το δοκιμάσει ας γράψει εδώ τα συμπεράσματά του!

bugman

Τελική έκδοση 8.9 αναθεώρηση 14. Έχει γραφτεί 100% η βοήθεια, και στο blog εμφανίζονται όλα τα αναγνωριστικά εντολών και συναρτήσεεων, στα ελληνικά και στα αγγλικά (υπάρχουν και προγράμματα για το πως μέσα από τη γλώσσα διαβάζουμε τη βοήθεια σε αρχείο txt και το ανοίγουμε σε WordPad).
Με Βοήθεια Όλα ή Help All έχουμε τις λίστες αυτές ομαδοποιημένες.
Καλό Καλοκαίρι!

bugman

#35
Η έκδοση 9 της γλώσσας υπάρχει διαθέσιμη (αναθεώρηση 33). Γράφω το "Προγραμματίζοντας με τη Μ2000" πάνω σε αυτήν την έκδοση.
Αυτή η έκδοση προχωράει περισσότερο τα αντικείμενα Ομάδα εισάγοντας την Υπερκλάση, ενώ παραμένουν ως τιμές (και όχι αναφορές) όταν τα έχουμε σε μεταβλητές. Η Υπερκλάση μπορεί να έχει μοναδικά στοιχεία και όλα τα αντικείμενα που σχετίζονται με αυτήν μπορούν να έχουν πρόσβαση σε αυτά. Επειδή τα αντικείμενα Ομάδες έχουν δυνατότητα να έχουν άλλες ομάδες εσωτερικά, αυτές οι ομάδες μπορούν να συνδέονται με άλλες Υπερκλάσεις, και έτσι μια ομάδα με έμμεσο τρόπο να συνδέεται με περισσότερες από μια Υπερκλάσεις!

Αυτή είναι η τελική έκδοση!

Στην εικόνα φαίνονται δυο προγράμματα που τρέχει το καθένα το διερμηνευτή, το πρώτο φτιάχνει μια φόρμα χρήστη για ένα Notepad, και το άλλο αλλάζει την κονσόλα της Μ2000 σε ρολόι με διαφάνεια!

bugman

Καλά Χριστούγεννα
Ανέβασα ένα BLACKJACK για τέσσερις παίκτες σε Μ2000 στο blog της M2000, με δυνατότητες SPLIT και DOUBLING DOWN. Ο αριθμός παικτών μπορεί να αλλάξει από ένα σε όσο θέλουμε, στο κώδικα μόνο. Μπορεί κάποιος παίκτης να αποχωρήσει.
Καλή Διασκέδαση!

bugman

#37
Λογικά πρέπει πια το νήμα εδώ να λέει έκδοση 9, αφού αυτή είναι εδώ και 43 αναθεωρήσεις!
Έχω ανεβάσει στο blog ένα πρόγραμμα που χρησιμοποιεί φόρμα και νήματα. Είναι σε δυο εκδόσεις, μια με ελληνικές εντολές και μια με αγγλικές. Δεν υπάρχει ανάλογο στη ΓΛΩΣΣΑ, δεν έχει φόρμες και νήματα επεξεργασίας, δεν είναι καν κάτι τέτοιο στην ύλη. Όμως μόνο πληροφοριακά θα μπορούσε κανείς να διαβάσει το κώδικα, ή ακόμα καλύτερα να κατεβάσει τη γλώσσα και να τον δοκιμάσει.

Ίσως κάποια στιγμή μπουν παραπάνω πράγματα στην ΓΛΩΣΣΑ, όπως:
1. Συναρτήσεις Αλφαριθμητικών
2. Προγραμματισμός με γεγονότα
3. Προγραμματισμός Συναρτησιακός με λάμδα συναρτήσεις.
Ελπίζω να φτάσουν στα αυτιά των υπευθύνων. Βεβαίως υπάρχει και η Python, που είναι και πιο πλούσια με μεγάλο αριθμό βιβλιοθηκών, και έχει απ' όλα τα καλά, αλλά νομίζω ότι για την python μιλάμε για τεχνολογία πληροφορικής σε άλλο επίπεδο, ανωτέρας εκπαίδευσης, όπου απαιτείται μεγάλη εμβάθυνση σε μικρό χρόνο, που αποκλείει την μέση εκπαίδευση.
Η ΓΛΩΣΣΑ με αναβάθμιση θα μπορέσει να καλύψει λίγα παραπάνω, από ότι σήμερα, και θα το κάνει πιο ενδιαφέρον το μάθημα!

Βίντεο με αγγλικές εντολές σε Ubuntu Studio με Wine (όπου έχει γίνει εγκατάσταση η Μ2000)
https://youtu.be/meAK06JrtwU

bugman

Από την αναθεώρηση 48, έκδοση 9.0, μπορεί κανείς να τρέχει γλώσσα μηχανής x86 στη Μ2000, φτιάχνοντας αυτό που λέγεται Διάρθρωση Κώδικα (διάρθρωση μνήμης που παίρνει εκτελέσιμο κώδικα).
Με αυτό συμπληρώθηκαν στη Μ2000 όλα τα προγραμματιστικά παραδείγματα: Προστατικός προγραμματισμός, Συναρτησιακός, Με γεγονότα, Αντικειμενοστραφής Προγραμματισμός και τα "εξωτικά"..με αντικείμενα COM (όπως το Word), με εξωτερικές βιβλιοθήκες (dll της C), με χρήση βιβλιοθηκών του λειτουργικού και τώρα με χρήση γλώσσας μηχανής x86.
Ίσως ένα τελευταίο έμεινε (θα πάρει καιρό όμως): Η ενσωμάτωση Assembler x86 (τώρα πρέπει να δίνουμε αριθμούς).
Η Μ2000 μπορεί να τρέξει σε Wine 1.8 (σε 3.0 δεν βγαίνει η βοήθεια, έχει πρόβλημα με τα αρχεία τύπου Access)

bugman

1. Προσθήκη στη γλώσσα των τύπων Currency (19 ψηφία) και Decimal (29 ψηφία) (πριν υποστήριζε  double 17 ψηφία+εκθέτης 2.5 ψηφίων καθώς και 32Bit Long, και έμμεσα για αποθήκευση/ανάγνωση σε μνήμη, ακέραιους χωρίς πρόσημο των 8bit, 16bit και 32bit).


2. Βίντεο από εκτέλεση σε Linux και σε Windows 7 σε VirtualBox ταυτόχρονα. Δείχνει το παράδειγμα με την χρήση διανυσμάτων για 3D περιστροφή τριών αξόνων σε ένα παράθυρο χρήστη. Οι συναρτήσεις για τα διανύσματα είναι ενσωματωμένες σε ένα αντικείμενο Math. Τα παράθυρα εμφανίζονται ίδια σε κάθε λειτουργικό (είναι ενσωματωμένα στο περιβάλλον της γλώσσας).
http://bit.ly/2IcX2nl

bugman

Ανανέωση του μικρού εγχειριδίου της Μ2000 (299 σελίδες). Έκδοση γλώσσας 9.3 αναθ. 12.
Δείτε αν υπάρχει χρόνος το εγχειρίδιο και δώστε προτάσεις, ιδέες για συμπλήρωση ή αλλσγές ή διορθώσεις.

bugman

Για το καλοκαίρι:
Εδώ  https://github.com/M2000Interpreter/Version9/wiki/BlackJack-in-M2000-code και εδώ το ίδιο αλλά με χρώμα https://georgekarras.blogspot.com/2017/12/blackjack-verison-3-m2000-code.html είναι ο κώδικας για το BlackJack, το γνωστό παιχνίδι με κάρτες, σε M2000. Ακολουθεί τους κανόνες του παιχνιδιού με τις δυνατότητες επιπλέον παιχνιδιών μεταξύ "μάνας" και "παίκτη", ανάλογα με το τι θα είναι τα δυο πρώτα χαρτιά.
Ο κώδικας είναι γραμμένος με αγγλικές εντολές σε Μ2000, που στην ουσία είναι μια βελτιωμένη BASIC,
Στην αρχή του παιχνιδιού μια μεταβλητή κρατάει τον αριθμό των παικτών (εδώ είναι 4, αλλά μπορούμε να βάλουμε μεγαλύτερο νούμερο), και κάθε παίκτης ξεκινάει με 10000 μονάδες. Οι παίκτες μπορεί να βγουν εκτός όποτε θέλουν, ή βγαίνουν υποχρεωτικά όταν χάσουν τις μονάδες τους.
Το παιχνίδι δεν έχει γραφικά, αλλά μόνο κείμενο, με χρώμα και εμφανίζει και τα σύμβολα όπως κούπα, καρό, σπαθί, μπαστούνι (όπως τα λέμε). Για κάθε παίκτη, όπως έρχεται η σειρά του, μας ρωτάει το πρόγραμμα αν θέλουμε να πάρουμε χαρτί (hit) ή να μείνουμε εκεί που είμαστε (stand). Στην ουσία ο διάλογος γίνεται από τον dealer (την "μάνα"). Η μάνα δεν έχει ΑΙ (τεχνητή νοημοσύνη) αλλά παίζει με σταθερούς κανόνες (υποχρεωτικά). Παρόλο που εδώ θα σκεφτεί κανείς ότι με αυτόν τον τρόπο θα χάσει, είναι έτσι φτιαγμένο το παιχνίδι που πάντα κερδίζει σε βάθος χρόνου. Βρείτε τους κανόνες από το πρόγραμμα!

Χρησιμοποιούνται αντικείμενα για να κρατάμε τη κατάσταση του κάθε παίκτη αλλά και τον αριθμό παιχνιδιών που μπορεί να κάνει στη σειρά με την μάνα (ανάλογα με το τι χαρτιά πάρει στην αρχή, και τι επιλογή θα κάνει ο παίκτης, και τι υπόλοιπο σε μονάδες έχει).
Θα δείτε ότι η χρήση του GOTO σε ετικέτα είναι χρήσιμη (όταν δεν γίνεται κατάχρηση, το GOTO είναι αποδοτικό)

Η εντολή For έχει στο πρόγραμμα δυο παραλλαγές. Η μία είναι για την επανάληψη, και η άλλη είναι για να γίνεται μαζική προσπέλαση σε αντικείμενα. Η διαφορά φαίνεται στο δεύτερο γιατί δεν υπάρχει το = να δώσει τιμή έτσι το For Players(i) { } ανοίγει ένα μπλοκ για χειρισμό του αντικειμένου στη θέση του πίνακα Players(i). Μέσα σε ένα τέτοιο For, ονόματα μεταβλητών που ξεκινούν με τελεία αναφέρονται στα μέλη του αντικειμένου (τα οποία είναι δημόσια, σε αυτό το πρόγραμμα δεν έχουμε ιδιωτικά μέλη ομάδων, όπως λέγονται τα αντικείμενα της Μ2000)

Λοιπόν μπορεί κανείς να δώσει το δικό του BlackJack, στη γλώσσα που θα επιλέξει (εξαιρείται η ΓΛΩΣΣΑ, γιατί δεν έχει γεννήτρια τυχαίων αριθμών), όπως με Java και Python. Δεν είναι υποχρεωτικό να υποστηρίζει το πρόγραμμά σας όλα τα στοιχεία που υποστηρίζει το υπάρχον πρόγραμμα σε Μ2000.
Χρόνος που απαιτείται για να γίνει σε Java/Python και να είναι πλήρως διορθωμένο, όχι λιγότερο από ένα μήνα! Μια ωραία άσκηση λοιπόν (ενώ υπάρχει ήδη μια λύση). Αντί λοιπόν να υπάρχει "λογικό διάγραμμα", ή "εκφώνηση", υπάρχει κώδικας σε γλώσσα που δεν είναι γνωστή, αλλά είναι εύκολα κατανοητή (αν και η Μ2000 υποστηρίζει τύπους στις δηλώσεις μεταβλητών, δεν είναι απαραίτητο να δώσουμε τύπους, κάτι που μεγαλώνει πολύ τον κώδικα και εδώ δεν κερδίζουμε κάτι).
Η μεγαλύτερη δυσκολία είναι το πώς θα κάνει κανείς στην java ή στην python τις κατάλληλες δομές δεδομένων που θα κρατούν την κατάσταση του προγράμματος για όλους τους παίκτες και την μάνα, και την τράπουλα απ' όπου τραβάμε χαρτιά και κάθε φορά που τελειώνουν τα φύλα, προσθέτουμε άλλα ανακατεμένα επίσης.




bugman

Υπολογισμός του Pi με όσα ψηφία θέλουμε. http://www.rosettacode.org/wiki/Pi#M2000_Interpreter

Για να φτιαχτεί σε ΓΛΩΣΣΑ πρέπει να φτιάξουμε μια ουρά  FIFO (το πρώτο που μπαίνει θα βγει πρώτο) όπου θα μπαίνουν στο τέλος τιμές (ενώ διαβάζουμε από την αρχή) και κάποια στιγμή θα αυξάνουμε κατά ένα όλες τις τιμές, με τρόπο όπου θα "τραβάμε" μια τιμή θα την αυξάνουμε και μετά θα την εμφανίζουμε μέχρι να αδειάσει ο σωρός ή να μηδενιστεί ο αριθμός δεκαδικών που ζητάμε, οπότε και αδειάζουμε την ουρά, και τερματίζουμε.
Για την εμφάνιση των αριθμών (των ψηφίων) κολλητά ο ένας με με τον άλλο θα πρέπει να έχουμε ένα πίνακα αλφαριθμητικών δέκα θέσεων όπου ο κάθε αριθμός θα δίνει και τον αντίστοιχο χαρακτήρα.

Μια άσκηση προετοιμασίας για το παραπάνω πρόγραμμα είναι ένα πρόγραμμα που θα διαβάζει έναν θετικό ακέραιο αριθμό και θα τον αναπαράγει ένα προς ένα με όλα τα ψηφία του. Πχ αν δώσουμε εισαγωγή το 122323 θα πάρουμε το 1 2 2 3 2 3 χωρίς κενά αλλά το καθένα ως χαρακτήρας.

bugman

Η Μ2000 έχει φθάσει στην 9.4 έκδοση.
Προστέθηκε νέος τύπος ορισμού: enum ή enumaration, ή απαρ ή απαρίθμηση, δηλαδή ονόματα υπό έναν τύπο τα οποία βρίσκονται σε διάταξη, μπορούν να απαριθμηθούν, μπορούν να δώσουν το επόμενο/προηγούμενο και επιστρέφουν τιμή καθώς επίσης σε συνδυασμό με συναρτήσεις επιστρέφουν όνομα ή τύπο. Μπορούμε να ορίσουμε σε συνάρτηση, τμήμα, ή ρουτίνα μια παράμετρο να έχει τύπο συγκεκριμένη απαρίθμηση. Ορίζουμε μεταβλητές που μπορούν να πάρουν μόνο τιμές από το συγκεκριμένο τύπο. Στις πράξεις οι απαριθμήσεις λειτουργούν ως αριθμοί.
Απαρίθμηση Κατοικίδιο {Σκύλος=100, Γάτα, Χελώνα=200} : Κατοικίδιο1=Σκύλος: Τύπωσε Τύπος$(Κατοικίδιο)="Κατοικίδιο", Κατοικίδιο1=100, Κατοικίδιο1<Γάτα: Κατοικίδιο1++: Τύπωσε Κατοικίδιο1=Γάτα
Ένα_Κατοικίδιο=Κάθε(Κατοικίδιο)
Ενώ Ένα_Κατοικίδιο {
      \\ όνομα, τιμή, τύπος
       Τύπωσε Εκφρ$(Ένα_Κατοικίδιο),Εκφρ(Ένα_Κατοικίδιο), Τύπος$(Ένα_Κατοικίδιο)
}

Στο τόπο rosettacode.org υπάρχουν 223 παραδείγματα για διάφορα έργα (tasks), από απλά μέχρι και προχωρημένα.