simple modules

Brendan Eich brendan at mozilla.com
Wed Feb 3 12:45:16 PST 2010


On Feb 3, 2010, at 11:10 AM, Kevin Curtis wrote:

> Is there a fundamental theoretical comp sci reason why module state  
> is shared?

Sam knows more about such things than I do, but my answer is "who  
cares?" :-P Computer scientists and programming-language theorists do  
not all agree on whether to countenance mutation, and if so, how to  
handle it. But it is part of JS, and it's not going away. The simple  
modules proposal starts with goals including:
   Be compatible with:

Security mechanisms and idioms
State isolation mechanisms
But being compatible with these things does not mean making them the  
only or default way.


> Is the core idea of using lexical scoping in the simple_module  
> proposal undermined by not having shared state.

Probably, since the rest of the language does not combine lexical  
scope and no-sharing by default.

More important: the core idea of "simple" modules is undermined.  
Lexical scope is great and all, but separate. You can use lexical  
scope and functions today to create singleton and multiple-instance  
state sharing patterns.

Switching to lexical scope in modules is important if you are trying  
to avoid stepping on your own, or your friends', toes -- especially  
for early error checking.

Switching to unshared state by default is neither necessary nor  
helpful to the simple_modules goal

  Total compatibility with non-module code

Many languages with second-class module systems and lexical scope do  
not make unshared the default. And you can control state sharing with  
orthogonal tools (more below), so this is not a deal-breaker.


> If not, could possibly non-shared state be the default behaviour.  
> And shared state modules - which share state within contexts - are  
> somehow marked as shared at module definition. e.g.
> module ModShared {
> "use shared" // or some mechanism to signify shared state

We've reached tentative agreement on how to subset the language so  
that stateless, zero-authority modules can be the only modules  
available to the secure subset, with anything powerful carefully  
introduced ("whitelisted", see my reply to Kris just now; of course  
whitelisting really is an overstatement, or over-broad statement in  
ocap/POLA terms; and no one proposes blacklisting in the subset  
language).

Let's not go back on this tentative agreement by trying to push the  
full language away from sharing of mutable lexically bound state. It's  
not going to fly in the simple modules proposal, because it removes  
simplicity.

Even if the only change were to require a module to self-declare itsel  
as "shared", to have teeth, that would mean the default (unshared)  
module cannot be imported N times, N > 1, and have mutable singleton  
state that it counts on. And that requires changes to the importing  
code, to keep track of or memoize the singleton. It does not merely  
change the way the shared-state module is defined. This approach  
really wants Ihab's emaker-style modules.

With simple modules as proposed, if you want emaker-style modules (a  
fine pattern), then use a function! JS already has first-class  
functions, and with ES5 Object.freeze, etc., there is no overriding  
need in the full Harmony language to wrap up the notion of module with  
constructor function so tightly just to make non-shared mutable state  
the default. Simplicity is best served by keeping primitives  
orthogonal and composable.

/be

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20100203/8956217e/attachment.html>


More information about the es-discuss mailing list