【周分享02】-【编译型语言和解释型语言的执行原理】

本文对比了编译型语言如C、C++和解释型语言如Python、PHP的执行流程,详细解析了从源代码到可执行文件的全过程,包括预编译、编译、汇编、链接及解释执行等关键步骤。
部署运行你感兴趣的模型镜像

周分享】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源码整体框架)

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 编译型语言解释型语言的区别及其特点 #### 定义 编译型语言是指在程序执行之前,先由编译器将源代码一次性翻译成目标机器的二进制指令[^1]。这些二进制指令可以直接被计算机硬件读取并执行,无需再次转换。 相比之下,解释型语言并不直接生成可执行的目标代码。其源代码会在运行时逐行被解释器解析并立即执行[^4]。这种机制使得解释型语言不需要提前完成整个代码的编译过程即可逐步验证调试逻辑。 --- #### 转换时机 对于编译型语言而言,源代码到二进制指令的转换发生在编写完成后、实际运行之前的阶段。这意味着一旦成功编译为目标代码,后续运行过程中不再涉及任何额外的翻译操作[^3]。 而在解释型语言中,这一转换是在每次运行期间动态发生的——即每条语句都会即时地从高级形式转化为低级实现后再被执行[^2]。 --- #### 特点对比 ##### **编译型语言** - 执行效率高:由于已经预先完成了全部代码向具体平台架构适配后的转化工作,因此整体性能表现优异。 - 平台依赖性强:通常情况下,针对不同操作系统或处理器类的设备需分别提供对应的版本;不过也有例外情况如Java通过虚拟机间接达成一定程度上的跨平台能力[^5]。 示例代码如下展示了C作为典代表之一如何利用gcc工具链来构建最终产物: ```c #include <stdio.h> int main() { printf("Hello, world!\n"); return 0; } ``` 上述例子经过`gcc hello.c -o hello`命令之后便产生了名为hello的独立应用程序文件,在Linux环境下能够脱离原始源码单独调用. ##### **解释型语言** - 开发灵活性大:允许开发者快速测试想法以及调整参数设置而不用经历繁琐耗时的整体重建流程; - 可移植性较好:只要安装有适当环境配置下的相应解释引擎,则几乎可以在任意主流平台上无缝切换使用相同的一套脚本内容。 下面给出一段简单的Python实例用于说明此类别的便捷之处: ```python print("Hello, Python!") ``` 这段短短几字便可立刻看到效果,完全不必关心底层细节问题。 --- #### 性能差异原因分析 鉴于前面提到过的各自运作原理的不同,自然也就造成了两者之间存在着显著的速度差距现象。特别是当面对大规模复杂项目场景下时尤为明显,因为每一次启动解释模式都需要重复相同的预处理动作直至结束为止。 然而值得注意的是,尽管如此仍然有许多场合偏好选用后者而非前者,主要考量因素在于易学程度较高加上社区资源丰富等方面优势往往足以弥补这方面不足之处。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值