javascript事件监听器在汇编语言中编译成什么?

what do javascript event listeners compile to in assembly language

本文关键字:编译 什么 汇编语言 事件 监听器 javascript      更新时间:2023-09-26

我正在观察javascript事件侦听器的性能,并试图更好地理解它们。我的问题是事件监听器在汇编语言中是什么样子的,比如它编译成什么?同样,当javascript中的事件触发时,执行的汇编代码指令集是什么?不一定要寻找确切的x_86代码,但概述会很好,我似乎找不到任何在线。

很难看出你的问题有什么意义,原因有几个。让我解释一下这是如何工作的,然后也许你就会明白为什么你的问题没有一个直接的答案。

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

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

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

  1. JS代码调用elem.addEventListener("click", fn);
  2. 此代码调用本地对象elemaddEventListener方法。
  3. 由于addEventListener可能没有在javascript中实现(更有可能在"C/c++"浏览器中实现),代码经过接口层,其中参数被打包成正确的形式,并调用C/c++函数/方法。这个方法为每个对象维护一个事件处理程序列表。出于性能原因,该列表可能按事件类型组织。事件类型和要调用的JS函数存储在与特定DOM元素关联的列表中。
  4. 当特定DOM元素发生事件时,浏览器中的C/c++引擎会检测到该事件。然后,该引擎检查该DOM对象的事件处理列表,以查看是否有对该特定事件感兴趣的该DOM对象的任何事件处理程序。如果有,则设置调用事件处理程序。
  5. 再次调用处理程序的代码必须通过从C/c++返回到javascript世界的接口层。事件数据结构被构建和填充,然后用所有正确的参数调用事件处理器。
  6. 当事件处理程序返回时,同一DOM对象上的任何其他事件处理程序也会被调用。
  7. 如果这是一个正在传播的事件,并且事件传播还没有被任何事件处理程序阻止,那么该事件将通过父级向上传播,再次寻找匹配的事件处理程序来调用。
  8. 根据事件的类型,如果该事件存在默认行为(如点击链接)并且默认行为未被阻止,则执行默认动作(默认行为可能在传播之前)。

供参考,如果你想看浏览器的C/c++代码来处理事件处理,你可以去看看webkit或Firefox的源代码,因为它们都是开源的。但是,这只是机制的一部分,因为系统的其他部分、浏览器和JS解释器都涉及到。

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