# 3-V8工作原理
# 01|栈空间和堆空间:数据是如何存储的?
Javascript是一种弱类型、动态的语言。
栈空间: 原始类型(赋值会赋值变量值);
堆空间: 引用类型(引用类型的赋值是复制引用地址)
# 为什么所有数据不可以都放到栈中?
javascript引擎需要用栈来维护程序执行期间上下文的状态。,如果栈空间大来的话,所有的数据都存放在栈空间里面, 那么会影响到上下文切换的效率,进而又影响到整个程序的执行效率。
# 02|垃圾回收:垃圾是如何自动回收的。
调用栈:当一个函数执行结束之后,Javascript引擎会通过向下移动ESP来销毁该函数保存在栈中的执行上下文;
ESP:记录当前执行状态的指针
堆内存:
基于分代式,分为新生代和老生代。存活时间长短。
新生代:scavenger;1-8M的容量。两次垃圾回收依然还存活的对象,会被移到老生代。 老生代:mark-compact;mark-sweep;
# 03|编译器和解释器:V8是如何执行一段javascript代码的?
# 编译器和解释器:
因为机器不能直接理解我们的所写的代码,所以在执行程序之前,需要将我们所写的代码"翻译"成机器能读懂的机器语言。
按照语言的执行流程,可以把雨呀分为编译型语言和解释型语言。
# V8如何执行一段javascript代码
- V8依据javascript代码生成AST和执行上下文。
- 基于AST生成字节码
- 通过解释器执行字节码
- 通过编译器来优化和编译字节码