More radical ideas about gc and reference counting
Benjamin Thaut via Digitalmars-d
digitalmars-d at puremagic.com
Sun May 11 01:22:21 PDT 2014
Am 10.05.2014 19:54, schrieb Andrei Alexandrescu:
>
>> The next sentence goes on to list the advantages of RC (issues we have
>> wrestled with, like destructors), and then goes on to say the recent
>> awesome RC is within 10% of "the fastest tracing collectors".
>> Are you suggesting that D's GC is among 'the fastest tracing
>> collectors'? Is such a GC possible in D?
>
> I believe it is.
>
While it might be possible to implement a good GC in D it would require
major changes in the language and its librariers. In my opinion it would
be way more work to implement a propper GC than to implement ARC.
Every state of the art GC requires percise knowdelge of _all_ pointers.
And thats exactly what we currently don't have in D.
Just to list a few issues with implementing this in D:
1) Calling C-Functions would require some kind of pinning API for the
GC. But functions with C-calling convections are used ecessivly in
druntime. So a lot of uneccessary pinning would happen within d-runtime
just because of all the c-function hacks around the module system.
2) Most modern GC algorithms require write-barriers for pointers which
are on the heap. This is a major problem for D, because structs can be
both on the stack and on the heap. So if you call a method of a struct,
the compiler can not know if the write barriers are actually neccessary
(for heap based structs) or unneccssary (for stack based structs, e.g.
inside classes).
3) Generating percise information of the location of pointers on the
stack is going to be a major effort, because of structs, unions,
exception handling and Ds ability to move struct instances freely around
when dealing with exceptions.
4) As soon as you want to be fully percise you can not halt threads in
random points, you will need to generate GC points on which the
execution can be safely halted. This is going to require major effort
again if it should be done efficiently.
5) As Ds strings are immutable(char)[] they can not be allocated on a
thread local pool, because they must be freely shareable between
threads, and there is currently no way to detect via the type system
whean a immutable(char)[] is shared with another thread. So we would
need to design a system were the sharing of memory blocks would be
detected, so we could properly implement thread local GC pools. The same
issue applies to __gshared.
Honenstly, D doesn't currently have any GC support at all. The only GC
support we have is that the GC knows all threads and can halt them. And
D knows which function to call, to destroy class objects. So basically
we have the same level of GC support as C or C++. You could just use the
Boem GC, plug it into C or C++ and have a GC that is as good as the D one.
So having a good GC in 5 years or having ARC in 1 year isn't a decision
that is that hard for me.
Kind Regards
Benjamin Thaut
More information about the Digitalmars-d
mailing list