Firefox源代码中的主事件循环在哪里?

时间:2017-05-05 22:15:41

标签: javascript firefox

我正在查看Firefox source code并尝试确定在Javascript中执行所有事件处理程序的主循环的源。

我查看了目录结构的this overview,但我仍然找不到事件循环。

我应该查看哪些源代码行来查找主事件循环?

更新:我在Linux x86_64上构建并运行Firefox。

1 个答案:

答案 0 :(得分:1)

免责声明:我在2014年至2015年期间在微软开发了Chakra JavaScript引擎。

Firefox的JavaScript引擎名为SpiderMonkey,可以被视为一个单独的项目 - 它也可以被其他应用程序使用(https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/How_to_embed_the_JavaScript_engine)。

现代JavaScript引擎基于JIT:他们不会在巨大的循环中解释代码 - 而是将JavaScript函数编译成本机代码 - 实际上是他们自己的程序,这个动态生成的程序将有自己的事件流 - 但它不一定是一个"循环" - 并且没有必要"一个"单个程序要么 - 因为它取决于JavaScript托管环境:一个网页可以运行多个JavaScript" worker"同时(充当不同的线程 - 这超出了JavaScript当前的异步模型)。另请注意" Firefox"只是Gecko的一个包装 - Firefox并行运行多个Gecko实例,并且在不同的运行时工作进程中运行。

也就是说,几乎所有的JIT JavaScript引擎仍然保留了他们的解释器--Chakra确实 - 因为JIT过程需要一段时间,所以他们最初会在解释模式下运行脚本以获得即时结果 - 并且引擎的解释器部分可能是这是一个完全独立的JavaScript引擎实现(忽略解析器和标准库组件)。

自从我上次使用Chakra源代码(it's open-source now)以来,差不多18个月,但是从我记忆中(并且没有打破我的NDA)开始,唯一真正的主要"循环&# 34;在Chakra中是解释器循环(当前操作码switch值的巨大enum语句) - 事件处理程序是通过异步IO处理的 - 所以它实际上由Chakra主机提供异步IO功能 - 简而言之,没有"事件循环"。如果Firefox的SpiderMonkey或Chrome的V8在相同的基础上没有工作,我会感到惊讶。