JavaScript 是如何运行的?
几乎每个人都听说过 v8引擎这个概念,大多数人都知道 JavaScript 是单线程的,或者它使用的是回调队列。
执行 JavaScript 代码所涉及的核心组件包括运行时环境和浏览器,他们内部如何工作呢?
- JavaScript Engine
- JavaScript Runtime Environment
- The Call Stack
- Concurrency and Event Loop
JavaScript 是一种解释性编程脚本语言,JavaScript 引擎就是一个执行 JavaScript 代码的计算机程序:解释器,当 JavaScript 文件在浏览器中加载时,负责逐行解析代码,将其转换为机器代码,然后执行它。
每个浏览器都有自己的 JavaScript 引擎,但最著名的是 Google 的 v 8引擎。V8引擎不仅为 Google Chrome 提供动力,还为 Node.js 提供动力,这就是 JavaScript 运行时。
引擎由两个主要组件组成:
- 内存堆(Memory Heap)ーー这是内存分配发生的地方
- 调用堆栈(Call Stack)ーー这是代码执行时堆栈帧的位置
Call Stack调用堆栈:计算模型:栈下推自动机,图灵等价。
JS是一种单线程的编程语言,这意味着它只有一个 Call Stack。因此,它可以一次只做一件事。并且不必处理在多线程环境中出现的复杂场景(例如,死锁)。
调用堆栈是一种数据结构,它基本上记录我们在程序中的位置。如果我们进入一个函数,我们把它放在堆栈的顶部。如果我们从一个函数返回,我们将从堆栈顶部弹出。
运行时
JavaScript 引擎并不是孤立运行的。它和许多其他组件一起运行在一个叫做JavaScript Runtime Environment 中。
JRE 负责JavaScript 的异步执行。组件包含:
- JS Engine, such as V8
- Web API
- Callback Queue or message queue
- Event Table
- Event loop
并发性和事件循环
虽然是单线程,为了处理多任务,需要并发交替执行,
并发、多线程、多进程、异步编程和事件循环等是一组相关概念,交织在PL和OS的中间。
首先,并发性是一个概念,它能够无序地处理多个任务。任务一般分为计算密集和读写密集。
real world,一个餐厅,一排人点菜后,后厨出菜就是无序的,有的菜工序复杂就得多等,这就是异步,同步就是先来后到一个个上完菜。
实现并发性的技术很多,包括多线程、多进程和异步编程。
异步编程, 比如node.js并发性 使用的异步 i/o,将 i/o 操作移交给操作系统内核,并将 i/o 操作的回调推迟。异步io这个任务就放在事件循环队列进行调度。
由此各组件基本解释一番。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/86466.html