Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Node.js中解释和执行异步javascript?_Javascript_C++_Node.js_V8_Libuv - Fatal编程技术网

如何在Node.js中解释和执行异步javascript?

如何在Node.js中解释和执行异步javascript?,javascript,c++,node.js,v8,libuv,Javascript,C++,Node.js,V8,Libuv,最近我对Node.js的核心做了很多研究,我对Node平台的内部工作有一些疑问。据我所知,Node.js的工作原理如下: Node有一个用Javascript编写的API,它允许程序员与文件系统和网络之类的东西进行交互。然而,所有这些功能实际上都是由C/C++代码完成的,也是节点的一部分。这就是事情变得有点模糊的地方。因此,ChromeV8引擎的工作就是将javascript“编译”(解释?)成机器代码。V8是用C++编写的,JavaScript语言本身是由ECMA指定的,所以这些关键字和语言

最近我对Node.js的核心做了很多研究,我对Node平台的内部工作有一些疑问。据我所知,Node.js的工作原理如下:

Node有一个用Javascript编写的API,它允许程序员与文件系统和网络之类的东西进行交互。然而,所有这些功能实际上都是由C/C++代码完成的,也是节点的一部分。这就是事情变得有点模糊的地方。因此,ChromeV8引擎的工作就是将javascript“编译”(解释?)成机器代码。V8是用C++编写的,JavaScript语言本身是由ECMA指定的,所以这些关键字和语言的特征都是由它们定义的。这就引出了我的前几个问题:

>p>节点标准库如何与节点绑定进行交互,因为节点绑定是用C++编写的?< /p>
  • ChromeV8引擎如何在节点上下文中解释Javascript?我知道它使用了一种称为JIT的技术,这在一个类似的问题中提到:() 但这并不能解释如何在节点上下文中解释Javascript。Node附带的Chrome V8引擎是否与在Chrome浏览器上运行的引擎完全相同,或者是否已对其进行了修改以使用Node

  • 这就引出了我的下一个问题。因此,节点具有事件驱动、非阻塞IO的特点。它通过事件循环来完成这一过程,尽管它通常被称为“节点事件循环”,实际上是LIBUV库的一部分,它是一个设计用于提供异步IO的C++库。在高层,事件循环基本上是通过回调访问的,这是一个本机Javascript特性,也是选择Javascript作为节点项目语言的原因之一。下面是事件循环如何工作的示例:

    这也可以通过这个整洁的小网站进行现场演示: 假设我们的节点应用程序需要调用外部API。所以我们写下:

    request(..., function eyeOfTheTiger() {
       console.log("Rising up to the challenge of our rival");
    });
    
    我们对
    request
    的调用被推到调用堆栈上,我们的回调被传递到某个地方,在那里它一直保持到请求操作完成。当它这样做时,回调被传递到回调队列。每次清除调用堆栈时,事件循环都会将回调队列顶部的项推送到调用堆栈上,并在那里执行。此事件循环在单个线程上运行。出现问题的地方是当有人编写“阻塞”代码时,或者代码永远不会离开调用堆栈并有效地绑定线程。如果总是有代码在调用堆栈上执行,那么事件循环将永远不会将项目从回调队列推送到调用堆栈上,它们也永远不会被执行,本质上冻结了应用程序。这就引出了我的下一个问题:

  • 如果Javascript由ChromeV8引擎解释,那么什么“控制”代码推送到回调队列?libuv事件循环如何处理Javascript代码
  • 我发现这张图片是这个过程的一个演示:

    这就是我不确定Chrome V8引擎和libuv到底是如何相互作用的地方。我倾向于相信节点绑定促进了这种交互,但我不太确定如何实现。在上图中,NodeJS绑定似乎只与V8从Javascript编译下来的机器代码交互。如果是这样的话,我就不明白V8引擎是如何解释Javascript的,这样节点绑定就可以区分回调和要立即执行的实际代码

    我知道这是一系列非常深刻和复杂的问题,但我相信这将有助于澄清试图理解Node.js的人们的许多困惑,也有助于程序员在更基本的层面上理解事件驱动、非阻塞IO的优缺点


    状态更新:刚刚在Sencha会议上观看了一场精彩的演讲()。因此,在这个演讲中,演示者提到了V8嵌入的引导(),并讨论了C++函数如何暴露给JavaScript,反之亦然。它的工作原理是,C++函数可以被暴露到V8,也可以指定它希望如何将这些对象暴露给JavaScript,并且V8解释器能够识别出嵌入的C++函数并在找到与您指定的匹配的JavaScript时执行它们。例如,您可以将变量和函数公开给V8,而这些V8实际上是用C++编写的。这就是Node.js的基本功能;它可以在调用JC++脚本时添加诸如<代码>要求/CODE的函数,这些代码实际上在调用C++代码时执行。这稍微澄清了问题1,但并没有确切说明节点标准库如何与V8配合使用。关于libuv是如何与这些相互作用的,目前还不清楚。

    基本上,你要寻找的是。它将所有C++代码公开为可以从V8虚拟机中调用的JavaScript函数。当调用函数或访问特定对象属性时,可以将C++回调关联(读<强> < /强>和<强> < /强>)。< /P> 我发现一篇很好的文章解释了这一切-。它还解释了libuv如何与Node一起工作以实现异步性


    希望这有帮助

    试图回答你的问题,我相信你在寻找的是这个-。它基本上将所有C++代码公开为可以从V8 VM调用的JavaScript函数。您可以使用称为“访问器”回调的东西定义C++回调。每当代码访问对象的特定属性时,就会调用它。有一篇非常好的文章解释了所有这些——非常棒的资源。你想写一个正式的答复来获得赏金吗?当然。我还没试过做什么