Vision document for H1 2017

Andrew Browne via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Mon Jan 16 13:56:49 PST 2017


On Friday, 13 January 2017 at 04:02:38 UTC, Jonathan M Davis 
wrote:
> On Thursday, January 12, 2017 21:57:37 Andrew Browne via 
> Digitalmars-d- announce wrote:
>> On Wednesday, 4 January 2017 at 19:22:33 UTC, Andrei 
>> Alexandrescu
>>
>> wrote:
>> > We release a brief Vision document summarizing the main 
>> > goals we plan to pursue in the coming six months. This half 
>> > we are focusing on three things: safety, lifetime 
>> > management, and static introspection.
>> >
>> > https://wiki.dlang.org/Vision/2017H1
>> >
>> >
>> > Andrei
>>
>> Is there a design document for how D will achieve safety with
>> nogc?
>> How does D plan to prevent leaks, use-after-free, double-free
>> bugs when not using the GC?
>
> Part of the reason that we have the GC in D is because of the 
> safety guarantees that you can have with a GC that you can't 
> have with mechanisms like malloc and free. Some amount of @nogc 
> code can be @safe, but some of it will never be able to be 
> @safe. e.g. the very nature of malloc and free makes @safe 
> impossible in the general case.

This is why I ask. Because the vision document says

"2. @nogc: Use of D without a garbage collector, most likely by 
using reference counting and related methods Unique/Weak 
references) for reclamation of resources. This task is made 
challenging by the safety requirement."

It sounds like @safe @nogc code is the goal. I know it is 
challenging, I'd like to know if there is a plan/design for how 
to achieve this.

> It's trivial for a piece of code to free something that's 
> currently in use by other code. If they're constrained within a 
> ref-counting system, then @safety becomes more possible, but 
> even then, when you have to start worrying about stuff like 
> weak references in order to get around circular reference 
> problems, it gets dicey if not impossible to make it fully 
> @safe.

Yep, circular references are a difficulty of ref-counting. Is 
there a plan/design for how to handle this?

> It might be possible to guarantee safety if you have a whole 
> bunch of extra constraints like Rust does with its borrowing 
> stuff, but we're not going to add something like that to D, 
> because it's too complicated on top of everything else that we 
> already have.

So that level of safety is just not a goal of D? If I want memory 
safe code without a GC, should I just use Rust?

> I fully expect that certain idioms will be in place to help 
> maintain @safety in @nogc code, but to some extent, by 
> abandoning the GC, you're abandoning @safety - or at least 
> you're making a lot more of your code need to be @trusted, and 
> you can rely less on the compiler to guarantee @safety for you. 
> Taking the freeing of memory out of the hands of the programmer 
> like happens with the GC is _huge_ in guaranteeing the memory 
> safety of code.
>
>> Will @nogc also have first class support in the language?
>
> And what do you mean my first class support? Some features 
> require the GC, and I wouldn't expect it to ever be otherwise. 
> Giving up the GC means giving up on certain features. We don't 
> want that list to be longer that it needs to be, but some stuff 
> fundamentally needs the GC to do what it does.

That is what I meant. The next questions are examples of what I 
meant.

>> Afaik the GC is currently needed for language features like 
>> array concatenation. Will features like array concatentation 
>> still work with @nogc?
>
> I don't see how it possibly could given how dynamic arrays work 
> in D. It would have to have some sort of reference counting 
> mechanism, which would likely be a nightmare with slicing and 
> certainly does not at all play well with how low level D arrays 
> are. We may very well get some sort of ref-counted array type 
> that has concatenation, but it would be a library construct 
> rather than in the language, because it doesn't need to be in 
> the language, and the built-in arrays would not be affected by 
> it.
>
>> GC allocations have a keyword 'new' (afaik 'new' currently 
>> never means anything other than GC allocation). Will we be 
>> able to do @nogc allocations by the 'new' keyword?
>
> I very much doubt it. Constructing objects into memory is done 
> via emplace, which is a library construct, and there's really 
> no need for it to be in the language. As it is, if we were 
> doing things from scratch, new probably wouldn't even be a 
> keyword. It would likely be a library construct in druntime, 
> because D is powerful enough that new doesn't need to be in the 
> language to do what it does. And in general, at this point, 
> Walter and Andrei don't want to put stuff in the language 
> unless it actually needs to be there. If it can be done with a 
> library, it will be done with a library. The only reason that 
> they decided that we needed some sort of ref-counting mechanism 
> in the language is because they decided that it wasn't actually 
> possible to make it fully @safe without it being part of the 
> language. And even then, I'm not sure that the intention is 
> that the ref-counting mechanism use anything other than the GC. 
> It's not yet clear what it's going to look like, but 
> previously, the talk was using the GC to take care of circular 
> references, which would mean that the memory was still 
> GC-allocated even if it were ref-counted. We'll have to wait 
> and see though.
>
>> Is the same code always expected to work with/without @nogc?
>
> That would depend entirely on the code. 
> std.experimental.allocator has a GC allocator. So, code that is 
> designed around it could work with the GC or without. But the 
> whole mechanism of newing something up and then not worrying 
> about ownership which happens by default with the GC doesn't 
> play at all nicely with how memory has to be managed via other 
> mechanisms like malloc and free. I don't think that it's at all 
> reasonable to expect that code that is written with the idea 
> that its memory will be managed by the GC will also work 
> without the GC. Code that isn't managing memory directly 
> shouldn't care - and that's a lot of code (especially once lazy 
> ranges are in the mix) - but I think that it's pretty clear 
> that there's plenty of code that simply can't just swap out its 
> allocation mechanism and still work properly. In general, code 
> needs to be written with that in mind for it to work, and even 
> then, there are limits given how different various memory 
> management mechanisms are.
>
> - Jonathan M Davis

Yep, I know there are a lot of things that become hard to make 
safe without a GC.
That is why, I'd like to know what is a plan/design for achieving 
@safe @nogc code? What is not planned to be supported?


More information about the Digitalmars-d-announce mailing list