On Github aochagavia / ownership
By Adolfo Ochagavía
Nieuw ontwikkeling. Paar jaar geleden taal Rust ontdekt. Fascinerend: geen garbage collection in 2015! Contributor geworden, etc.When is an object destroyed?
Wanneer wordt een object verwijderdThe main problem: Memory is limited
Alles leaken (geen optie). Garbage collection (C#). Manual (C en C++).An object is destroyed when the programmer says so
List<int> ints = new List<int>(); // Do stuff... delete ints;
List<int> ints = new List<int>(); // Do stuff... delete ints; Console.WriteLine(ints.Count); // Oops...
List<int> ints = new List<int>(); // Do stuff... // Oops... forgot to use 'delete'
List<int> ints = new List<int>(); // Do stuff... delete ints; delete ints; // Oops
An object is destroyed when the garbage collector says so
Beschikbaar in de programmeertaal LISP in de jaren 60! Apart programma.List<int> ints = new List<int>(); // Do stuff...
The Garbage Collection Handbook: The Art of Automatic Memory Management (2011, Jones et al.)
(500 pages of algorithms and techniques)An object is destroyed when the compiler says so
De compilert genereert de deletes voor jouThis code
List<int> ints = new List<int>(); // Do stuff...
Becomes
List<int> ints = new List<int>(); // Do stuff... delete ints;
Mainly two approaches
for (int i = 0; i < 10; i++) { List<int> ints = new List<int>(); // Do stuff... }
Becomes
for (int i = 0; i < 10; i++) { List<int> ints = new List<int>(); // Do stuff... delete ints; }Werkt goed in eenvoudige gevallen, maar...
A retrospective on region-based memory management (2004, Tofte et al.)
Na jaren onderzoek: beter om dit te combineren met garbage collection. Teveel leaks.Not enough information
Force programs to provide more information
A program must follow certain rules...
... otherwise it will be rejected by the compiler
Many normal programs don't compile...
... and the programmer has to think about memory management
List<int> ints = new List<int>(); List<int> myInts = ints; Console.WriteLine(ints.Count); // Illegal! Console.WriteLine(myInts.Count); // OK!
More information...
Owner niet meer in scope -> niemand anders kan het object gebruiken -> verwijderen{ List<int> ints = new List<int>(); // Do stuff... // delete ints; inserted by the compiler }Onafhankelijk van hoe complex het programma wordt. Analyse wordt veel makkelijker.
The previous rules are a little bit restrictive
Verschrikkelijk om echte programma's te schrijven met de huidige regelsList<int> ints = new List<int>(); List<int> moreInts = new List<int>(); if (moreInts.Equals(ints)) ints.Add(42); // Illegal!
List<int> ints = new List<int>(); List<int> moreInts = new List<int>(); if (moreInts.Equals(&ints)) // Notice the & ints.Add(42); // Legal!Nog meer aanpassingen aan de eerste ownership regels, maar gebrek aan tijd!
Example: Doubly linked list
Wie is de owner?Write tricky manual memory management code...
... Or just use garbage collection
Typish: combineren met manual memory management (niet ideaal, maar beter dan puur manual)