I really like this, it's far better than how i was seeing Valhalla, pushing .ref into a corner is a good move.

Yes, we always disliked how prevalent .ref was; it took several rounds of "shaking the box" to get it to stay in the corner.

I still hope that moving from B1 to B2 can be almost backward compatible, if no direct access to the constructor, no synchronized and reasonable uses of ==.

Yes, this works out better than we had hoped it might; as you say, if B1 is value-based, it should be an "almost compatible" move to convert to B2.  Amazingly, it might even be "almost compatible" to go in the other direction too, something we'd almost given up on the possibility of.  Codes like a class, indeed.

The cost of this is, of course, that a B2 class gets less optimization than a B3 one (though more than a B1 one.)  Less heap flattening, more footprint, more null checks.  Though still substantial stack (calling convention) / IR (scalarization) flattening.  How we guide people to this is the next challenge.

My only concern now is the dual of Kevin's concern,
what if people discover that they always want to use the identitiy-free reference types (B2), because it is better integrated with the rest of the Java world and that in the end, the OG/pure primitive types (B3) are almost never used.

In other words: having solved the almost-impossible technical problems, we now face the harder pedagogical problem :)

I'm actually worried about the opposite, though!  I think its a bigger risk that people will use B3 over B2 "because performance", and put themselves in danger (e.g., tearing, unexpected zeroes) without realizing it.

Reply via email to