编译型语言

对于编译型语言,开发完成后需要将所有的源代码都转化为可执行程序,比如windows下的.exe文件, 可执行程序里面包含的就是机器码,只要我们拥有可执行程序,就能随时运行, 即: 一次编译,无限次运行
编译型语言一般不能跨平台,因为不同的操作系统对可执行文件的内部结构有着截然不同的要求(比如,不能将 Windows 下的可执行程序拿到 Linux, macos 下使)
源代码跨平台需要做一些代码层面的兼容处理,比如c语言中使用“睡眠”函数,在Windows 平台下该函数是Sleep(),在Linux平台下该函数是sleep()

解释型语言

对于解释性语言,每次执行程序都需要一边转化一遍执行,用到哪些源代码就将哪些源代码转化成机器码,用不到的不进行任何处理,每次执行时可能使用不同的功能,这个时候需要抓话的源代码也不一样,
相比编译型语言,解释型语言几乎都能跨平台,“一次编写,到处运行”,为什么能跨平台,是因为官方根据不同平台开发了不同的解释器,他们能将源代码识别出来并转成对于平台能够识别的机器码

执行流程

image.png

总结

类型 原理 优点 缺点
编译型语言 通过专门的编译器,将所有源代码一次性转换成特定平台(Windows、Linux 等)执行的机器码(.ext, .dwg)。 编译一次后,脱离了编译器也可运行,并且运行效率较高 可移植性性差,不够灵活
解释型语言 由专门的解释器,根据需要将部分源代码临时转换成特定平台的机器码。 跨平台性好,通过不同的解释器,将相同的源代码解释成不同平台下的机器码。 一遍执行,一转化,效率较低

思考:javaScript 是一门解释性语言吗?

按照解释定义:javaScript是在运行时被解释器编译成机器码的,所以它属于解释型语言,疑惑是

  1. js是解释型语言,但是有变量提升
  2. JIT(及时编译),会做代码优化

一般解释型语言无法做到这些

解释:变量提升

在函数作用域内,任何变量,函数都会被提升到顶部,但是并不会对其进行初始化
注意: 变量提升函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用域顶部

为什么会有变量提升?

  1. function fn1() {
  2. fn2()
  3. }
  4. function fn2() {
  5. fn1()
  6. }
  7. fn1()

如果没有变量提升,fn2没有