Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.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 - Fatal编程技术网

说JavaScript是一种“语言”是否准确;“单螺纹”;语言?

说JavaScript是一种“语言”是否准确;“单螺纹”;语言?,javascript,Javascript,这种说法我已经听过很多次了,但就我个人而言,我认为这没有什么意义。我认为人们混淆了JavaScript作为一种语言规范和JavaScript的实际应用(浏览器、节点等)。当然,在大多数情况下,JavaScript是在单线程环境中执行的;但是AFAIK语言规范中没有任何东西要求这样做。我认为这就像说Python是“解释的”,而实际上这完全是一个实现问题 那么,说JavaScript是一种“单线程”语言准确吗?多线程行为在HTML5和node.js中都可用,但JavaScript语言中没有本机线程A

这种说法我已经听过很多次了,但就我个人而言,我认为这没有什么意义。我认为人们混淆了JavaScript作为一种语言规范和JavaScript的实际应用(浏览器、节点等)。当然,在大多数情况下,JavaScript是在单线程环境中执行的;但是AFAIK语言规范中没有任何东西要求这样做。我认为这就像说Python是“解释的”,而实际上这完全是一个实现问题


那么,说JavaScript是一种“单线程”语言准确吗?

多线程行为在HTML5和node.js中都可用,但JavaScript语言中没有本机线程API,所以我想你的人为问题的答案(当然,我是说,以最好的方式)是“是的,Javascript是一种单线程语言。”

您所说的Javascript似乎是指ECMAScript

浏览器中已经有了多线程,它是基于数据的强大隔离而构建的:工作人员只通过消息传递进行通信,没有任何东西是共享的

如果您想要更复杂的多线程处理和数据共享,那么现在看来这是不可能的

  • 创建“线程”的工具(一般来说,可以是协同路由)
  • 用于同步访问的互斥体和设施
  • 一种低级支持,以确保在同时访问的情况下,例如属性更改不会破坏数据。当前没有一个引擎具有这种强度(是的,其中一些引擎支持多线程,但是隔离的)
ECMAScript没有被设计为包含多线程,这一事实足以阻止目前对其的支持(除了消息传递隔离多线程,正如已经做过的那样,但它是一种非常有限的多线程)

你必须意识到这一点

  • 数据共享多线程非常昂贵(甚至不包括DOM上的同步操作)
  • 您很少在JavaScript中使用它
为什么我说您很少使用它?因为大多数IO阻塞任务(文件读取、请求、数据库查询等)、大多数低级任务(例如图像解码或页面渲染)、大多数UI管理(使用事件队列)、大多数调度(超时和间隔)都是在外部为您完成的

AFAIK语言规范中的任何内容都不要求如此

信中说:

在任何时间点,每个实际执行代码的代理最多有一个执行上下文

在我看来,这是一个至关重要的保证,您永远不必同步访问ECMAScript中的变量。这就是我所期望的,当有人说语言是单线程的时候

当然,大多数ECMAScript主机环境在其主机环境实现中使用多个线程来执行垃圾收集等任务。而且,ECMAScript本身允许多个线程,每个线程都可以由自己的线程驱动——尽管标准明确规定,您也可以使用同一线程驱动所有线程

重点是,您永远不必使用互斥、信号量等保护任何ECMAScript变量(这就是ECMAScript不提供此类功能的原因),因为该语言承诺永远不会有两个控制线程同时访问同一上下文

我也不知道有哪种JavaScript实现违反了这一承诺,尽管肯定会有。

这可能是相关的,我想语言本身没有任何东西会阻止您创建多线程解释器