javascript事件监听器用汇编语言编译成什么

时间:2014-05-02 18:02:28

标签: javascript performance assembly web

我正在查看javascript事件监听器的性能并尝试更好地理解它们。我的问题是汇编语言中的事件监听器是什么样的,它编译的是什么?同样,当事件在javascript中触发时,执行的汇编代码指令集是什么。不一定要寻找精确的x_86代码,但概述会很好,我似乎无法在网上找到任何代码。

1 个答案:

答案 0 :(得分:4)

由于多种原因,很难看出你的问题有多大意义。让我解释一下这是如何工作的,然后你可能会明白为什么没有直接回答你的问题。

首先,javascript是一种解释性语言。它被解析为它自己的字节码,然后字节码由解释器执行。在某种程度上,你可以说它拥有自己的指令集而不是使用CPU指令集。有各种级别的字节码优化可以使事情尽可能快地完成,具体如何完成也会因实现而异。但是,足以说javascript没有完全编译到所有x86汇编指令中,如C或C ++。因此,没有确切的x86指令集唯一对应于给定的一组javascript。

其次,此处涉及的系统中有多个层。在最低级别,有操作系统,它的驱动程序和它的事件子系统创建这些事件,如mouseDown或keyDown。该代码可能用C / C ++编写,并已简化为汇编语言。一级,是位于操作系统之上的浏览器事件系统。这是与OS系统的接口,使网页中的控件实际工作并捕获实际事件。然后,更进一步的是javascript接口,它允许javascript脚本注册一个事件发生时将被调用的事件处理程序。

我们可以从概念上解释它是如何工作的,但不是在x86汇编指令级别。从概念上讲:

  1. JS代码调用elem.addEventListener("click", fn);
  2. 此代码调用本机对象addEventListener上的elem方法。
  3. 由于addEventListener可能没有在javascript中实现(更可能在" C / C ++"浏览器实现中),因此代码通过一个接口层,其中参数被打包成正确的形式,调用C / C ++函数/方法。
  4. 此方法维护每个对象的事件处理程序列表。出于性能原因,该列表可能按事件类型进行组织。要调用的事件类型和JS函数存储在与特定DOM元素关联的列表中。
  5. 当特定DOM元素发生事件时,将在浏览器的C / C ++引擎中检测到该事件。然后,该引擎检查该DOM对象的事件处理列表,以查看是否存在对此特定事件感兴趣的此DOM对象的任何事件处理程序。如果有,则设置为调用该事件处理程序。
  6. 再次调用处理程序的代码必须通过C / C ++的接口层返回到javascript世界。构建并填充事件数据结构,然后使用所有正确的参数调用事件处理程序。
  7. 当事件处理程序返回时,同样的DOM对象上的任何其他事件处理程序也会被调用。
  8. 如果这是一个传播的事件,并且事件传播没有被任何事件处理程序停止,那么事件将通过父项向上传播,再次查找匹配的事件处理程序以进行调用。
  9. 根据事件的类型,如果该事件存在默认行为(例如单击链接)并且未阻止默认行为,则执行默认操作(默认行为可能在传播之前)
  10. 仅供参考,如果您想查看用于处理事件处理的浏览器的C / C ++代码,您可以随时查看webkit或Firefox源代码,因为它们都是开源的。但是,这只是机制的一部分,因为系统的其他部分以及浏览器和JS解释器都参与其中。

    可以在此处找到许多webkit事件处理代码:https://github.com/WebKit/webkit/tree/e7207313fed4b7a2140c39f65d45e0f441731735/Source/WebCore/dom