Compile-time garbage collection (was Re: Compiler writers will love this language)

Dobes Vandermeer <dobes@dobesland.com>
2 Jul 2003 00:45:30 -0400

          From comp.compilers

Related articles
Compiler writers will love this language ericmuttta@email.com (2003-05-29)
Re: Compiler writers will love this language torbenm@diku.dk (2003-06-03)
Re: Compiler writers will love this language ericmuttta@email.com (2003-06-05)
Re: Compiler writers will love this language mwotton@cse.unsw.edu.au (2003-06-08)
Re: Compiler writers will love this language ericmuttta@email.com (2003-06-20)
Re: Compiler writers will love this language lex@cc.gatech.edu (Lex Spoon) (2003-06-25)
Compile-time garbage collection (was Re: Compiler writers will love th dobes@dobesland.com (Dobes Vandermeer) (2003-07-02)
Re: Storage management, was Compile-time garbage collection (was Re: dobes@dobesland.com (Dobes Vandermeer) (2003-07-04)
Re: Compile-time garbage collection (was Re: Compiler writers will l vbdis@aol.com (2003-07-13)
Re: Compile-time garbage collection (was Re: Compiler writers dobes@dobesland.com (Dobes Vandermeer) (2003-07-17)
Re: Compile-time garbage collection (was Re: Compiler writers will joachim.durchholz@web.de (Joachim Durchholz) (2003-07-17)
| List of all articles for this month |
From: Dobes Vandermeer <dobes@dobesland.com>
Newsgroups: comp.compilers
Date: 2 Jul 2003 00:45:30 -0400
Organization: Compilers Central
References: 03-05-211 03-06-015 03-06-054 03-06-057 03-06-078 03-06-112
Keywords: storage
Posted-Date: 02 Jul 2003 00:45:30 EDT

Lex Spoon wrote:
>
> ericmuttta@email.com (Eric) writes:
>
> > mwotton@cse.unsw.edu.au (Mark Alexander Wotton) wrote
> >> On 5 Jun 2003 23:22:01 -0400, Eric posted:
> >> >
> >> > I am having difficulty imagining a type which is implemented using
> >> > pointers and ensures that null cant occur. This would imply that for a
> >> > variable of such a type, memory would be allocated and then never
> >> > released.
> >>
> >> Either that, or only released when all references to it have passed
> >> out of scope. This is how many modern garbage-collected language
> >> implementations work.
> >
> > I admit, reference-counting has its problems and I have been toying
> > around with an idea for what I call "compile-time
> > reference-counting". Basically, I am looking for a set of rules,
> > that will allow the compiler to figure out when to release memory
> > for an object, *without* having to allocate memory space for a
> > reference counter value. Instead, using these rules, the compiler
> > can analyse code at compile time and statically work out the
> > life-time of an object. Its a bit wishy washy at the moment but if
> > its at all possible, I will write a paper on it :)
>
> Be sure to look up existing work. I'm certain that people have worked
> on this kind of thing.


I've been looking around for something similar, the most I've found is
this paper:


Ran Shaham, Eran Yahav, Elliot K. Kolodner, and Mooly Sagiv,
Establishing Local Temporal Heap Safety Properties with Applications to
Compile-Time Memory Management. To appear in the 10th Annual
International Static Analysis Symposium (SAS '03) San Diego, California,
USA, June 2003.


Available from the author's web page at
http://www.math.tau.ac.il/~ransh/ (direct:
http://www.math.tau.ac.il/~rans/sas03-safety-mm.pdf )


This paper has some references, but its


Of course, if you think about it a little, you might expect that each
conditional test (in the run-time code) will follow the format:


for each live possible referencor X of Y:
      if Y is referenced by X, Y is still alive, otherwise Y can be freed.


The problem lies in determination of the list of referencors.


For data structures that are globally accessible, you might be able to
calloect a list of possible referencors for a given object by just
annotating each function input/output with escape information.


For local variables, you can pass along information about which objects
that will be checked by the called functions are (or are not) referenced
further up, and you'll only get into real trouble with recursive
functions, where the size of this information is possibly unbounded (and
possibly difficult to determine before they are called).


Brute force would eventually produce a program that runs with very good
memory use, even if it was very very slow. Once you have it working you
can starting improving.


Everything starts to crumble as soon as you consider adding threads to
the model, though. How can you account for the state of other threads
in your tests? Every idea so far falls apart -- suddenly you have to
have this referencing information stored globally somewhere -- maybe
with the object? Maybe reduced to a simple counter for performance?
Sigh....


If I had time I would implement the non-threaded version and see how bad
the performance really is... if its less than 100 times as slow, it
would be a useful tool for measuring the real memory overhead of GC. I
think you could even adapt the algorithms to ignore variables which can
never be used again, which is as close to optimal memory usage as you
can get. (I suppose with optimal memory usage you would predict which
objects _will_ never be used again -- which requires foreknowledge of
the external inputs that affect the program's behavior).


Post a followup to this message

Return to the comp.compilers page.
Search the comp.compilers archives again.