编译器 vs 解释器
Compiler 编译器 | Interpreter 解释器 | |
---|---|---|
功能 | 对整个程序 进行分析 ,执行输出 为另一种代码 (一般为机器码,如目标代码,可能需要连接后才能执行),但是不执行 该机器码 | 对源代码逐行执行 ,即包含分析和执行两步 |
编程步骤 | 1、创建程序。 2、 【编译】 :解析或分析 所有代码的正确性 。如果不正确,则抛出错误如果没有错误,编译器会将源代码转换为机器代码 。 3、它将不同的代码文件链接到一个可运行的程序(如 .exe) 4、 运行程序 | 1、创建程序 2、逐行执行源语句 |
执行速度 | 每次执行的是可运行程序(如 .exe),执行 速度较快 | 每次执行都从源代码开始,且不保存执行过程中的机器代码,执行速度慢 |
执行者权限 | 执行者一般得到的是可执行文件,无法对源代码进行操作,执行者无法对程序进行更改 | 执行者可以对源程序进行更改 |
程序运行对象 | CPU | 解释器 |
适用环境 | .exe 限定特定CPU | 一份源代码只要有对应版本解释器即可运行 对于 web环境 ,由于代码往往是一部分一部分加载,因此无需对整个程序进行分析,采用逐行编译运行的解释型语言更适合 |
代码优化 | 对整个代码进行复杂地分析优化,耗时较长,优化效果较好 | 逐行查看,分析和处理耗时较短 ,优化效果较差 |
有错代码的执行 | 只要有错误,代码就不能执行 | 执行到有错误代码位置 |
对应语言举例 | C,C ++,C#,Scala,Java(既需要编译,又需要解释) | PHP,Perl,Ruby (一般可以认为,不需要编译器,直接通过解释器执行 的语言就是脚本语言) |
附加注意事项:
- 解释和编译都只是程序从源码到运行时的一种动作,高级语言运行过程中动作其实很多,有的是编译动作,有的是解释动作,用解释型或者编译型来分类一个语言,不完全合理。
- 一个完整的编译系统与 一个用C编写的程序hello.c的编译过程:
参考文献
https://www.zhihu.com/question/268303059 深入理解两个概念
https://blog.csdn.net/zhu_xun/article/details/16921413 c的执行过程
https://www.guru99.com/difference-compiler-vs-interpreter.html 编译器和解释器的区别