编译型语言
对于编译型语言,开发完成后需要将所有的源代码都转化为可执行程序,比如windows下的.exe文件, 可执行程序里面包含的就是机器码,只要我们拥有可执行程序,就能随时运行, 即: 一次编译,无限次运行
编译型语言一般不能跨平台,因为不同的操作系统对可执行文件的内部结构有着截然不同的要求(比如,不能将 Windows 下的可执行程序拿到 Linux, macos 下使)
源代码跨平台需要做一些代码层面的兼容处理,比如c语言中使用“睡眠”函数,在Windows 平台下该函数是Sleep(),在Linux平台下该函数是sleep()
解释型语言
对于解释性语言,每次执行程序都需要一边转化一遍执行,用到哪些源代码就将哪些源代码转化成机器码,用不到的不进行任何处理,每次执行时可能使用不同的功能,这个时候需要抓话的源代码也不一样,
相比编译型语言,解释型语言几乎都能跨平台,“一次编写,到处运行”,为什么能跨平台,是因为官方根据不同平台开发了不同的解释器,他们能将源代码识别出来并转成对于平台能够识别的机器码
执行流程
总结
类型 | 原理 | 优点 | 缺点 |
---|---|---|---|
编译型语言 | 通过专门的编译器,将所有源代码一次性转换成特定平台(Windows、Linux 等)执行的机器码(.ext, .dwg)。 | 编译一次后,脱离了编译器也可运行,并且运行效率较高 | 可移植性性差,不够灵活 |
解释型语言 | 由专门的解释器,根据需要将部分源代码临时转换成特定平台的机器码。 | 跨平台性好,通过不同的解释器,将相同的源代码解释成不同平台下的机器码。 | 一遍执行,一转化,效率较低 |
思考:javaScript 是一门解释性语言吗?
按照解释定义:javaScript是在运行时被解释器编译成机器码的,所以它属于解释型语言,疑惑是
- js是解释型语言,但是有变量提升
- JIT(及时编译),会做代码优化
解释:变量提升
在函数作用域内,任何变量,函数都会被提升到顶部,但是并不会对其进行初始化
注意: 变量提升函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用域顶部
为什么会有变量提升?
function fn1() {
fn2()
}
function fn2() {
fn1()
}
fn1()
如果没有变量提升,fn2没有