Κυριακή 5 Ιουνίου 2016

Προχωρημένες καταστάσεις: 5% πιο γρήγορος ο διερμηνευτής!

Η έκδοση 8.1 (αναθεώρηση 28) είναι η τελευταία.

Τι νέο έχει η αναθεώρηση 28:
Ενώ είχα αποφασίσει να μην πειράξω άλλο τον κώδικα. Σκέφτηκα μια που τελείωσε...να δουλέψω προς την μεριά της βελτιστοποίησης.
Η ιδέα ήταν να αφαιρέσω αντικείμενα από το αντικείμενο εκτέλεσης που δεν χρησιμοποιούνταν άμεσα, και να τα προσθέτω κατ΄απαίτηση. Αυτό σημαίνει ότι στη ρουτίνες που θα δουλέψουμε με αυτό υπάρχει ένα If που κοιτάει αν το αντικείμενο είναι Nothing, και αν ναι τότε το φτιάχνει. Το να δούμε αν το αντικείμενο είναι  "τίποτα" είναι μια απλή σύγκριση, το τίποτα είναι το 0. Όμως αν το αφήσουμε να το φτιάχνει, τότε κάθε φορά που ξεκινάει ένα νέο αντικείμενο δεσμεύει χώρο, κάνει αρχικοποίηση και πάλι στο τέλος κάνει καθάρισμα. Ένα τέτοιο αντικείμενο είναι ο σωρός επιστροφής (ή στοίβα αν προτιμάτε). Ο σωρός χρησιμοποιείται σε ορισμένες περιπτώσεις  όπως στην κλήση ρουτινών (sub ...end sub), στο Για Επόμενο (όχι στο Για { } και για αυτό είναι πιο γρήγορο), καθώς και στο Gosub/return ρουτίνες δηλαδή χωρίς άμεσες, χωρίς παραμέτρους. Επιπλέον χρησιμοποιείται και όπου μας ενδιαφέρει ο προσωρινός χώρος μεταβλητών, γιατί ο σωρός κρατάει τις θέσεις των λιστών ονομάτων μεταβλητών και συναρτήσεων/τμημάτων, μόνο όμως σε ορισμένες περιπτώσεις. Όταν καλούμε τμήματα ή συναρτήσεις, δεν υπάρχει ειδικός σωρός αλλά ο κύριος σωρός του προγράμματος, εκεί που μπαίνουν οι αυτόματες μεταβλητές όπως λέμε. Για το λόγο αυτό και ο σωρός για τις ρουτίνες μπορεί να γίνει τεράστιος, ενώ ο κύριος σωρός είναι fix...και μάλιστα επειδή η M2000 είναι σε dll, το ύψος του σωρού καθορίζεται στο πρόγραμμα που την φορτώνει (εδώ την φορτώνει το m2000.exe, αλλά θα μπορούσε κάποιος να τη φορτώσει σαν script γλώσσα σε άλλη γλώσσα, είναι ένα αντικείμενο για τον υπολογιστή, και μπορεί κανείς να συνδέσει αναφορές σε αυτήν).
Μια άλλη ιδέα ήταν να αφαιρέσω την κύρια στοίβα ή σωρός τιμών, από το να ετοιμάζει νέο κάθε φορά που ξεκινάει το αντικείμενο εκτέλεσης, γιατί συνήθως ο σωρός δίνεται εκ νέου (οπότε πέταγε τον νέο που είχε δημιουργηθεί στην αρχή). Τέλος μια ακόμα αλλαγή έγινε στο σύστημα που κοιτάει τις αρχικές τελείες στα ονόματα. Εκεί έβαλα περιορισμό τις 10. Αποκλείεται κανείς λογικός να βάλει 5 τελείες, όχι δέκα. (σημαίνει ότι έχει ανοίξει πέντε αντικείμενα και κάθε αριθμός τελειών δηλώνει ένα από τα ανοικτά αντικείμενα). Τα αντικείμενα ομάδες μπορεί να είναι επώνυμα ή να ανώνυμα,και στην δεύτερη περίπτωση σημαίνει ότι δεν έχουν όνομα στο τμήμα που τα χρησιμοποιούμε αλλά θέση σε κάτι, όπως σε πίνακα ή κατάσταση ειδών. Για να τα ανοίξουμε, σημαίνει ότι θα δώσουμε όνομα, αλλά αντί να κάνουμε κάτι τέτοιο που θα έδινε ένα αντίγραφο, κάνουμε με άλλο τρόπο ένα προσωρινό άνοιγμα, όπου δίνει ο διερμηνευτής όνομα (μάλλον το έχει το κρυφό ήδη ενσωματωμένο), αλλά το σπουδαιότερο εδώ είναι ότι βγάζει τα μέλη της ομάδας από μια λίστα και τα βάζει σε κανονικό χώρο με το κρυφό όνομα.. Αντί λοιπόν να γνωρίζουμε το όνομα βάζουμε πριν τις ιδιότητες και τις μεθόδους την τελεία, ή τις τελείες αν έχουμε φωλιασμένα ανοίγματα.

