On Jan 15, 2013, at 3:46 PM, Mark S. Miller wrote:
> On Tue, Jan 15, 2013 at 3:27 PM, Allen Wirfs-Brock
> <[email protected]> wrote:
>>
>> On Jan 15, 2013, at 3:18 PM, Mark S. Miller wrote:
>>
>>> On Tue, Jan 15, 2013 at 3:03 PM, Allen Wirfs-Brock
>>>>
>>>>
>>>> To start with, WeakMaps uses ephemeron algorithms
>>>
>>> Not those with the hint. That's the point. Are you getting my
>>> messages? Are they unclear? Please ack even if you have no other
>>> response. Thanks.
>>
>> Sorry, where is this hint proposal described?
>
> My message in this thread at 1:54pm. Quoting
>
> Independent of this hint, wm.set(key, value) needs to make value
> reachable if wm *and* key are reachable. In the absence of this hint,
> to assess the space complexity of an algorithm expressed using
> WeakMaps, we may assume that the value is not made reachable any
> longer than that[1]. With the hint, we may only assume that the value
> does not outlive the key. It may very well outlive the WeakMap. This
> allows an implementation to use exactly the same implementation
> techniques internally for these wimply weak maps that we expect them
> to use for private symbols.
>
>
> [1] if not otherwise reachable of course
Ok, this paragraph was so dense I didn't realize it was the proposal...
Let me see if I can interpret. For situations like branding where the "has"
method is really all we care about you would implement the weak map as an
inverted data structure. The WM itself would have no internal state. It is
primarily an identify holder that the WM method can be invoked upon. Instead,
/every/ object that might to stored in such a WM must have as part of its
internal state a set whose member are the WM objects that logically hold that
object as a key. The WM "set" and "has" method are implemented as:
set(key, dontCareAboutValue) { $internalWMSet(key).set(this)}
has(key) {return $internalWMSet(key).has(this)}
where $internalWMSet(obj) is an internal method that provides access to an
encapsulated implementation level set object.
So, yes, this casts this use case of WeakMap into a mechanism that is
conceptually similar to how private Symbols would be used for branding. But,
at the expense of a lot more low level complexity in every object. Basically
every object must carry as part of its state an internalWMSet (or the ability
to dynamically acquire one when it is needed). An implementation might be able
to use the normal per object property store for the internalWMSet but to do so
it would have to internally allow WMs to be used as property keys and then to
filter them out from any normal property access or reflection operations.
Of course, ephemeron-based WM would still have to exist to deal with situations
where circular dependencies between keys and values are possible.
At the implementation object model level this all seems much more complex than
having non-reflected private Symbols. If we actually want implementations to do
this, we would almost surely have to explicitly specify such as I have a hard
time believe that any implementor would on their own decide to do this.
Conceptually, this scheme allows people to exclusively reason about their
abstractions in terms of Weakmaps. However, I don't see that as any sort of
advantage. Per-property WeakMap side tables could be used to represent all
object properties. But who wants to think about object instances as a bunch of
tables joined by a common key.
So, for me, this further demonstrated that the combination of WeakMaps to
handle circular registry dependencies and private Symbols to handle high
integrity per instance state is probably exactly the right combination of
features to be providing.
>>
>> Regardless, the original request for information about the GC impact of
>> using WeakMaps was presumably based upon the accepted WeakMap semantics.
>
> Are space reclamation expectations semantic? We never decided to make
> them normative. If we do, then yes. But the hint still has no
> semantics beyond their space reclamation semantics. This arguably make
> the hint simpler than private symbols.
>
> A note to avoid misunderstanding:
>
> I have been very careful in this thread not to advocate that we drop
> private symbols. But if we keep them, it should be on grounds other
> than performance. I am arguing here only that the performance argument
> is a red herring.
I believe that pragmatic performance implications are a fine thing to factor
into our design decisions. We are unlike to specify specification space
reclamation requirements but that doesn't mean we don't care or don't expect
implementors to make their best effort to be space efficient. In particular we
shouldn't specify things that we don't have a reasonable expectation that in
can be implemented reasonably efficiently by a typical ES implementor.
I think it is fine to argue that no reasonable ES implementor is likely to
spontaneously decide to implement WMs in the manner you describe above. If we
want that behavior we will have to specify it, and that isn't simpler than
private symbols.
Allen
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss