JavaScript是一门高级的编程语言
三个阶段:
浏览器的工作原理
浏览器内核
浏览器渲染过程
总共三个重要步骤:
刚开始书入ip地址,他会去招到服务器的一个入口文件,一般为index.html ,然后有以下的步骤:
dom树+css树===》layout (不同的浏览器的宽度效果等不一样,则需要重新布局)==》在汇编Painting
JavaScript引擎
作用:执行Javasript代码
为什么需要JavaScript引擎呢?
- 我们前面说过,高级的编程语言都是需要转成最终的机器指令来执行的;
- 事实上我们编写的JavaScript无论你交给浏览器或者Node执行,最后都是需要被CPU执行的
- 但是CPU只认识自己的指令集,实际上是机器语言,才能被CPU所执行;
- 所以我们需要JavaScript引擎帮助我们将JavaScript代码翻译成CPU指令来执行
浏览器内核与Js引擎的关系
V8引擎的原理
我们来看一下官方对V8引擎的定义∶
- V8是用C++编写的Google开源高性能JavaScript和WebAssembly引擎,它用于Chrome和Node,js等。
- 它实现ECMAScript和WebAssembly,并在Windows 7或更高版本,macOS 10.12+和使用x64,IA-32,ARM或MIPS处理器的Linux系统上运行。
- V8可以独立运行,也可以嵌入到任何C++应用程序中。
V8引擎架构图
parse 库是进行一个此法分析,将某行代码拆分为不同的value
例如:
Ts转化Js 和vue template的转化流程
抽象语法树不能跨平台直接把结果交给cpu,因为不同的环境(windows,mac)是不同的
lgnition是一个库,将ast转换成字节码,而字节码是跨平台的所以需要转化成字节码
TurboFan也是一个库,用于性能提升,他会去收集信息,比如多次运行了foo的函数,他将会给打个标识为hot,然后将hot的那部分变成优化的机器指令,不常用的方法就直接调用一次就可以
Deoptimization一旦执行的操作不一样,将我们的机器指令又转回到字节码
扩展:ts就是对num1,num2 的类型进行一个限制,所以就省略了变成字节码的那部分,直接生成了机器指令(运行效率高)
总结:
V8引擎解析图(官方)
通过ip地址到服务器拿到html 遇到js代码就会stream以流的形式,对编码的一些转换 UTF-8====>UTF-16 再到Scanner(作用是词法分析),转化成tokens,后面与上相同
PreParser预解析(优化性能)
inner函数没有必要转成===》AST结构===》bytecode===》运行