【周分享】2019-11-03 第9周:周日
每周做一些小的分享,加油!!!
作者:阿涛
【编译型语言和解释型语言的执行原理】
[1] 大致区别
- 编译型:
- 例子:C 、 C++ 、Go
- 编译:程序的源代码首先翻译成汇编语言,再用编译器完成编译工作成为目标文件;
- 通俗:把做好的源程序全部编译成二进制代码的可运行程序,可直接运行这个程序。
- 执行速度快、效率高;依靠编译器、跨平台性差些。
- 解释型:
- 例子:PHP、Python
- 解释:程序运行的时候通过解释器来完成翻译工作,成为机器语言;
- 通俗:把做好的源程序翻译一句,然后执行一句,直至结束,每次可能都要进行解释。
- 执行速度慢、效率低;依靠解释器、跨平台性好。
- 所以一般来说解释型语言的性能效率相对来说会比编译型差一点点;
[2] 编译型语言的执行大致流程
- 我们学习C语言的时候,都知道,需要经过预编译,编译,汇编,链接到最后的可执行文件。(大一的概念哈哈哈,我实际上才回忆起来)
- 基本流程如下:
- 第一步:预处理器;
- c语言一开始.c结尾的文件,需要对代码中的宏,依赖进行处理,处理成源程序
- 第二步:编译器;
- 编译器会对源程序的每一行代码进行处理为汇编语言,同时优化程序
- 第三步:汇编器;
- 编译语言再经过汇编器,处理成目标程序,也就是以.o结尾的文件
- 第四步:链接器;
- 需要对程序中的函数或者库,通过连接器进行连接,从而成为
机器代码(可执行程序);
- 需要对程序中的函数或者库,通过连接器进行连接,从而成为
- 最终:对源代码,编译成为当前平台CPU的指令集
[3] 解释型语言的大致流程
- PHP7中,对源代码首先进行词法分析,语法分析,转化为抽象语法树AST,生成opcodes,然后解释为机器指令。
- 基本流程如下:
- 第一步:词法分析;
- 将源代码分割为多个字符串单元,然后分割后的字符串为Token;
- 第二步:语法分析;
- 由于独立多个Token没有完整的语义,因此进行分析,然后转化成抽象语法树AST,(注意这里的词法和语法分析根据情况是可以一起执行的,提高效率)
- 第三步:opcodes;
- opcodes是中间代码,类似java的字节码。
- 这一步也是与编译型最大区别的,编译型会通过编译器来生成,而解释型则是由解释器来完成指令集的转化。
- 然后虚拟机来执行opcodes。
- 注意:可以开启opcodes cache(也就是缓存),省去开始的步骤,直接通过虚拟机执行;
- 最终:对源代码,可以解释成当前平台CPU的指令集;
[4] 放在最后
- 如果有错误,大家可以及时指出鸭,欢迎分享自己的意见。
- 每周总结一些,可以互相交流,共同进步,嘻嘻嘻。
- 如果大家有什么想一起分享的,可以评论区占楼鸭。
参考:《PHP7底层设计与源码实现》滴滴多位大佬编著:第二章(初始PHP7源码整体框架)