Παρασκευή, 31 Ιουλίου 2015

Χρήση της ΔΙΑΜΕΣΟΥ ή GOSUB στη Μ2000 μέρος Α

Στην όγδοη έκδοση της Μ2000 μπήκαν και οι ρουτίνες στο συντακτικό της. Στο παράδειγμα παρακάτω το τμήμα Α έχει δυο ρουτίνες την Α(Χ) και την Β(Χ). Προς το παρόν το αναγνωριστικό Ρουτίνα στον ορισμό δεν θέλει τόνο (για να μην κάνει διπλή αναζήτηση ο μεταφραστής, αλλά δέχεται μικρά μεγάλα ανάμεικτα). Το ίδιο πρόγραμμα στο Α εκτελείται και από το τμήμα Α1 αλλά εκεί αντί για ρουτίνες έχουμε τμήματα, τοπικά, τα Α και Β.

Μια εμφανή διαφορά είναι ότι στο Α1 τα τοπικά τμήματα πρέπει να αναφέρονται πριν την χρήση τους, ενώ στο Α οι ρουτίνες απλά πρέπει να υπάρχουν κάπου στο τέλος του τμήματος.
Τα τμήματα εγγράφονται σε ένα ξεχωριστό "ευρετήριο" ενώ οι ρουτίνες υπάρχουν άνευ ευρετηρίου. Κάθε φορά που ζητάμε μια ρουτίνα, αυτή αναζητείται. Επειδή η αναζήτηση γίνεται από το τέλος είναι γρήγορη, όχι όμως όσο η αναζήτηση βάσει ευρετηρίου στα τμήματα. Οπότε το τμήμα Α1 εκτελείται πιο γρήγορα (και επειδή χρησιμοποιεί το γρήγορο Για {} και όχι το Για Επόμενο). Η διαφορά φόρτου (του χρόνου που χρειάζεται δηλαδή να εκτελεστεί) είναι ότι στο τμήμα Α χρειάζεται ένα 10% παραπάνω (περίπου 2% για την Για Επόμενο και το 8% λόγω της αναζήτησης των ρουτινών).

Υπάρχουν όμως δυο διαφορές που δεν γίνονται αμέσως φανερές, επειδή δεν φαίνεται εδώ να μας βοηθάνε σε τίποτα. Η μία είναι ότι οι ρουτίνες είναι εκτός ευρετηρίου που σημαίνει επίσης ότι ανήκουν στον ίδιο χώρο ονομάτων με το τμήμα. Όλες οι μεταβλητές του τμήματος είναι σαν καθολικές μεταβλητές στην ρουτίνα. Επίσης κάθε νέα μεταβλητή θα ανήκει μεν στο τμήμα αλλά στο τμήμα Ρουτινα Τέλος Ρουτίνας κάθε νέα μεταβλητή, τμήμα, συνάρτηση θα χαθεί μετά το πέρας της εκτέλεσης της ρουτίνας. Αν στο τμήμα υπάρχει η κ και θέλουμε να χρησιμοποιήσουμε μια τοπική κ στη ρουτίνα τότε δίνουμε εντολή:
       Τοπική κ
 ή
       Τοπική κ=10, λ=34, Α(10,20)=1 \\ δημιουργούμε και τοπικούς πίνακες!

