PHP内核源码阅读记---round 5 编译型语言与解释型语言

我们使用的语言都是为了人类更好的理解而设计的,机器并不能识别这些语言,其只能执行二进制代码。因此,编写完的程序需要一个“翻译官”将其翻译成二进制序列,这个过程称为编译。而根据编译时机的不同,编程语言可分为编译型语言和解释型语言。

一、编译型语言

编译型语言在程序运行前提前边编译为计算机可执行的二进制文件,在执行时直接执行机器指令,典型代表有C、C++、Golang。编译型语言最大的优势就是效率高,因为耗时的编译过程在执行之前就已经完成。编译型语言在不同平台需要进行重新编译,因为编译时生成的机器指令是针对特定机器的。

将C语言程序编译成可执行的二进制程序需要经过预处理(将以#开头的命令进行替换)、编译(C语言转换为汇编语言)、汇编(将汇编代码生成机器指令,并生成扩展名为.o的ELF可重定位目标文件)、**链接(**将重定向目标文件中引用其他文件的符号进行替换,同时根据上一个步骤生成的符号表,把函数、全局变量的引用位置替换为实际的存储位置)四个阶段。

二、解释型语言

在执行前不需要编译为机器语言,而是由解释器进行解释执行,解释器是机器可识别的二进制程序。解释型语言实际上就是在语言和计算机之间加了一层解释器,也称为虚拟机,然后通过解释型语言控制解释器执行相应的机器指令。

解释器并不是将解释型语言编译成机器语言去执行,而是解释器中预先定义好了一些具体的操作,这些操作已被编译为机器指令,在执行时,解释型语言控制解释器执行某一个机器指令。

因为解释器的存在,屏蔽了不同平台之间机器语言的差异,解释型语言可以方便的运行在不同平台上,实现跨平台。而不同平台之间的差异由解释器来处理,这就相当于解释器将底层的实现封装成固定规则的API,用户可以直接使用其定义的规则来进行操作。(适配器模式)

而这种实现方式带来的弊端就是,运行效率低,相比于编译型语言,多出解释器解析的一步。

三、总结

① 编译型语言:C、C++、Go等,在执行前编译为机器语言,机器可直接执行。优点:执行效率高;缺点:移植到不同平台需要重新编译。

② 解释型语言:Python、PHP等,在执行时进行解析,依赖执行环境(解释器)。优点:跨平台,在安装了执行环境的不同平台下,可完美移植;缺点:执行效率低。

③ 另:Java属于半编译半解释语言,其在程序编写完成后,由编译器将Java代码编译为字节码而不是机器码,在执行时由Java虚拟机解释执行字节码。