Τρίτη, 11 Ιουλίου 2017

Αναθεώρηση 11 (έκδοση 8.9)

Βελτιώθηκε η ταχύτητα. Το πρόγραμμα που χρησιμοποιώ για την μέτρηση της ταχύτητας είναι το παρακάτω στο τέλος της ανάρτησης, και στη κονσόλα για την μέγιστη ταχύτητα γράφω το Γρήγορα ! ή Fast !. Ο διερμηνευτής μπορεί να εκτελέσει σε τρεις "ταχύτητες" ένα πρόγραμμα, στο κανονικό που είναι το Γρήγορα ή Fast, στο Αργό ή Slow, και στο Γρήγορα ! ή Fast !. Οι διαφορές εσωτερικά έχουν να κάνουν με το πόσο και πώς δίνει ο διερμηνευτής χρόνο στο σύστημα. Επιπλέον επειδή στις φόρμες και στην κονσόλα χρησιμοποιείται διπλή ενδιάμεση μνήμη, η τελική ανανέωση (αντιγραφή δηλααδή της μνήμης ως περιεχόμενο της οθόνης) επιβαρύνει την εκτέλεση (βάζει φόρτο δηλαδή στο σύστημα). Στην μέγιστη ταχύτητα  Γρήγορα !  (ή μέσα από τμήμα με την Θέσε Γρήγορα !) οι επαναλήψεις με την Για δεν μπορούν να διακοπούν με Esc. Το Esc λειτουργεί αλλά εκτελείται αμέσως μετά την εκτέλεση του μπλοκ εντολών της Για.
Αν θέλαμε να τυπώσουμε έστω 1000 νούμερα στην κονσόλα, το ένα δίπλα στο άλλο, σε στήλες, τότε με την υψηλή ταχύτητα θα δούμε το αποτέλεσμα στο τέλος,ενώ με την μεσαία (κανονική) και με την αργή θα δούμε βάσει του μετρητή ανανέωσης.
Ακόμα και η ανάλυση σε γραμμές και στήλες χαρακτήρων παίζει ρόλο. Λίγες στήλες για αριθμούς στη γραμμή συμαίνει ότι θα χρειαστούν  περισσότερες ολισθήσεις προς τα πάνω, και εμάνιση καθαρής γραμμής κάτω, άρα περισσότερος χρόνος. (εξ ορισμού αποδίδονται στήλες σε κάθε γραμμή για να μπαίνουν αριθμοί και αλαφαριθμητικά, συνήθως δέκα χαρακτήρων, αλλά μπορούμε να το αλλάξουμε). Στο μικρό παράδειγμα δείτε τη διαφορά όταν επιλέγουμε πλάτος χαρακτήρων 100 χαρακτήρες, ή 60 ή 30. Επιπλέον δείτε τη διαφορά με εντολές στη κονσόλα Αργά, Γρήγορα και Γρήγορα ! (κάνουμε deltete, αφαίρεση του διαχωριστικού παραγράφων και πάμε το Φόρμα 100, 50 στη πρώτη γραμμή και μετά εισάγουμε με Enter το διαχωριστικό παραγράφων πριν το επόμενο Φόρμα 60, 32 (με αυτό τον τρόπο βάζουμε και βγάζουμε εντολές χωρίς να τις σβήνουμε από το κώδικα).

Σημ 1 :
Φόρμα 100, 50
Σημ 2 : Φόρμα 60, 32
Σημ 3 : Φόρμα 30, 16
Αναλυτής
Για ι=1 έως 1000 {
      Τύπωσε ι,
}
Τύπωσε
Τύπωσε Φόρτος

Εδώ είναι το πρόγραμμα (έχει δοθεί παρόμοιο παλαιότερα, το 2015, εδώ)

Καθαρό
Στατική αβγ=10
Τμήμα β {
      Συνάρτηση x {=1000}
      α=x()
}
Τμήμα άλφαβήταγάμα {
      Συνάρτηση μεγάλοόνομα {=1000}
      άλφαβήτα=μεγάλοόνομα()
}
Τμήμα άλφαβήταΤελ {
      Συνάρτηση μεγάλοόνομα {=1000}
      άλφαβήτα=.μεγάλοόνομα()
}
Τμήμα άλφα_βήτα_γάμα {
      Συνάρτηση ένα_μεγάλο_ένα {=1000}
      άλφα_βήτα=ένα_μεγάλο_ένα()
}
Συνάρτηση Τπ$ {
      Διάβασε α
      Αν α=1 Τότε {="βελτιστοποίηση ναι"} Αλλιώς ="βελτιστοποίηση όχι"
}
Φόρμα 80,40
Οθόνη 1, 0 : Πένα 14
Τύπωσε $(4),   \\ Αναλογική γραφή
Ανανεωση
Για μ=1 Έως 2 {
      Αν μ=1 Τότε {βελτιστοποίηση ναι } Αλλιώς βελτιστοποίηση όχι
      Τύπωσε Τπ$(μ)
      Τύπωσε "Κανονικά Ονόματα"
      Τοπική άλφαβήτα,βήταγάμα,δέλταέπσιλον
      βήταγάμα=2
      δέλταέπσιλον=45
      Αναλυτής
      Για ν=1 Έως 3000
            άλφαβήτα=ριζα(βήταγάμα)+ημ(δέλταέπσιλον)
            άλφαβήταγάμα
      Επόμενο ν
      Τύπωσε Φόρτος
      Ανανέωση
      Τύπωσε "Ονόματα με _"
      Τοπική άλφα_βήτα,βήτα_γάμα,δέλτα_έπσιλον
      βήτα_γάμα=2
      δέλτα_έπσιλον=45
      Αναλυτής
      Για ν=1 Έως 3000
            άλφα_βήτα=ριζα(βήτα_γάμα)+ημ(δέλτα_έπσιλον)
            άλφα_βήτα_γάμα
      Επόμενο ν
      Τύπωσε Φόρτος
      Ανανέωση
      Τύπωσε "Ονόματα με ένα γράμμα"
      Τοπική α, β, δ
      β=2
      δ=45
      Αναλυτής
      Για ν=1 Έως 3000
            α=ριζα(β)+ημ()
            β
      Επόμενο ν
      Τύπωσε Φόρτος
      Ανανέωση
      Τύπωσε "Πλήρες όνομα με τελεια στην αρχή και @ στις συναρτήσεις μεταφραστή"
      Τοπική άλφαβήτα,βήταγάμα,δέλταέπσιλον
      βήταγάμα=2
      δέλταέπσιλον=45
      Αναλυτής
      Για ν=1 Έως 3000
            .άλφαβήτα=@ριζα(.βήτα_γάμα)+@ημ(.δέλτα_έπσιλον)
            .άλφαβήταΤελ
      Επόμενο ν
      Τύπωσε Φόρτος
      Ανανέωση
}
Τύπωσε  "Χρησιμοποίηση γρήγορης Για {}"
Ανανέωση
Για μ=1 Έως 2 {
      Αν μ=1 Τότε {βελτιστοποίηση ναι } Αλλιώς βελτιστοποίηση όχι
      Τύπωσε Τπ$(μ)
      Τύπωσε "Κανονικά Ονόματα"
      Τοπική άλφαβήτα,βήταγάμα,δέλταέπσιλον
      βήταγάμα=2
      δέλταέπσιλον=45
      Αναλυτής
      Για ν=1 Έως 3000 {
            άλφαβήτα=ριζα(βήταγάμα)+ημ(δέλταέπσιλον)
            άλφαβήταγάμα
      }
      Τύπωσε Φόρτος
      Ανανέωση
      Τύπωσε "Ονόματα με _"
      Τοπική άλφα_βήτα,βήτα_γάμα,δέλτα_έπσιλον
      βήτα_γάμα=2
      δέλτα_έπσιλον=45
      Αναλυτής
      Για ν=1 Έως 3000 {
            άλφα_βήτα=ριζα(βήτα_γάμα)+ημ(δέλτα_έπσιλον)
            άλφα_βήτα_γάμα
      }
      Τύπωσε Φόρτος
      Ανανέωση
      Τύπωσε "Ονόματα με ένα γράμμα"
      Τοπική α, β, δ
      β=2
      δ=45
      Αναλυτής
      Για ν=1 Έως 3000 {
            α=ριζα(β)+ημ()
            β
      }
      Τύπωσε Φόρτος
      Ανανέωση
      Τύπωσε "Πλήρες όνομα με τελεια στην αρχή και @ στις συναρτήσεις μεταφραστή"
      Τοπική άλφαβήτα,βήταγάμα,δέλταέπσιλον
      βήταγάμα=2
      δέλταέπσιλον=45
      Αναλυτής
      Για ν=1 Έως 3000 {
            .άλφαβήτα=@ριζα(.βήτα_γάμα)+@ημ(.δέλτα_έπσιλον)
            .άλφαβήταΤελ
      }
      Τύπωσε Φόρτος
      Ανανέωση
}
βελτιστοποίηση ναι





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

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

Από την αναθεώρηση 11 (έκδοση 8.9) η εντολή Καθαρό μπορεί να καθαρίσει τις στατικές από το αντικείμενο εκτέλεσης (ενώ η Θέσε Καθαρό καθαρίζει τα πάντα, και δεν συνίσταται) (η Εντολή Θέσε εκτελεί μια γραμμή εντολών - μέχρι το πέλος παραγράφου- σαν να εκτελείται εκτός προγράμματος, από την γραμμή εντολών της κονσόλας).


Καθαρό
Τμήμα β {
      Στατική αβγ=10
      Συνάρτηση x {=1000}
      α=x()
}
Τμήμα άλφαβήταγάμα {
      Στατική αβγ=10
      Συνάρτηση μεγάλοόνομα {=1000}
      άλφαβήτα=μεγάλοόνομα()
}
Τμήμα άλφαβήταΤελ {
      Στατική αβγ=10
      Συνάρτηση μεγάλοόνομα {=1000}
      άλφαβήτα=.μεγάλοόνομα()
}
Τμήμα άλφα_βήτα_γάμα {
      Στατική αβγ=10
      Συνάρτηση ένα_μεγάλο_ένα {=1000}
      άλφα_βήτα=ένα_μεγάλο_ένα()
}
Συνάρτηση Τπ$ {
      Στατική αβγ=10
      Διάβασε α
      Αν α=1 Τότε {="βελτιστοποίηση ναι"} Αλλιώς ="βελτιστοποίηση όχι"
}
Φόρμα 80,40
Οθόνη 1, 0 : Πένα 14
Τύπωσε $(4),   \\ Αναλογική γραφή
Ανανεωση
Για μ=1 Έως 2 {
      Αν μ=1 Τότε {βελτιστοποίηση ναι } Αλλιώς βελτιστοποίηση όχι
      Τύπωσε Τπ$(μ)
      Τύπωσε "Κανονικά Ονόματα"
      Τοπική άλφαβήτα,βήταγάμα,δέλταέπσιλον
      βήταγάμα=2
      δέλταέπσιλον=45
      Αναλυτής
      Για ν=1 Έως 3000
            άλφαβήτα=ριζα(βήταγάμα)+ημ(δέλταέπσιλον)
            άλφαβήταγάμα
      Επόμενο ν
      Τύπωσε Φόρτος
      Ανανέωση
      Τύπωσε "Ονόματα με _"
      Τοπική άλφα_βήτα,βήτα_γάμα,δέλτα_έπσιλον
      βήτα_γάμα=2
      δέλτα_έπσιλον=45
      Αναλυτής
      Για ν=1 Έως 3000
            άλφα_βήτα=ριζα(βήτα_γάμα)+ημ(δέλτα_έπσιλον)
            άλφα_βήτα_γάμα
      Επόμενο ν
      Τύπωσε Φόρτος
      Ανανέωση
      Τύπωσε "Ονόματα με ένα γράμμα"
      Τοπική α, β, δ
      β=2
      δ=45
      Αναλυτής
      Για ν=1 Έως 3000
            α=ριζα(β)+ημ()
            β
      Επόμενο ν
      Τύπωσε Φόρτος
      Ανανέωση
      Τύπωσε "Πλήρες όνομα με τελεια στην αρχή και @ στις συναρτήσεις μεταφραστή"
      Τοπική άλφαβήτα,βήταγάμα,δέλταέπσιλον
      βήταγάμα=2
      δέλταέπσιλον=45
      Αναλυτής
      Για ν=1 Έως 3000
            .άλφαβήτα=@ριζα(.βήτα_γάμα)+@ημ(.δέλτα_έπσιλον)
            .άλφαβήταΤελ
      Επόμενο ν
      Τύπωσε Φόρτος
      Ανανέωση
}
Τύπωσε  "Χρησιμοποίηση γρήγορης Για {}"
Ανανέωση
Για μ=1 Έως 2 {
      Αν μ=1 Τότε {βελτιστοποίηση ναι } Αλλιώς βελτιστοποίηση όχι
      Τύπωσε Τπ$(μ)
      Τύπωσε "Κανονικά Ονόματα"
      Τοπική άλφαβήτα,βήταγάμα,δέλταέπσιλον
      βήταγάμα=2
      δέλταέπσιλον=45
      Αναλυτής
      Για ν=1 Έως 3000 {
            άλφαβήτα=ριζα(βήταγάμα)+ημ(δέλταέπσιλον)
            άλφαβήταγάμα
      }
      Τύπωσε Φόρτος
      Ανανέωση
      Τύπωσε "Ονόματα με _"
      Τοπική άλφα_βήτα,βήτα_γάμα,δέλτα_έπσιλον
      βήτα_γάμα=2
      δέλτα_έπσιλον=45
      Αναλυτής
      Για ν=1 Έως 3000 {
            άλφα_βήτα=ριζα(βήτα_γάμα)+ημ(δέλτα_έπσιλον)
            άλφα_βήτα_γάμα
      }
      Τύπωσε Φόρτος
      Ανανέωση
      Τύπωσε "Ονόματα με ένα γράμμα"
      Τοπική α, β, δ
      β=2
      δ=45
      Αναλυτής
      Για ν=1 Έως 3000 {
            α=ριζα(β)+ημ()
            β
      }
      Τύπωσε Φόρτος
      Ανανέωση
      Τύπωσε "Πλήρες όνομα με τελεια στην αρχή και @ στις συναρτήσεις μεταφραστή"
      Τοπική άλφαβήτα,βήταγάμα,δέλταέπσιλον
      βήταγάμα=2
      δέλταέπσιλον=45
      Αναλυτής
      Για ν=1 Έως 3000 {
            .άλφαβήτα=@ριζα(.βήτα_γάμα)+@ημ(.δέλτα_έπσιλον)
            .άλφαβήταΤελ
      }
      Τύπωσε Φόρτος
      Ανανέωση
}
βελτιστοποίηση ναι