Ah, now that I see the CGPoint example, I understand. Thanks! Ya, the “hard” user-experience model I brought up feels wrong for CGPoint, etc. (For non-Apple people, CGPoint is a struct of two doubles on 64-bit machines add two floats on 32-bit machines.)
It wasn’t obvious to me from context that @fixedContents wasn’t / isn’t for people trying to design a comprehensive ABI (disk, wire, etc), but just the machine specific in memory ABI. I wish the name was better, but nothing better seems obvious. (“@inMemoryABI”?) Dave > On Sep 6, 2017, at 13:11, Jordan Rose <[email protected]> wrote: > > I'd be okay with allowing the ABI attributes to control ordering, but I would > definitely not require them on every fixed-contents struct. We hope making a > struct fixed-contents isn't something people have to do too often, but we > don't want to drop them all the way into "hard" land when they do it. That > is, "CGPoint" can't already be "hard mode". > > Jordan > > >> On Sep 6, 2017, at 05:13, David Zarzycki <[email protected] >> <mailto:[email protected]>> wrote: >> >> Hi Jordan, >> >> I really doubt that “belt and suspenders” ABI attributes would drive people >> to C, but reasonable people can certainly disagree on that. >> >> Bertrand, when he was at Apple, used to say that “easy things should be >> easy, and hard things should be possible”. >> >> I think ABI related attributes fall into the latter category. In particular, >> I think that trying to make ABI attributes too convenient only does >> programmers a disservice in the long run because most programmers aren't >> experts, and the cost of ignorance is huge when trying to do ABI design. >> >> With these thoughts in mind, I think that is reasonable for the language to >> say: “If you want explicit control over a dimension of ABI decisions, then >> you must deal with all of the associated complexity. Here is a pointer to >> the documentation on dimension X that you were/are trying to explicitly >> manage. If that is ’too hard’ for you, then you probably shouldn’t be >> locking down this dimension of complexity yet.” >> >> Dave >> >>> On Sep 5, 2017, at 20:11, Jordan Rose <[email protected] >>> <mailto:[email protected]>> wrote: >>> >>> Hm. This is definitely an option, but I don't think it's really an >>> acceptable user experience. This feels like it'll drive people all the way >>> to declaring their types in C because Swift makes it too hard. >>> >>> We do expect to have a tool to diff old and new modules at some point, but >>> we could do something even simpler here: make a public symbol with the >>> struct's layout in its name. That way, even 'nm' can tell if the symbol >>> disappears. (Of course, public symbols do have a small cost, since this >>> might not actually be the best idea.) >>> >>> Another idea would be to restrict @fixedContents to require that all stored >>> properties appear contiguously in the struct, possibly even pinned to the >>> top or bottom, to indicate that order's not completely arbitrary. Again, >>> that's just an improvement, not full protection. >>> >>> Jordan >>> >>> >>>> On Sep 5, 2017, at 13:00, David Zarzycki <[email protected] >>>> <mailto:[email protected]>> wrote: >>>> >>>> Hi Jordan, >>>> >>>> Thanks for thinking about this. For whatever it may be worth, I’m >>>> concerned about 1) the ability to reorder declarations and 2) the >>>> “either/or” nature of this proposal. >>>> >>>> First, reordering: The ability to reorder declarations is deeply ingrained >>>> into the subconsciousness of Swift programmers and for good reasons. I >>>> think adding localized declaration order sensitivity is likely to be very >>>> brittle and regrettable in the long run. I also think this problem is made >>>> worse by having a type declaration context attribute because it can easily >>>> get lost in the noise of nontrivial declarations. The net result is that >>>> people will frequently forget about local order sensitivity. Yes, the >>>> compiler can engage in heroics and compare the previous module ABI and the >>>> new module ABI for conflicts, but that seems risky, complex, slow, and >>>> differently error prone. >>>> >>>> Second, the “either/or” nature of this proposal: What do you think about a >>>> lightweight “belt and suspenders” solution whereby @fixedContents requires >>>> that stored properties be lightly annotated with their layout order? For >>>> example: >>>> >>>> @fixedContents(3) struct Foo { >>>> @abi(0) var x: Int >>>> func a() { >>>> // a thousand lines of ABI layout distraction >>>> } >>>> @abi(1) var y: Double >>>> func b() { >>>> // another thousand lines of ABI layout distraction >>>> } >>>> @abi(2) var z: String >>>> } >>>> >>>> That would enable both renaming and reordering, would it not? This >>>> approach would also aid the compiler in quickly detecting hastily >>>> added/deleted declarations too because the count of @abi([0-9]+) >>>> declarations wouldn’t match the number passed to @fixedContents. >>>> >>>> Dave >>>> >>>> >>>> >>>>> On Sep 5, 2017, at 14:59, Jordan Rose via swift-dev <[email protected] >>>>> <mailto:[email protected]>> wrote: >>>>> >>>>> Hey, all. In preparation for the several proposals we have to come this >>>>> year, I cleaned up docs/LibraryEvolution.rst >>>>> <https://github.com/apple/swift/pull/11742> a little bit based on what's >>>>> changed in Swift 4. This is mostly just mentioning things about generic >>>>> subscripts, but there is one issue that I remember John bringing up some >>>>> time in this past year: once you've made a struct fixed-contents, what >>>>> can you change about its stored properties? >>>>> >>>>>> To opt out of this flexibility, a struct may be marked '@fixedContents'. >>>>>> This promises that no stored properties will be added to or removed from >>>>>> the struct, even non-public ones. >>>>> >>>>> Interestingly, this means that you can have non-public members of a >>>>> fixed-contents struct. This is actually pretty sensible: it's the >>>>> equivalent of a C++ class with non-public fields but a defaulted, >>>>> inlinable copy constructor. Any inlinable members can access these >>>>> properties directly as well; it's just outsiders that can't see them. But >>>>> if inlinable code can reference these things, and if we really want them >>>>> to be fast, that means they have to have a known offset at compile-time. >>>>> >>>>> Now, we don't plan to stick to C's layout for structs, even >>>>> fixed-contents structs. We'd really like users to not worry about >>>>> manually packing things into trailing alignment space. But we still need >>>>> a way to lay out fields consistently; if you have two stored properties >>>>> with the same type, one of them has to go first. There are two ways to do >>>>> this: sort by name, and sort by declaration order. That means we can >>>>> either allow reordering or allow renaming, but not both. Which do people >>>>> think is more important? >>>>> >>>>> At the moment I'm inclined to go with "allow renaming" just because >>>>> that's what C does. It's not great because you're allowed to reorder >>>>> nearly everything else in the language, but there's a "least surprise" >>>>> principle here that I think is still useful. It'd be surprising for the >>>>> name of a non-public property to affect your library's ABI. >>>>> >>>>> (In theory we could also make different decisions for public and >>>>> non-public fields, because it's much less likely to want to change the >>>>> name of a public property. But you could do it without breaking source >>>>> compatibility by introducing a computed property at the same time as you >>>>> do the renaming. It's up to us whether that should break binary >>>>> compatibility or not.) >>>>> >>>>> >>>>> Note that because the layout algorithm isn't public, Swift isn't going to >>>>> allow the thing from C where you have an existing field and you split it >>>>> into two smaller fields. You can use computed properties for that >>>>> instead. (Strictly speaking this probably isn't even good C because the >>>>> fields in your struct can affect by-value calling conventions.) >>>>> >>>>> >>>>> By the way, I'm putting this on swift-dev because we're nowhere near a >>>>> proposal and I want to keep the discussion narrow for now, but of course >>>>> this point will be called out when the fixed-contents attribute—whatever >>>>> its final form—goes to swift-evolution for a proper review. >>>>> >>>>> Thanks! >>>>> Jordan >>>>> _______________________________________________ >>>>> swift-dev mailing list >>>>> [email protected] <mailto:[email protected]> >>>>> https://lists.swift.org/mailman/listinfo/swift-dev >>>>> <https://lists.swift.org/mailman/listinfo/swift-dev> >>>> >>> >> >
_______________________________________________ swift-dev mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-dev
