On Sunday, 26 November 2017 at 18:58:04 UTC, jmh530 wrote:
On Sunday, 26 November 2017 at 08:49:42 UTC, Dmitry Olshansky wrote:

If all of the code is 100% @safe (not system and not trusted) you have a different language where write barriers would be cheaper to implement.

Sadly you can’t “skip” write barriers in your @system code because it may run as part of larger @safe. Which is where they are the most costly.

I was thinking you would use a generational or precise GC for @safe code and then fall back to the normal GC with @system/@trusted code.

Wishful thinking. Memory flows through a program and things allocated in @safe get passed to @system (including the last reference cases) and vise versa.

Also in D generational hypothesis may not bear as much value due to stack-allocation, libc heap allocations for temporaries likely via RAII. Not to mention cheap (thread-local) Ref Counting, C++ and many other language have to use atomics which makes RC costly.

Basically the GC heap is not all of the heap, so a young objects is even smaller part of that.

Lastly it is telling that new low-latency concurrent GCs do away without explicit generations.

I’m thinking a more efficient way to takle temporaries would be to add Regions to GC. So the moment you enter a region all GC things are allocated in a special segment, once you leave it free the segment. The last trick is to tweak memory protection as guard pages over it. Boom! Now if somebody touches it - DanglingPointerException :)

Not a panacea but:
- libraries using too much of GC can be controlled (unless they build global state)
- manual memory management without memory corruption
- fast bump allocation, which is what all of sensible VM languages do

And no need to create entire separate heap with its own generational schema.

Not sure if that's possible or not, but in my head it would be a separate heap from the @safe code.

And then I do append in @system on array allocated in @safe. Boom!

Certainly would be added complexity.


Reply via email to