Π.χ. αν στα Α(2) και Α(3) είναι δυο αντικείμενα, και έχουν από μια ιδιότητα Χ τότε μια Για ανοίγει αυτά τα δύο:
Κλάση Αλφα {
      Χ
}
Πίνακας Α(10)=Αλφα()
Α(2).Χ=5
Α(3).Χ=7
Για Α(2), Α(3) {
      Τύπωσε .Χ, ..Χ
      Άλλαξε .Χ, ..Χ
      Τύπωσε .Χ, ..Χ
}

Η άλλαξε (Swap) δεν μπορεί να ανοίξει τα αντικείμενα, το Άλλαξε a(2).X, A(3).X δεν δουλεύει, τα X δεν βρίσκονται σε λίστα μεταβλητών, οι τιμές τους είναι μέσα στο "πτητικό" αντικείμενο στο πίνακα. Για το λόγο αυτό πάει όπου θέλουμε. (η κύρια μνήμη που μπαίνουν οι τιμές μεταβλητών είναι γραμμική, και πάντα αυξάνεται και μειώνεται από το ένα άκρο, ποτέ δεν σβήνουν ή αφαιρούνται ενδιάμεσα. Τα επώνυμα αντικείμενα έχουν όλα τα μέλη ανεξάρτητα, και απλά κρατάνε μια λίστα για το ποια είναι όταν χρειαστεί να τα αντιγράψει.


H M2000 χρησιμοποιεί ένα αντικείμενο με αναφορά μόνο το οποίο είναι υποδοχέας άλλων. Ένα από αυτά τα άλλα είναι η Κατάσταση Ειδών, η απλά Κατάσταση. Αυτό το αντικείμενο καταχωρεί με ένα κλειδί (ένα νούμερο ή ένα αλφαριθμητικό, μοναδικό όμως)  διάφορα είδη, ακόμα και αντικείμενα. Μπορεί κανείς όμως, να καταχωρήσει το ίδιο! Ή να το καταχωρήσει αλλού, σε μια άλλη κατάσταση και αυτήν να την καταχωρήσει στην πρώτη. Μιλάμε για κυκλική αναφορά. το Α κρατάει το Β που αυτό κρατάει το Α. Όταν σβήνουμε αντικείμενα όπως αυτό με αναφορά, πρέπει να φύγει και η τελευταία για να καθαρίσει. Αν το Α δείχνει στο Β και το Β στο Α και καμία αναφορά από το πρόγραμμα στα Α και Β τότε απλά τα Α και Β μένουν στην μνήμη. Βέβαια στους σημερινούς υπολογιστές αυτό σημαίνει ότι μένουν στην μνήμη της εφαρμογής, και πως μόλις αυτή τερματίσει θα διαγραφούν, αλλά πώς; Άμεσα, χωρίς να σταλθεί μήνυμα ώστε τυχόν προετοιμασίες να συμβούν. Αυτό που πρόσθεσα είναι ένας τρόπος με την εντολή Clear η καθαρό, να διαγράψουμε  τέτοια αντικείμενα. Η διαγραφή γίνεται και πριν τερματίσει το πρόγραμμα ώστε σε περίπτωση που έχουμε αντικείμενα μέσα στη Κατάσταση να πάρουν και αυτά το μήνυμα "διαγραφή".
Ο μηχανισμός δουλεύει με μια λίστα όπου όταν πάμε να γράψουμε μια Κατάσταση σε μια Κατάσταση ή σε ένα πίνακα, τότε καταγράφεται σε αυτήν. Γράφεται μόνο μια φορά γιατί το κλειδί είναι ο δείκτης της και αυτός δεν αλλάζει., μέχρι να διαγραφεί. Οπότε κάθε φορά που είναι να καθαρίσουμε με την Clear η Καθαρό (χωρίς παραμέτρους καθαρίζει όλη τη μνήμη, αλλά δουλεύει μόνο από τη γραμμή εντολών), κοιτάει αν η λίστα έχει πράγμα και δίνει εντολή καθαρισμού πριν τα σβήσει. Δηλαδή οι καταστάσεις έχουν πια μια εντολή καθαρισμού. Με αυτό το τρόπο πρώτα καθαρίζει ο εσωτερικός πίνακας από κάθε αντικείμενο. Το σύστημα δεν βάζει ένα 0, αλλά ξέρει που είναι αντικείμενο και αφαιρεί 1 από τον μετρητή αναφορών. Λογικά πρέπει με το πρώτο πέρασμα να μείνουν μόνο οι αναφορές που έχει αυτή η λίστα. Οπότε μετά καθαρίζουμε και την λίστα. Μπορούμε να δώσουμε και δυο ή περισσότερες φορές αυτήν την εντολή.  Σε ένα πρόγραμμα που τρέχει άμεσα με διπλό κλικ το Clear το εκτελεί στο τέλος. Απλά όταν ασχολούμαστε με το να γράφουμε προγράμματα και να χρησιμοποιούμε αντικείμενα καλό είναι να καθαρίζουμε που και που την μνήμη, Σε ορισμένα λάθη ο διερμηνευτής προτείνει τον καθαρισμό.

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

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

You can feel free to write any suggestion, or idea on the subject.