Le 04/09/2012 17:03, Glenn Maynard a écrit :
On Tue, Sep 4, 2012 at 4:23 AM, David Bruant <[email protected]
<mailto:[email protected]>> wrote:
The proposed solution here throws away all benefits of async code
to reduce the complexity of writing async code by... writing sync
code.
I wish we'd explore more solutions to make async more workable
rather than throwing away async.
It seems like you're thinking of asynchronous code as fundamentally
better than synchronous code. It's not; it has a set of
advantages--ones that the Web needs badly for the UI thread, in order
for scripts and the browser to coexist. It also has a set of serious
disadvantages.
Cognitive load is the only one mentioned so far. It is a serious issue
since for the foreseeable future, only human beings will be writing
code. However, as said, there are solutions to reduce this load.
I wish to share an experience.
Back in April, I gave a JavaScript/jQuery training to people who knew
programming, but didn't know JavaScript. I made the decision to teach
promises right away (jQuery has them built-in, so that's easy). It seems
that it helped a lot understanding async programming.
The cognitive load has its solutions.
We're not throwing away async; we're bringing sync back into the game
where it's appropriate.
True. I was exagerating a bit here :-)
The problem with blocking workers is that it may create a culture
of creating always more and more blocking workers (like Apache
creates more and more threads to handle more blocking connections).
You're not talking about this particular API here, you're talking
about every sync API in workers. Having sync APIs in workers and
performing blocking tasks in workers isn't something new.
This is one of the big reasons that we have workers at all.
I had never heard this argument before the topic of sync messaging
API for workers. Where does it come from?
When I read the worker API, I see a way to create a new
computation unit and to send messages back and forth, nothing
about writing sync code.
Regardless of goal, do people actually write more sync code with
workers?
The very first example in the spec is doing work synchronously.
http://www.whatwg.org/specs/web-apps/current-work/#a-background-number-crunching-worker
This is a very interesting example and I realize that I have used
"blocking" and "sync" interchangeably by mistake. I'm against blocking,
but not sync.
What I'm fundamentally (to answer what you said above) against is the
idea of blocking a computation unit (like a worker) that does nothing
but idly waits (for IO or a message for instance). It seems that
proposals so far make the worker wait for a message and do nothing
meanwhile and that's a pure waste of resources. A worker has been paid
for (memory, init time...) and it's waiting while it could be doing
other things.
The current JS event loop run-to-completion model prevents that waste by
design.
Taras Glek seems to think that the local storage API (which is
sync) is not a good fit for workers [3]:
"We could expose this API to workers, but then we run into an
ethical question of bringing crappy APIs to new environments."
(the article mentions that the localStorage API is synchronous as
part of the "crappy" aspect of it)
(The synchronous part is bad for the UI thread, but not a problem in
workers, so this isn't a very good argument, at least as summarized here.)
Many times such code relies on APIs or libraries which contain
blocking calls.
Do you have an example of that? I haven't seen one so far, but
that's an interesting point.
Specifically, I can't recall having seen any C/C++->JS example
that were doing IO (maybe files, but not network),
I believe that was his point--it's very hard to programmatically
convert synchronous code to asynchronous code.
True, but I mean, we could have read intentions or blog posts of people
saying "it's way too hard"
Technically it might be possible to automatically rewrite such
code to use asynchronous
coding patterns, but so far I don't think anyone has managed to do
that.
Naively, I would say, that once we've paid the price to compile
code from one language to another, you're not that far off from
compiling to a given coding pattern. Especially compiling from
LLVM bytecode.
Regardless, has anyone tried at all? Has anyone tried to compile
to JS+Promises or JS+task.js?
All of the compile-to-the-web movement started recently. Only now
do we start seeing what it can do. it's just the beginning.
Also, I wish the demand came from the people who do work on
Emscripten or Mandreel, that they came to standards mailing-list
saying "it took us a billion hours to compile I/O to JS correctly,
we tried promises, task.js and it didn't help. It would have taken
10 seconds if we had a sync API". But I can't recall having read
such a message yet. Compile-to-the-web is a complicated field and
I wish we didn't try to guess for them what they need before they ask.
I don't want to use a heavily layered environment that compiles to
JavaScript in order to write linear code.
I didn't recommend that in the part you're answering to. I was still
talking about Emscripten and Mandreel and such.
If I had a recommendation, it'd be to use promises.
I want the Web platform to be robust on its own, without complicated
systems piled up on top of it. Expecting that to be a solution is
just throwing in the hat and giving up. It's the "you don't need a
native API for that, just use a library" argument notched up several
orders of magnitude.
Eventually good library ideas get into standards. See querySelectorAll
or DOM4's .remove.
ECMAScript has a strawman to standardize promises. It won't make it to
ES6, but I have high hopes it will make it eventually.
David