Bounty for -minimal compiler flag

Denis Koroskin 2korden at gmail.com
Sat Feb 15 20:53:19 PST 2014


On Sunday, 16 February 2014 at 02:57:25 UTC, Steven Schveighoffer 
wrote:
> On Sat, 15 Feb 2014 07:33:04 -0500, Jakob Ovrum 
> <jakobovrum at gmail.com> wrote:
>
>> On Friday, 14 February 2014 at 15:56:16 UTC, Steven 
>> Schveighoffer wrote:
>>> Classes are typically written with an expectation that the GC 
>>> will clean them up. I don't think you can just get rid of 
>>> that expectation. A class written without the assumption of 
>>> the runtime is a very different object, and I would be 
>>> hesitant to name it 'class' in D.
>>>
>>> I recommend not supporting classes, at least for now.
>>>
>>> -Steve
>>
>> This applies to the `new` operator, not classes in general. 
>> Classes should be supported but not `new`.
>
> New is not the issue. The expectation, when I write my class, 
> that it will be cleaned up by the GC, is the issue.
>
> I remember this little nugget of paradox from the documentation 
> of classes:
>
> "This means that when the garbage collector calls a destructor 
> for an object of a class that has members that are references 
> to garbage collected objects, those references may no longer be 
> valid. This means that destructors cannot reference sub 
> objects. This rule does not apply to auto objects or objects 
> deleted with the DeleteExpression, as the destructor is not 
> being run by the garbage collector, meaning all references are 
> valid."
>
> So if you can write your class such that it will always require 
> manual deletion, it's OK to refer to other GC'd objects in the 
> destructor. Otherwise, it's not. Oh, and the runtime doesn't 
> tell you when you're in the GC :)
>
> This leads us to the fun problem:
>
> 1. Without a GC, a destructor is REQUIRED to clean up owned 
> resources that were (likely) malloc'd.
> 2. With a GC, a destructor is REQUIRED to NOT clean up owned 
> resources that were GC'd.
>
> How to write such a destructor?
>
> But, besides that point: most classes are written expecting the 
> GC to be used. They might possibly not use the new expression 
> internally (or any other banned expressions by this new 
> feature), and therefore compile. However, the expectation when 
> writing such a class is that the GC will clean up after it. 
> It's more the code that isn't there, than code that is 
> forbidden.
>
> If we allowed classes, we would have to have an "opt-in" 
> mechanism, so one can indicate to the compiler that it can be 
> used in this restricted mode (yes, compiler, I handle manual 
> destruction properly).
>
> I think that the best and quickest approach at this time is to 
> disallow classes. They are not trivial. If we can figure out a 
> clean way to add them back, then they can be allowed later.
>
> -Steve

Note that the same applies to classes with ARC (or other 
reference counting mechanism).


More information about the Digitalmars-d-announce mailing list