> On May 15, 2017, at 3:00 AM, Florent Bruneau via swift-evolution 
> <swift-evolution@swift.org> wrote:
> I may simply have missed something, but I'm not sure to understand why the 
> proposal adds user-facing restrictions instead of using a fallback from 
> static to dynamic enforcement in case of violation of the NRR/NPCR rules 
> (maybe with an additional warning).

Three reasons.

The first is that it's much simpler for both users and the compiler if there is 
a bright-line rule guaranteeing that static enforcement will be used.  A 
programmer trying to understand "why is this slower" or "why is this problem 
only checked at runtime" should not have to understand the language 
implementation well enough to examine their code and e.g. deduce that the 
problems is that they made an un-inlineable call during an access within a 
closure and the compiler couldn't prove that that didn't lead to a re-entrant 
access and so it fell back to dynamic enforcement.  Paring back dynamic 
enforcement to the same cases where we need to allocate variables on the heap 
is far more straightforward to explain and understand.

The second is closely related, which is that it preserves the ability to have a 
subset of the language which doesn't need dynamic allocation or enforcement.  
This sort of performance and semantic guarantee is important in a number of 
situations, from audio programming to low-level systems work.  You could 
imagine having a special scope, or even a compiler flag, that mandates staying 
within that subset.  But you wouldn't want that flag to change the dynamic 
behavior of the program or rely for correctness on an assumption that the 
entire program, libraries included, are compiled with the flag.  And that ties 
in with the next point.

The final reason is that, when compilers get conservative, they get very 
conservative.  For example, we can only tell that the NPCR is being violated by 
looking at the function that takes the closures, not the one that creates them; 
but it's the latter function which decides what enforcement to use for its 
captured variables.  Statically detecting NPCR violations, therefore, basically 
requires the ability to inline every function to which we passed them — we 
don't actually have to do the inlining, but we do have to be able to see their 
definitions, which in many cases is not possible.  And most of the heuristics 
you might imagine we could use to statically prove that a closure can't be 
recursively invoked aren't actually valid.  So conservatively falling back on 
dynamic enforcement in closures really means doing it pervasively.

When you take those reasons and balance them against the patterns that are 
being restricted here — and really, they're still legal, you just have to mark 
one of the closures as escaping —it's not really a difficult choice.

John.

> 
>> Le 13 mai 2017 à 04:29, Ben Cohen <ben_co...@apple.com> a écrit :
>> 
>> Hello Swift community,
>> 
>> The review of revisions to SE-0176: Enforce Exclusive Access to Memory 
>> begins now and runs through May 17, 2017.
>> 
>> Most of this proposal was previously accepted.  An implementation issue has 
>> been discovered with the use of dynamic enforcement on inout parameters.  
>> The proposal implementors suggest adopting a stronger rule governing the use 
>> of non-escaping closures which will also allow Swift to make firm guarantees 
>> about the use of static enforcement when a variable does not escape.  The 
>> core team tentatively supports this new rule but believes it is a 
>> substantial enough revision that it requires a separate review period.
>> The proposal is available here: 
>> https://github.com/apple/swift-evolution/blob/master/proposals/0176-enforce-exclusive-access-to-memory.md
>> 
>> Since this is a review of revisions only, you may find these two relevant 
>> commits easier:
>> https://github.com/apple/swift-evolution/commit/d61c07df2f02bee6c00528e73fbe33738288179a
>> https://github.com/apple/swift-evolution/commit/5205a61f9cdca918d896269521bf89cb11e4aa12
>> 
>> Reviews are an important part of the Swift evolution process. All reviews 
>> should be sent to the swift-evolution mailing list at:
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> 
>> or, if you would like to keep your feedback private, directly to the review 
>> manager. When replying, please try to keep the proposal link at the top of 
>> the message:
>> 
>> Proposal link:
>> 
>> 
>> https://github.com/apple/swift-evolution/blob/master/proposals/0176-enforce-exclusive-access-to-memory.md
>> 
>> 
>> Reply text
>> 
>> Other replies
>> What goes into a review?
>> 
>> The goal of the review process is to improve the proposal under review 
>> through constructive criticism and, eventually, determine the direction of 
>> Swift. When writing your review, here are some questions you might want to 
>> answer in your review:
>> 
>>      • What is your evaluation of the proposal?
>>      • Is the problem being addressed significant enough to warrant a change 
>> to Swift?
>>      • Does this proposal fit well with the feel and direction of Swift?
>>      • If you have used other languages or libraries with a similar feature, 
>> how do you feel that this proposal compares to those?
>>      • How much effort did you put into your review? A glance, a quick 
>> reading, or an in-depth study?
>> More information about the Swift evolution process is available at:
>> 
>> https://github.com/apple/swift-evolution/blob/master/process.md
>> 
>> Thank you,
>> 
>> _______________________________________________
>> swift-evolution-announce mailing list
>> swift-evolution-annou...@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution-announce
> 
> -- 
> Florent Bruneau
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to