编译型语言与解释型语言有何区别

计算机只能执行二进制代码
也许你已经知道,计算机是基于二进制运行的 。就像道家哲学的阴阳一样,计算机只有两个状态,开或关、真或假、1或0…因为,组成计算机的基本元件——半导体只能以二进制进行计算 。我们编程所用的C/C++、Python、大数据、AI等层出不穷的技术,以及我们存储在电子设备的文本、音频、图像、视频等媒介,最终都是以二进制的形式,被计算和处理的 。计算机体系最底层的工程师要使用二进制代码控制芯片来做计算和处理 。
我在我的Mac上编写了一个名为的程序,其二进制和汇编代码如下所示:
首行的表示这是一个可以运行在64位x86架构的处理器上、基于Mac OS的一段程序 。不同的计算机芯片厂商所设计的半导体电路不同,在芯片上编程的二进制规则不同 。执行同样的一段的逻辑,在基于ARM架构芯片的Android手机上所需要的二进制代码与上面展示的会截然不同 。当前市场上计算机CPU芯片基本被几大科技公司垄断,除了刚提到的Intel和AMD研发的应用在个人电脑上的x86-64处理器,应用在手机、平板电脑等移动设备上的ARM架构处理器,还有应用在大型服务器和超级计算机上的IBM Power系列处理器等 。不同架构的CPU处理器都有自己的一套指令集(instruction set architecture,简称ISA),这就像一个设计图纸和使用说明书,告诉编程人员如何使用在其芯片上进行编程:包括如何进行加减乘除计算,如何从内存中读取数据等指令操作 。底层开发人员会根据不同指令集,适配不同的CPU处理器 。计算机能执行的指令,又被成为机器语言或机器码 。
前面所展示的二进制文件是一个 。什么是可执行文件呢?可执行文件就是二进制机器语言的集合,可以被机器执行,得到我们想要的结果 。我们在Windows上常会遇到的文件,就是可执行文件,其实是的缩写,从手机应用商店下载的APP也是可执行文件的一种变体 。
C语言从源代码到可执行文件
很多朋友觉得C/C++编程调试难,没有比较就没有伤害,看到前文所提到的一个简单加法的程序竟然需要这么多看不懂的01代码,是不是觉得C语言简直是天才般的发明 。是的,C语言的发明者当时考虑的就是不同芯片厂商有不同的指令集,相互之间难以兼容,于是想在那些晦涩难懂的底层语言上,建立一个更为通用的编程范式,这样编程人员不用浪费时间精力去识记大量的01二进制指令 。那C语言代码是如何转化为可被机器执行的二进制文件呢?编译器和操作系统是两个非常关键的技术 。
下面继续以加法计算源代码为例,展示编译器和操作系统计算机将C语言转化为机器可执行文件 。
Linux和Mac OS用户可以使用这个命令来将的源代码编译成名为的可执行文件,会生成在当前的文件夹下 。
执行这个二进制文件,结果将被打印到屏幕上:
是一款开源的编译器,是GNU Compiler Collection中的一员,它可以将C语言代码编译成可执行文件 。GNU Compiler Collection还有C++编译器、Fortran编译器,并且支持包括x86-64和ARM在内的不同指令集 。

编译型语言与解释型语言有何区别


C语言从源代码到执行,要使用编译器来编译(compile)、汇编(assembly)并连接(link)所依赖的库,形成机器可执行文件 。执行这个二进制文件时,操作系统会为程序分配内存和CPU资源 。“编译”和“汇编”,相当于将C语言翻译成底层语言 。另外,代码中使用了库函数,当我们使用别人写好的函数时,需要将这些前人写好的库函数连接到我们的可执行文件中,否则会调用函数失败的错误 。我们将这种需要编译的语言称为编译型语言 。编译型语言有C/C++、Fortran等 。

推荐阅读