一套代码在不同的电脑执行快慢_计算机基础系列:源代码如何被计算机执行

计算机芯片的物理特性决定了它只能接受二进制指令。不同计算机芯片的指令集不同。高级编程语言需要转化成二进制机器语言才能被计算机所执行。编译型语言需要使用编译器经过编译和连接生成可执行文件,解释型语言需要使用解释器解释源代码。解释型语言更容易上手,但是运行速度更慢,必要时要使用C/C++重写或使用JIT技术加速。

现在各行各业的朋友都开始使用计算机解决自己的业务问题,网络上有大量的免费公开课,教我们处理数据并数学建模。Python等编程语言上手快,开源软件多,足以应付绝大多数的需求。在计算机软硬件体系中,上述工作都是在最顶层,用户执行程序需要依赖于计算机硬件和系统软件。聊天用的微信、娱乐玩的农药、上网打开的浏览器、还有我们自己写的程序…这些程序是如何从源代码,变成计算机芯片可以执行的程序呢?

6f101eea6af74c955ab14b2735d45c07.png

计算机软硬件体系结构

本文并不是想把这个复杂的链条都解释得非常清楚,或者鼓励大家都去学习底层编程知识,而是想让读者对这个流程有一个基本的认识。因为,当我们熟练掌握了一定编程基础,开始上手更大规模的数据或更复杂的数学模型时,会遇到一些瓶颈,直接调用别人写好的程序或者应用新热算法都无法直接解决问题。这时候了解计算机的基本组成和运行原理,打好基础,才能为顶层应用拓展思维。

计算机只能执行二进制代码

也许你已经知道,计算机是基于二进制运行的。就像道家哲学的阴阳一样,计算机只有两个状态,开或关、真或假、1或0…因为,组成计算机的基本元件——半导体只能以二进制进行计算。我们编程所用的C/C++、Python、大数据、AI等层出不穷的技术,以及我们存储在电子设备的文本、音频、图像、视频等媒介,最终都是以二进制的形式,被计算和处理的。计算机体系最底层的工程师要使用二进制代码控制芯片来做计算和处理。

我在我的Mac上编写了一个名为plus的c = a + b程序,其二进制和汇编代码如下所示:

➜ objdump -s plusplus: file format Mach-O 64-bit x86-64_main:100000f30: 55 pushq %rbp100000f31: 48 89 e5 movq %rsp, %rbp100000f34: 48 83 ec 20 subq $32, %rsp100000f38: c7 45 fc 00 00 00 00 movl $0, -4(%rbp)100000f3f: c7 45 f8 01 00 00 00 movl $1, -8(%rbp)100000f46: c7 45 f4 02 00 00 00 movl $2, -12(%rbp)100000f4d: c7 45 f0 00 00 00 00 movl $0, -16(%rbp)100000f54: 8b 45 f8 movl -8(%rbp), %eax100000f57: 03 45 f4 addl -12(%rbp), %eax100000f5a: 89 45 f0 movl %eax, -16(%rbp)100000f5d: 8b 75 f8 movl -8(%rbp), %esi100000f60: 8b 55 f4 movl -12(%rbp), %edx100000f63: 8b 4d f0 movl -16(%rbp), %ecx100000f66: 48 8d 3d 35 00 00 00 leaq 53(%rip), %rdi100000f6d: b0 00 movb $0, %al100000f6f: e8 0e 00 00 00 callq 14 100000f74: 31 c9 xorl %ecx, %ecx100000f76: 89 45 ec movl %eax, -20(%rbp)100000f79: 89 c8 movl %ecx, %eax100000f7b: 48 83 c4 20 addq $32, %rsp100000f7f: 5d popq %rbp100000f80: c3 retq........

首行的file format Mach-O 64-bit x86-64表示这是一个可以运行在64位x86架构的处理器上、基于Mac OS的一段程序。不同的计算机芯片厂商所设计的半导体电路不同,在芯片上编程的二进制规则不同。执行同样的一段c = a + b的逻辑,在基于ARM架构芯片的Android手机上所需要的二进制代码与上面展示的会截然不同。当前市场上计算机CPU芯片基本被几大科技公司垄断,除了刚提到的Intel和AMD研发的应用在个人电脑上的x86-64处理器,应用在手机、平板电脑等移动设备上的ARM架构处理器,还有应用在大型服务器和超级计算机上的IBM Power系列处理器等。不同架构的CPU处理器都有自己的一套指令集(instruction set architecture,简称ISA),这就像一个设计图纸和使用说明书,告诉编程人员如何使用在其芯片上进行编程:包括如何进行加减乘除计算,如何从内存中读取数据等指令操作。底层开发人员会根据不同指令集,适配不同的CPU处理器。计算机能执行的指令,又被成为机器语言机器码

前面所展示的二进制文件是一个可执行文件。什么是可执行文件呢?可执行文件就是二进制机器语言的集合,可以被机器执行,得到我们想要的结果。我们在Windows上常会遇到的.exe文件,就是可执行文件,exe其实是executable的缩写,从手机应用商店下载的APP也是可执行文件的一种变体。

C语言从源代码到可执行文件

很多朋友觉得C/C++编程调试难,没有比较就没有伤害,看到前文所提到的一个简单加法的程序竟然需要这么多看不懂的01代码,是不是觉得C语言简直是天才般的发明。是的,C语言的发明者当时考虑的就是不同芯片厂商有不同的指令集,相互之间难以兼容,于是想在那些晦涩难懂的底层语言上,建立一个更为通用的编程范式,这样编程人员不用浪费时间精力去识记大量的01二进制指令。那C语言代码是如何转化为可被机器执行的二进制文件呢?编译器和操作系统是两个非常关键的技术。

下面继续以加法计算plus.c源代码为例,展示编译器和操作系统计算机将C语言转化为机器可执行文件。

#include int main(){ int a = 1, b = 2, c = 0; c = a + b; printf("a = %d b = %d c = %d 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值