编译器和解释器
-
编译器
- 编译型语言在程序执行之前,需要经过编译器编译过程之后,生成机器能够读懂的二进制文件。这样在运行程序,就不需要再次重新编译了。
-
编译过程:
- 编译器首先依次对源代码进行词法分析、语法分析,生成抽象语法树(AST),然后是代码优化,最后再生成处理器能够理解的机器码。如果编译成功,则会生成一个可执行文件,如果编译发生语法或其他错误,编译器则会抛出异常,最后的二进制文件也不会生成。
-
解释器
- 解释型语言每次运行时,需要通过解释器动态解释和执行。
-
解释过程:
- 解释器会首先对源代码词法分析、语法分析,生成抽象语法树(AST),再基于抽象语法树生成字节码,最后根据字节码来执行程序,输出结果。
-
抽象语法树(AST)
- AST的结构与代码结构非常相似,可以理解是代码的结构化表示,编译器和解释器后续的工作都需要依赖于AST,而不是源代码。
-
生成过程:
- 第一阶段是分词(tokenize),又称为词法分析。其作用是将一行行源码拆解成一个个token。所谓token,指的是语法上不可能再分的,最小的单个字符或字符串。
- 第二阶段是解析(parse),又称为语法分析。其作用是将昂一步生成的token数据,根据语法规则转为AST。如果源码负责语法规则,这一步顺利完成。如果源码存在语法错误,这一步就会终止,并抛出一个语法异常。
-
字节码
- 解释器(lgnition)根据AST生成字节码,并解释执行字节码。
- 字节码是介于AST和机器码之间的一种代码。但是与指定类型的机器码无关,字节码需要解释器将其转化为机器码后才能执行。
-
即时编译(JIT)
- 解释器(ignition)执行字节码的过程中,如果发现有热点代码(Hotspot),比如代码被重复执行了很多次,这种就称为热点代码,那么后台的编译器就会把该段字节码转化为高效的机器码,当再次执行该段代码的时候,只需要执行编译后的机器码就可以了,这样就大大提高了代码的执行效率。
-
V8如何执行一段JavaScript代码
- 生成抽象语法树(AST)和执行上下文
- 生成字节码
- 执行代码
-
JavaScript的性能优化
- 提升单次脚本执行速度,避免JavaScript的长任务霸占主线程,这样使得页面快速响应交互;
- 避免大的内联脚本,因为在解析HTML的过程中,解析和编译也会占用主线程。
- 减少JavaScript文件的容量,因为更小的文件会提升下载速度,并且占用更低的内存。
此文章为4月Day9学习笔记,内容来源于极客时间《浏览器原理》,学习使我快乐,每天进步一点点💪💪
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net