Built-in RAII in D
Moritz Maxeiner via Digitalmars-d
digitalmars-d at puremagic.com
Sun May 28 11:38:21 PDT 2017
On Sunday, 28 May 2017 at 17:34:30 UTC, Nerve wrote:
> Thanks to Walter Bright's recent comments at Dconf about memory
> safety, and my own lamentations about the continued use of C in
> all contexts where memory safety is crucial by overconfident
> programmers who believe they can do no wrong, I've decided to
> propose a baked-in RAII implementation for D.I would like to
> submit a DIP, but first I'd like to run it by the forum
> community and see what improvements need to be made, possibly
> due to my own naivety on the subject.
D already has baked-in RAII; acquire the resource in a
constructor, release it in a destructor. I assume you are
referring to object lifetime management?
> Phobos already has it, and there's the automem library by Atila
> Neves. However, I think the perception shift gained by baking
> in these features will benefit D enormously.
Phobos and automem provide mechanisms for object lifetime
management and some objects in Phobos use RAII (such as
std.stdio.File).
> D users can run around all day trying to convince people that
> different library implementations of RAII exist so one need not
> use the GC, but the only thing that is going to convince the
> programming world at large is a giant announcement on Reddit,
> HackerNews, and other places that "Hey, D has RAII now!" This
> will also drive many new eyes to the language that never would
> have looked otherwise.
To be clear:
- RAII is binding a resource's lifetime to an object's lifetime,
so that a resource leak can only occur when an object leak occurs
- D offers memory and object lifetime management via the GC in
druntime
- Phobos offers an advanced memory management framework via
std.experimental.allocator
- Phobos offers object lifetime management via
+ std.typecons.RefCounted: Reference counting
+ std.typecons.Unique: Single owner
However, since these are older than std.experimental.allocator,
they do not use the latter for managing the memory of their
objects
- automem offers object lifetime management with the same
RefCounted / Unique model as std.typecons, but with its memory
backed by the std.experimental.allocator framework
With regards to your popularity argument: IMHO the only people we
should concern ourselves with are those that evaluate which are
the right tools for their current task as objectively as feasible
given their respective circumstances, not those that are swayed
by whatever is the current hype on social site XYZ. But that's
just me.
>
> There are also the obvious syntactical benefits. Referencing an
> RAII object and its members would be literally no different
> than referencing a GC heap object. No need to fiddle with
> library constructs to extract one's reference.
This is what `alias this` exists for.
> [...]
>
>>@nogc void main()
>>{
>> auto refCountedObject = refcounted Object();
>>} // References go to 0, object is destroyed
To be honest I think this is no different to read than
---
@nogc void main()
{
auto refCountedObject = RefCounted!Object();
} // References go to 0, object is destroyed
---
which we already have for free thanks to templates.
> [...]
>
> I may be missing some things, but I've left out some exhaustive
> details since I'm sure many of you are already experienced in
> the subject and aren't looking for complete documentation in a
> proposal like this.
>
> Feel free to level criticism, and let me know if I should
> submit a DIP.
AFAICT all of your examples look (and work) pretty much the same
if you used templates. Only differences would be that each
`unique X(...)` becomes `Unique!X(...)`, analogous for refcounted.
All in all, I see little to no benefit to what you propose, while
requiring significant work on the language spec.
More information about the Digitalmars-d
mailing list