计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言。
计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。而这种转换的方式有两种:编译和解释。
各自的特点:
编译型语言:第一次执行会经过编译器生成一个平台相关的机器语言文件,以后每次运行都是执行这个文件,效率高。
解释型语言:每次运行都逐行解析,效率低,跨平台性好。
两者过程大致如下:
主要讲JS的过程:
1.词法分析
就是将源码分成一个个的token,也就是最小单字符或字符串。就比如
var name = '张三' 会被分成
关键字 :'var' , 标识符:'name' , 运算符:'=' , 字符串:'张三' 这四个部分。
2.语法分析
也就是将上一步的结果进行语法规则的检测,有错误,这一步就会终止,并抛出语法错误。
3.生成AST
AST是一种和代码结构相似的数据结构。Babel和ESLint也是运用了AST的这个结构。
4.生成字节码
Chrome解释器Ignition会根据AST生成字节码,并且执行字节码。
之前的V8没有字节码这个过渡的码,而是直接把AST转换成 机器码 ,机器码占用内存特别大,随着手机的普及,内存占用问题越来越明显,为了解决,V8团队重构了引擎架构。
5.执行代码
解释器Ignition会执行之前的字节码,如果一段代码被多次执行了(热点代码),后台的编译器TurboFan会把这段字节码编译成更高效的机器码,这样大大提高了执行效率。
V8 的解释器和编译器的取名也很有意思。解释器 Ignition 是点火器的意思,编译器 TurboFan 是涡轮增压的意思,寓意着代码启动时通过点火器慢慢发动,一旦启动,涡轮增压介入,其执行效率随着执行时间越来越高效率,因为热点代码都被编译器 TurboFan 转换了机器码,直接执行机器码就省去了字节码“翻译”为机器码的过程。这种技术被称为即时编译(JIT)。Java 和 Python 的虚拟机也都是基于这种技术实现的。