Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.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
JavaScript执行引擎未指定?_Javascript_Multithreading_Node.js_Asynchronous_Ecmascript 5 - Fatal编程技术网

JavaScript执行引擎未指定?

JavaScript执行引擎未指定?,javascript,multithreading,node.js,asynchronous,ecmascript-5,Javascript,Multithreading,Node.js,Asynchronous,Ecmascript 5,我最近开始学习JavaScript。几个月来,我一直在和一起创建应用程序 让我困惑的一个主要方面是,如何能够用JavaScript编写异步代码,而不必担心这样的事情 因此,我发现了两篇有趣的文章(,),它们解释了如何保证我编写的任何代码都将始终由单个线程执行。总之,我所有的异步代码都被简单地安排在一个进程中的某个点上执行。这听起来很像操作系统调度器在一台只有一个处理器的机器上工作,其中每个进程都计划在有限的时间内使用处理器,这给了我们一种虚假的并行感。而回调将是这样的 这些文章没有提供任何特定的

我最近开始学习JavaScript。几个月来,我一直在和一起创建应用程序

让我困惑的一个主要方面是,如何能够用JavaScript编写异步代码,而不必担心这样的事情

因此,我发现了两篇有趣的文章(,),它们解释了如何保证我编写的任何代码都将始终由单个线程执行。总之,我所有的异步代码都被简单地安排在一个进程中的某个点上执行。这听起来很像操作系统调度器在一台只有一个处理器的机器上工作,其中每个进程都计划在有限的时间内使用处理器,这给了我们一种虚假的并行感。而回调将是这样的

这些文章没有提供任何特定的参考资料,因此我认为JavaScript执行引擎工作原理的最佳来源当然应该是语言规范,因此我获得了最新版本的

令我大吃一惊的是,我发现这里并没有指定这种执行行为。怎么会?这看起来像是浏览器和节点中所有JavaScript执行引擎的基本设计选择。有趣的是,我还没有找到一个地方可以为任何特定的引擎指定这一点。事实上,我不知道人们是如何发现事情是这样运作的,就像上面提到的那些书和博客中明确肯定的那样

所以,我有一套我认为有趣的问题。我希望任何提供见解、评论或简单参考的答案都能为我指明正确的方向,以理解以下内容:

  • 既然EcmaScript没有指定JavaScript执行引擎应该与事件循环一起工作,那么JavaScript的实现为什么会以这种方式工作,不仅在浏览器中,而且在Node.js中
  • 这是否意味着我可以实现一个新的JavaScript引擎,它与EcmaScript兼容,实际上提供了真正的多线程功能,具有同步锁、条件等特性
  • 如果我想执行一个CPU密集型任务,使用事件循环的执行模型是否会阻止我利用多核?我的意思是,我当然可以将任务划分成块(如其中一篇文章中所解释的),但这仍然是串行执行的,而不是并行执行的。那么,JavaScript引擎如何利用多核来运行我的代码呢
  • 您是否知道有任何其他知名来源正式指定了任何特定JavaScript引擎实现的这种行为
  • 如果我们不能假设一些关于执行环境的事情,那么代码如何能够在库和引擎之间进行移植
看起来问题太多了,也许这篇文章太宽泛而无法回答。如果它被关闭,我将尝试用不同的线程询问他们。但它们都围绕着这样一个事实:我想更好地理解为什么JavScript和Node设计有一个事件循环,如果在某个地方(除了浏览器源代码)指定了它,我可以阅读并更深入地理解这里的设计和决策,更重要的是,确切地知道什么是人们写书和发帖的信息来源

  • 事件循环与javascript本身无关,它是环境的一部分,而不是js引擎。由于javascript主要是为了操作用户界面而设计的,所以它在事件循环中被大量使用。但事件循环是UI实现的一部分,不仅在javascript中,而且在任何语言中都是如此

  • 是的,你可以。但它将不仅仅是引擎,更像是环境/平台。我认为(但不是很确定)你可以在Rhino中使用线程和相关的东西

  • 是的。在节点中,这通常通过生成更多进程来解决,在浏览器中,您可以使用WebWorkers

  • 我无法想象比规范更好的来源。如果没有什么东西,它就不是javascript的一部分(也称为EcmaScript)


  • 您做出的某些假设/弱参考导致您得出此结论。其中包括:

  • ECMAScript ECMA-XXX vs JavaScript vs JavaScriptEngine:

    ECMAscript是一种语言规范,由ECMA国际提供。JavaScript是使用最广泛的符合ECMAscript的web语言。大部分情况下,ECMAScript和JavaScript是同义的(记住还有ActionScript)。JavaScriptEngine是JavaScript语言代码的实现(解释器)。它是一个活生生的程序,与ECMAScript不同,ECMAScript只描述JavaScript的最终目标和行为,而JavaScript代码使用ECMAScript标准。您会发现,引擎不仅仅符合ECMAScript标准。它们处于规范/实现范围的末端。例如ECMA-262/JavaScript/V8

  • 浏览器中的事件循环与node.JS中的事件循环(JSEngine与JSEnvironment):

    这看起来像是浏览器和节点中所有JavaScript执行引擎的基本设计选择

    如果您使用的是node.JS,则可能使用了核心库fs/net/http。它们使用与libuv提供的事件循环挂钩的事件发射器。这是JavaScriptEngineV8的扩展,形成了node.JS平台。这里的事件循环涉及线程、套接字、文件或抽象请求等对象。但事件并非起源于这里。它最初是在浏览器中使用的。浏览器实现了一个DOM,它需要事件来处理HTML元素。请参阅DOM和为其实现的一个。它们使用事件,并且需要一个内置在JSEngine之上的浏览器Chrome将DOM接口添加到
    print(x); // Global print function prints to the console
    version(170); // Tell Rhino we want JS 1.7 language features
    load(filename,...); // Load and execute one or more files of JavaScript code
    readFile(file); // Read a text file and return its contents as a string
    readUrl(url); // Read the textual contents of a URL and return as a string
    spawn(f); // Run f() or load and execute file f in a new thread
    runCommand(cmd, // Run a system command with zero or more command-line args
    [args...]);
    quit() // Make Rhino exit