User model stacking
Brian Goetz
brian.goetz at oracle.com
Tue May 3 22:17:29 UTC 2022
> Just so we don't lose this history, a reminder that back when we settled on the 3 buckets, we viewed it as a useful simplification from a more general approach with lots of "knobs". Instead of asking developers to think about 3-4 mostly-orthogonal properties and set them all appropriately, we preferred a model in which *objects* and *primitive values* were distinct entities with distinct properties. Atomicity, nullability, etc., weren't extra things to have to reason about independently, they were natural consequences of what it meant to be (or not) a variable that stores objects.
Indeed; it is often a process of "spiraling", where we seem to return to
places we've already been, but perhaps in a lower energy state. We came
by the earlier bucket model honestly, as it approximated the use cases
we envisioned as most important. I think its time to rethink the
three-bucket model, not because three is too big or small a number, but
because (a) the relationship between the buckets is complex, (b) it puts
users to some difficult choices between semantics and performance, and
(c) we have real concerns that hiding the permission to tear behind some
proxy (e.g., "non null" or "B3") will be too subtle and potentially
astonishing.
> That was awhile ago, we may have learned some things since then, but I think there's still something to the idea that we can expect everybody to understand the difference between objects and primitives, even if they don't totally understand all the implications. (When they eventually discover some corner of the implications, we hope they'll say, "oh, sure, that makes sense because this is/isn't an object.")
I think this is true for all the aspects _except_ tearing. I tried the
argument "it can tear because its not an object" on for size, and I just
can't imagine people not forgetting it routinely.
> My inclination would probably be to abandon the object/value
> dichotomy, revert to "everything is an object", perhaps revisit our
> ideas about conversions/subtyping between ref and val types, and
> develop a model that allows tearing of some objects. Probably all
> do-able, but I'm not sure it's a better model.
I don't think we have to go so far as this. Just as Valhalla questions
the previously-universal property of "all objects have identity", we can
play the same game with "all objects provide integrity guarantees"
(final field semantics.) Some classes can shed identity; some further
can shed the integrity requirements. (Both require a judgement on the
part of the class author.) We can then optimize accordingly.
By factoring out atomicity/integrity as an orthogonal semantic
constraint, we get to a lower energy state for B2 vs B3: "does this
class have a good zero". Complex does; LocalDate does not. And we get
to a simpler performance consequence of B3.ref vs B3.val: at most an
extra bit of footprint. These are both easier to understand.
More information about the valhalla-spec-observers
mailing list