6

这种说法我听过很多次,但我个人认为这不太合理。我认为人们将 JavaScript 作为一种语言规范和实践中的 JavaScript(浏览器、Node 等)混淆了。当然,在大多数情况下,JavaScript 都是在单线程环境中执行的;但是 AFAIK 语言规范中没有任何内容要求它如此。我认为这就像说 Python 是“解释的”,而实际上它完全是实现的问题。

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

4

3 回答 3

7

通过 JavaScript,您似乎是指 ECMAScript。

浏览器中已经有了多线程,由webworkers 构建,并且基于数据的强隔离:workers 只通过消息传递进行通信,没有任何东西是共享的。

如果您想要更复杂的多线程和数据共享,那么现在看起来不可能。ECMAScript 中没有任何内容明确禁止多线程,但如果没有,您就无法进行多线程

  • 创建“线程”的设施(一般意义上,可能是协程)
  • 用于同步访问的互斥锁和设施
  • 低级别支持以确保例如在同时访问的情况下属性更改不会破坏数据。当前的引擎都没有被设计成具有这种强度(是的,其中一些支持多线程,但是是隔离的)。

ECMAScript 并未设计为包含多线程这一事实足以阻止目前支持它(除了已经完成的消息传递隔离多线程,但它是一种非常有限的多线程)。

你必须意识到

  • 数据共享多线程非常昂贵(甚至不谈论 DOM 上的同时操作)
  • 你很少会在 JavaScript 中使用它

为什么我说你很少使用它?因为大部分 IO 阻塞任务(文件读取、请求、db 查询等),大部分低级任务(例如图像解码或页面渲染),大部分 UI 管理(带有事件队列),大部分调度(超时和间隔)是在外面为您完成的。

于 2013-07-09T07:54:49.523 回答
2

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

于 2013-07-09T07:52:01.173 回答
1

AFAIK nothing in the language specification requires it to be so.

In TC39 it says:

At any point in time, there is at most one execution context per agent that is actually executing code.

That appears to me to be the crucial guarantee that you never have to synchronize access to variables in ECMAScript. Which is what I expect is meant when someone says a language is single-threaded.

Of course, most ECMAScript host environments use more than one thread in their host environment implementation for things like garbage collection, etc. And, ECMAScript itself allows for multiple separate contexts of execution that could each be driven by their own thread--though the standard makes it clear you could also just drive all of them with the same thread.

The point, again, is you never have to protect any ECMAScript variable with a mutex, semaphore, or the like (which is why ECMAScript provides no such facilities) since the language promises there will never be two threads of control with simultaneous access to the same context.

I don't know of any JavaScript implementation that violates this promise either, though there certainly could be.

于 2020-05-30T04:35:28.317 回答