Wait, the problem, and why it is important to solve

hh hh at hyperhh.de
Sun Jul 30 05:13:19 EDT 2017


Wow. You say (using stars) it would make sense to implement wait
in HTML5 for some features that do _not_ (yet) work in HTML5.
Will be a great enhancement side-effect. I look forward to that.

Peter-B already implemented wait in 2015, see bug #16076.
This caused an _additional_ slow down by a factor of 16 that was
*overall*, i.e. also in handlers not containing any form of wait.

We had since then, not counting browser improvements, a speed up
in the HTML5 engine by a factor of up to 8. So "wait" would cause
in sum (better: in product) a slowdown by a factor of at least 2.

The slow down compared to desktop standalones of the same source
was originally 15-20. so we would arrive for that comparison at
a slowdown of 30-40 by the HTML5 engine.

This is at about the same factor as with RaspberryPiB. RaspberryPi3
has a slow down factor of at about 10.

So the move of the HTML5 engine to WebAssembly may be a necessary
condition?


> Mark wrote:
> So LiveCode has long has this feature called 'wait' - it is one of those 
> seemingly innocuous things which, from the surface seems simple (it 
> allows you to wait for something - it's great when syntax is aptly 
> named!) however it is perhaps one of the deepest language features we 
> have.
> 
> I think there is some confusion (or puzzlement) as to why I am a little 
> hung up on it because, on the whole, the 'wait' command is not actually 
> seen in script that much. Certainly it is part of some people's coding 
> style (the one thing I love about LiveCode is that it promotes a very 
> pluralistic style to solving programming problems), but on the whole 
> many of us rarely if ever use it. Well, we *think* we don't use it.
> 
> The thing is that 'wait' is such an important feature to LiveCode that 
> many pieces of syntax use it without you knowing! The pure mathematician 
> in my likes classifying and counting things (hey its what we do!), so 
> here is a reasonably complete list of the places the engine uses it 
> (this list is alphabetic by source-file in the engine order):
> 
>     - it is used to provide the flash of the menu when a menu accelerator 
> key is pressed
>     - it is used to wait for uses of shell() to send back any data so it 
> can be accumulated for return
>     - it is used to wait for a return value from sending an AppleEvent on 
> Mac (send and request)
>     - *it is used to implement 'wait for/until/while ...' (kinda obvious, 
> but hey, I was trying to be semi-complete ;))*
>     - it is used to implement 'read ... with timeout' forms
>     - it is used to wait for process death when you do 'kill'
>     - *it is used to wait between beeps when you do 'beep <n>'*
>     - *it is used to moderate the speed of 'drag from x to y'*
>     - *it is used to moderate the speed of 'type STRING '*
>     - *it is used to moderate the time between mouseDown and mouseUp when 
> doing 'click at'*
>     - *it is used to wait whilst a non without-waiting form of 'move' is 
> invoked*
>     - it is used in the mobile browser control to wait for JavaScript 
> evaluation to finish
>     - it is used to wait for mobile calendar UI modal panes to return
>     - it is used to wait for mobile photo taking panes to return
>     - it is used to wait for mobile contact UI modal panes to return
>     - it is used to wait for mobile datetime/option picker modal panes to 
> return
>     - it is used to wait for mobile compose mail UI modal panes to return
>     - it is used to wait for mobile media picker UI modal panes to return
>     - it is used to wait for mobile fullscreen videos to finish
>     - it is used to wait for mobile text message UI modal panes to return
>     - it is used to wait inbetween vibrations when you use 'iphoneVibrate 
> <n>'
>     - *it is used to wait between frames for visual effects / 
> transitions*
>     - it is used in all forms of blocking socket commands (open, read, 
> write etc.)
>     - it is used to wait for blocking DNS resolution to finish*
>     - *it is used to wait for 'modal <stack>' to finish (by closing the 
> stack)*
>     - *it is used (in libURL) to wait for evaluation of 'url <url>' to 
> finish*
>     - *it is used (in libURL) to wait for 'post to url <url>' to finish*
>     - *it is used to wait for 'popup widget' to finish*
>     - it is used by various other things in externals, and widgets and 
> libraries to implement things which need to wait for something or some 
> time in order to have something to return
> 
> Phew! The ones surrounded by '*' are ones which would make some sense to 
> have working in HTML5. Almost all of these can be rendered in a form 
> without 'wait', they just end up being *slightly* less useful or easy to 
> use (e.g. get url -> load url, always use 'move without waiting', etc.).
> 
> So, first thing to point out, even without 'wait', if we manage to 
> implement all the existing things which make sense in the HTML5 engine, 
> 'greenfield' (new projects) will work fine (as you avoid the things 
> which don't work in HTML5), and a reasonable number of existing projects 
> (particularly ones which are already written to use 'load url' rather 
> than 'get url') will also work. However, there will still be a 
> substantial number of existing projects which will not, without 
> significant code changes.
> 
> One of the things we pride ourselves on is that (on the whole) an app 
> written on one platform will work, largely unchanged on all the others 
> (particularly if platform-specific features are avoided). However, we 
> can't really keep that mantra, if something such as 'wait' is abandoned 
> because it is deemed 'too hard to implement'. It means for any project 
> targetting HTML5, you have to write in a different style, and avoid a 
> reasonable number of features that many use day-to-day.
> 
> Now, if these features were 'just' things like 'drag' or 'click' or pick 
> any specific (non-general language feature) that we have things wouldn't 
> be too bad. However, 'wait' is a different kettle of fish altogether.
> 
> Wait is essentially LiveCode's implementation of 'async' - this is 
> something that C# has (which is a much newer language than LiveCode - 
> and its HyperTalk heritage); it is something JavaScript is in the 
> process of adding. The simple reason is that event-driven coding is so 
> ubiquitous these days (we've known its important for a long time) that 
> other languages are gradually catching up to the need to have some way 
> to do it easily.
> 
> Of course, async (i.e. wait) in LiveCode is not perfect - it is 
> recursive, and not side-by-side (or 'round-robin' would be another way 
> to put it) - and it is a little bit specific. However, on the whole, the 
> fact that it exists at all *and* the engine uses it in various commands 
> *does* simplify things.
> 
> So, 'wait' is important. Indeed, one of my hopes is that through getting 
> wait to work in HTML5, we will also be able to *then* improve wait to 
> bring it on par with other languages much more recent 'async' 
> implementations. Indeed, my hope is that we can get to a point that code 
> which needs to be written in a threaded/callback style now in LiveCode 
> could actually be written without callbacks - this is the goal of the 
> additions to JavaScript (due to node.js and its pure event-driven 
> nature) - and if they can do it without having had a 'wait' 
> implementation to build on, why can't we?
> 
> Anyway, the 'wait' beast in HTML5 has almost been slain (at least in 
> thought). I think we almost have a solution which will require modest 
> C++ code changes (which are doable without huge churn); and the rest can 
> be done as a process that transforms the scripts we write. It might be 
> upon further analysis, that another angle of attack actually makes more 
> sense - compiling the current syntax to a bytecode, and using a VM which 
> understands how to wait to execute it. To get performant code out, the 
> asyncify algorithm / process would still be needed at some point; so it 
> is merely a matter of ordering. At the moment, I *think* asyncifying at 
> the script level will take less time to engineer and thus gets us to a 
> fully compatible HTML5 engine quicker; however, we shall see what the 
> next few months bring.
> 
> Warmest Regards,
> 
> Mark.
> 
> P.S. One other possibility I've toyed with is doing LCS->BYTECODE, then 
> BYTECODE->ASYNCIFIED_JAVASCRIPT. The latter would be particularly easy 
> if targetting browsers which have already implemented the new async 
> JavaScript features. Since it looks like the HTML5 engine will only 
> become truly widely usable when we move to WASM, this might well be a 
> much more maintainable, and relatively quicker option.




More information about the use-livecode mailing list