Εδώ χρειάζεται μια προσοχή γιατί η Μ2000 έχει νήματα (δηλαδή τμήματα παράλληλης εκτέλεσης) στα τμήματα και αυτά μπορούν να καλέσουν τις ρουτίνες (αφού τα νήματα είναι στον ίδιο χώρο με το τμήμα που τα δημιούργησε). Συνήθως όμως στα νήματα χρησιμοποιούμε υπάρχουσες μεταβλητές (ορισμένες στο τμήμα πριν ξεκινήσει το νήμα).
Μια δεύτερη διαφορά είναι ότι οι ρουτίνες θέλουν καθορισμένη λίστα παραμέτρων. Τα τμήματα μπορούν να αλλάξουν τρόπο "συλλογής" παραμέτρων με διαδοχικά Διάβασε ενώ μια ρουτίνα υποχρεωτικά θέλει ότι έχει προδιαγραφεί και από εκεί και πέρα μπορεί να πάρει επιπλέον μέσω της Διάβασε.
Τεχνικά οι Ρουτίνες είναι κομμάτια του τμήματος που θέλουμε να επαναλάβουμε βάσει ονόματος. Μπορούμε να βάλουμε ορισμούς νημάτων, επειδή αυτά δεν έχουν όνομα, διαχειρίζονται με "χειριστές" Handlers, δηλαδή αριθμούς. Με την εντολή ΜΕΤΑ μπορούμε να ορίσουμε ένα νήμα να ξεκινήσει μετά από κάποια χιλιοστά του δευτερολέπτου, ή δευτερόλεπτα, και αυτό θα γίνει αφού θα έχουμε φύγει από την ρουτίνα που περιείχε την εντολή ΜΕΤΑ.
όταν μας ενδιαφέρει η έννοια της στατικής μεταβλητής, δηλαδή να καλούμε μια ρουτίνα και αυτή να γράφει κάποια αποτελέσματα τα οποία σε επόμενη κλήση να τα χρησιμοποιεί, τότε η ρουτίνα της Μ2000 επειδή έχει πρόσβαση στις μεταβλητές του τμήματος που περιλαμβάνεται μπορεί να έχει εκεί τις "στατικές" μεταβλητές. Άλλος τρόπος για χρήση στατικών μεταβλητών είναι να τις έχουμε συμπεριλάβει σε μια Ομάδα, αλλά αυτό είναι προχωρημένο για τώρα (Ομάδες και Κλάσεις είναι το άλλο μεγάλο κεφάλαιο της Μ2000).
Ένα τμήμα έχει ένα σωρό για να βρίσκει ή να αφήνει τιμές. Οι ρουτίνες έχουν κοινό σωρό με το σωρό του τμήματος. Αν θέλουμε νέο σωρό τότε υπάρχει το Σωρός Νέος {    } και ανάμεσα στο μπλοκ η Μ2000 μας παρέχει νέο σωρό (Τα νήματα έχουν πάντα δικό τους σωρό, ενώ τα τμήματα όπως και οι ρουτίνες κληρονομούν τον σωρό του "πατέρα", ή τον πατρικό σωρό). Ο σωρός αυτός ας μην μπερδεύεται με τον σωρό επιστροφής των ρουτινών, αυτός είναι διαφορετικός και απροσπέλαστος από τον προγραμματιστή.
Στο όρισμα της Ρουτίνας μπορούμε να βάλουμε το & για να δηλώσουμε ότι ζητάμε αναφορά. Μπορούμε να περάσουμε πίνακες (αυτούσιους) ή αναφορές σε πίνακες. Μπορούμε να περάσουμε αναφορές σε συναρτήσεις επίσης.
Ακόμα και χωρίς όρισμα χρειάζεται να βάλουμε τις παρενθέσεις για τις ρουτίνες. Επειδή χωρίς παρενθέσεις έχουμε κλήση απλής ρουτίνας που θα δούμε στο μέρος Β.

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

Πρόσθεσα και τρόπο μέτρησης της διαφοράς στην ταχύτητα.
Στην έκδοση 8.17 αναθεώρηση 17 διαπιστώθηκε bug στην έξοδος για και αποκαταστάθηκε στην αναθερώρηση 18. 
Η έξοδος για μπορεί να γίνει  δίνοντας τον αριθμό γραμμής (αριθμό που δίνουμε εμείς σε μια γραμμή), ή ετικέτα, ή τίποτα (στο τίποτα είχε θέμα, όπως εδώ)


Τμήμα ΟΛΟ {
            Τμήμα Α {
            Για ι=1 Έως 100
                   Διαμεσου Α(ι)
                   Αν ι>59 Τότε έξοδος για
                  Διαμεσου Β(ι)
            Επόμενο ι
            Τύπωσε "Τελικό ι=";ι
          
            Ρουτίνα Α(Χ)
                   Αν Χ>10 Τότε Έξοδος ρουτίνας
                  Τύπωσε Χ
            Τέλος Ρουτίνας
            Ρουτίνα Β(Χ)
                   Αν Χ<50 Τότε Έξοδος ρουτίνας
                  Τύπωσε Χ**2
            Τέλος Ρουτίνας
      }
      Τμήμα Α1 {
            Τμήμα Α {
                   Διάβασε Χ
                  Αν Χ>10 Τότε Έξοδος
                  Τύπωσε Χ
            }       
            Τμήμα Β {
                   Διάβασε Χ
                  Αν Χ<50 Τότε Έξοδος
                  Τύπωσε Χ**2
                  }
            Για ι=1 Έως 100 {
                   Α ι
                  Αν ι>59 Τότε έξοδος
                  Β ι
            }
            Τύπωσε "Τελικό ι=";ι
      }
      Οθόνη
      Αναλυτής
      Α
      αφ=Φόρτος
      Α$=ΚΟΜ$
      Οθόνη
      Αναλυτής
      Α1
      α1φ=Φόρτος
      Τύπωσε αφ, α1φ
}
Κάλεσε ΟΛΟ

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

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