我正在编写一种用于教育目的的语言,该语言应该在Web浏览器中运行。该语言编译为JavaScript。
因此存在无限循环和递归的问题。 直到那一刻,我认为解决方案是将运行时实现为WebWorker和ui上的按钮,如果运行时间很长,则终止它。
我刚刚在测试我的语言时发现,通过调用runtime.terminate()
;
至少在他上一份工作完成之前,我还没有测试过如果完成会发生什么。即使在我到目前为止发现的文档中,它也声明它会立即停止执行。
因此,即使用户可以继续以这种方式工作,后台运行的工作人员也可能耗尽资源并导致至少一个没有响应的浏览器。
因此,我需要以任何方式在无限循环或递归的情况下终止执行,以响应用户事件。因为我没有找到任何方法让一个线程在JavaScript中睡觉,这也不起作用,或者是否有类似睡眠的网络工作者?
你有什么建议吗?
答案 0 :(得分:1)
我会这样做:
1)让编译器生成代码,使其不是从头到尾执行程序,而是将其分解为段 - 例如,循环体或函数体可以是段。
2)每个段应以timeoutId = setTimeout(nextSegment, 0)
结束。这允许Web worker在执行段之间接收和响应异步事件。
3)如果要终止Web worker,请使用window.postMessage()
向其发送异步消息。
4)在Web工作者中,有一个事件处理程序,在收到该消息后,执行clearTimeout(timeoutId)
。
答案 1 :(得分:0)
感谢您的回复,我已经考虑过这种方式,所以实际上我并不需要网络工作者。 所以这种方法的缺点是:
1)我必须将循环实现为递归函数调用...
更大的问题 2)段大小必须限制为一个命令,这种方法实际上是有效的,所以我必须将每个命令包装到一个调用下一个命令的函数中,这将是一个巨大的开销......
这就是为什么我在寻找方法,如果有的话?
答案 2 :(得分:0)
是的我正在编写编译器。
在研究这种方法时我必须提到,可能是用户的开销可能不大,但对编译的影响非常大......这就像在Javascript之上构建VM ... / p>
我得到的是,除了上述要点之外,我还需要:
- 需要一个复杂的索引系统来进行功能命名 - 关注变量分配 - 有系列地解决表达式 -...
这就是我寻找更优雅的变体的原因......