Πέμπτη, 11 Μαΐου 2017

Αναθεώρηση 22 (Έκδοση 8.7)

Μικρές διορθώσεις, κύρια στο σύστημα του συλλέκτη σκουπιδιών (garbage collector).
Το παρακάτω παράδειγμα σε προηγούμενη αναθεώρηση έβγαζε ένα αντικείμενο για καταστροφή, και αφού επίστρεφε από το τμήμα. Τώρα έχει καθαρίσει


Γράφουμε το παρακάτω σε ένα τμήμα έστω Α

Module b {
      Group alfa {
            Dim a(1)
      }
      Inventory a=1,2:=1000,3:="ok",4
      alfa.a(0)=a
      Print alfa.a(0)
      Push alfa
      \\ so now inventory is on an array on a group and in stack
}
\\ call b
b
\\ now inventory a deleted, but a reference is on the stack
Dim a(10)
\\ so now we read group to a(0)
Read a(0)
Print a(0).a(0)
\\ N is a reference for inventory
N=a(0).a(0)
\\ so now we get N$() and N()
Print N$(3), N(2) \\  ok    1000
\\ or using a help function
Def getstr$(A, Key)=A$(Key)
Print getstr$(a(0).a(0), 3) \\ ok
Return a(0).a(0), 3:="yes", 2:=500
Print getstr$(a(0).a(0), 3), a(0).a(0)(2) \\ yes   500
For a(0) {
      Link .a() to a$()
      Print a$(0)(2)
}
List  \\ print: ojbects for destroy: 1
\\ now at exit this object destroyed automatic



Ποιο μπλεγμένο πρόβλημα εδώ. Έχουμε δυο καταστάσεις (Inventories) σις οποίες βάζουμε εναλλάξ αναφορές, και σε πίνακα! Δηλαδή στο Α έχουμε αναφορά στο Β και στο Β έχουμε αναφορά στο Α. Στους πίνακες έχουμε το Α για το Α (δηλαδή μέσα στο ίδιο αντικείμενο έχουμε αναφορά στον εαυτό του). Για να καταστραφούν τα αντικείμενα με αναφορές, πρέπει να φύγει και η τελευταία. Η μέθοδος που ακολουθεί ο διερμηνευτής είναι να ενημερώνει μια λίστα (garbage collection) με κλειδί τον δείκτη (pointer) που δείχνει στις καταστάσεις σε κάποια γεγονότα. Ένα γεγονός είναι να γράψουμε τον δείκτη σε πίνακα ή σε κατάσταση. Εδώ δίνουμε εντολές Clear A και Clear B (Καθαρό Α και Καθαρό Β) και αυτή καθαρίζει τα αντικείμενα εντός (όχι μόνο καθαρίζει αλλά βάζει κενές καταστάσεις, με άλλο δείκτη). Παρόλα αυτά τα aa και bb κρατάνε αναφορά στο Α και Β, που τώρα είναι άδεια. Στο τέλος του μπλοκ εντολών του τμήματος bbbb θα καθαρίσει τα A, B, aa, bb. Στη νέα αναθεώρηση όταν θα καταστραφεί ο πίνακας aa θα καταστραφεί και το Α, γιατί δεν έμεινε άλλος δείκτης να το δείχνει.


Module bbbb {
      Inventory A=1,2
      Inventory B=1:=1000,2
      aa=(A,3)
      bb=(B,4)
      Append A, "hello":=B ,3:=aa
      Append B, 4:=A ,3:=bb
      Clear A
      Clear B
      List
}
bbbb
Print "out of bbbb"
List  \\ nothing to destroy

Ο συλλέκτης σκουπιδικών δουλεύει και με "παραγγελία"... Άδειασε Σκουπίδια, αλλά καθαρίζει όλα τα αντικείμενα που έχουν επισημανθεί. Επίσης και η εντολή καθαρό καθαρίζει τις μεταβλητές και τα αντικείμενα - αναφορές- στο συλλέκτη σκουπιδιών.