[swift-evolution] [Proposal] Sealed classes by default
Karl Wagner
razielim at gmail.com
Mon Aug 15 11:09:42 CDT 2016
Yeah I know - that's why I said it would only work if we are okay with saying non-open != final, as a long-term decision. So the compiler won't devirtualize those calls.
As I understand it, that is how it works today - calls to non-open, non-final classes are still dynamically dispatched. There was a suggestion to make non-open == final, but that was expressly rejected.
Karl
Sent from my new Email (https://itunes.apple.com/app/apple-store/id922793622?pt=814382&mt=8&ct=my_new_email)
>
> On Aug 15, 2016 at 9:50 am, <Jean-Daniel Dupas (mailto:mailing at xenonium.com)> wrote:
>
>
>
>
> > Le 14 août 2016 à 20:43, Karl via swift-evolution <swift-evolution at swift.org (mailto:swift-evolution at swift.org)> a écrit :
> >
> >
> >> On 14 Aug 2016, at 11:17, John Holdsworth via swift-evolution <swift-evolution at swift.org (mailto:swift-evolution at swift.org)> wrote:
> >>
> >> Hi folks,
> >>
> >> I see from building the latest Swift-3.0 branch that I’m a little behind the times and this proposal has been accepted :(
> >>
> >> https://github.com/apple/swift-evolution/blob/master/proposals/0117-non-public-subclassable-by-default.md
> >>
> >> Is there no way we can revisit this decision? 60 emails on a mail group not read by the whole community
> >> doesn’t quite seem enough validation for such a significant change to me. Of those that expressed an
> >> opinion on the thread many were against sealing classes outside the module.
> >>
> >> https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160627/022364.html
> >>
> >> I personally feel it's a huge mistake for the following reasons:
> >>
> >> 1) it “breaks open source” reducing the reusability of third party software by default.
> >>
> >> 2) Contrary to arguments about the likely performance benefits of de-virtualisation of method dispatch it is
> >> likely to make Swift programs launch more slowly due to the dynamic linker having to slide large numbers
> >> of function pointers for most method calls (itself an expensive operation) whether a call is even made.
> >>
> >> On the first point it's an established technique in OOP to be able to subclass and override to adapt a class
> >> for a role perhaps it’s author never considered. Call this “monkey-patching” if you like but it is a part of being
> >> able to use open source libraries without having to make a fork as would be the case if sealed by default.
> >> Are we expecting developers to remember to leave their classes (and methods?) "open”? If they do feel
> >> that others shouldn’t subclass or override there was always “final". Distinctions about whether this is possible
> >> inside or outside a module seem a mute point to me.
> >>
> >> The second point is more of an engineering one. “Virtual” dispatch on Swift is not a significant overhead
> >> compared to fully dynamic dispatch on Objective-C which even then was seldom a problem. There is a
> >> cost however to de-virtualisation and resolving to a direct call to a method address in that the dynamic
> >> linker has to resolve and slide the pointer on load. This type of concern is a bad argument to use in
> >> designing a language anyway even if it is called Swift.
> >>
> >> Well, I know the boat has left on this one and I’ll likely have to live with it but this is the proposal I
> >> most disagree with on evolution this far. Programmers have morals and just because you shouldn’t
> >> do something doesn’t mean the language needs to turn that into can’t by default when the need arises.
> >> If this change does go ahead please try to get it into the next Xcode beta as it is a very incompatible one.
> >>
> >> Cheers,
> >>
> >> John
> >>
> >>
> >> _______________________________________________
> >> swift-evolution mailing list
> >> swift-evolution at swift.org (mailto:swift-evolution at swift.org)
> >> https://lists.swift.org/mailman/listinfo/swift-evolution
> >
> > It we are happy with non-open != final, I would be in favour of some kind of monkey-patching import attribute, similar to @testable, which allows you to subclass non-open classes at your own risk.
> >
>
> The non subclassable across module boundary is not just a compiler enforced limitation. Once you compile a module with classes that are ‘final’ in the module, the compiler may devirtualize all call sites in the module, or even inlining some calls, making subclassing unpredictable and pointless.
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160815/60a34939/attachment.html>
More information about the swift-evolution
mailing list