cpu执行程序的原理这篇文章中提到,“程序要想被cpu执行,首先要被编译成cpu可以执行的指令操作”,那编译成cpu可以执行的指令操作是什么意思呢?这篇文章就用来说明编译的实际意义是什么。
要谈编译,首先要说说cpu架构的概念。cpu架构也就是cpu指令集(指令就是汇编指令或者机器指令,比如add是汇编指令,而对应的机器指令在mips下就是000000)架构,现有cpu架构包括鼎鼎有名的intel的x86架构、arm的arm架构、mips的mips架构、dec的alpha架构。通俗来说,指令集就是指挥cpu如何运算的硬程序,没有这套指令的话,就没有办法指挥cpu运转,而计算机的所有运算都需要cpu参与。
那编译呢,也就是将一段程序转换为指令集的过程。不同架构的指令集自然是不同的,带来的影响就是同一段代码,编译过后只能运行在对应的指令集上,比如一段c 代码,在x86下编译完了,只能在x86下运行,而不能运行在arm架构下运行。
而事实上,编译得到的结果,更是操作系统相关的。假设,一段程序被编译成了x86下的硬程序,但是无法同时运行在windows上和linux上(windows和linux操作系统都可以装在x86架构的cpu上),如果程序一开始是在windows操作系统下编译的,那这段程序就无法运行在其他比如linux操作系统中。
也就是说,编译与操作系统和cpu这二者都是相关的。
事实上,仅仅将程序通过编译改写成汇编指令或机器指令,在操作系统上还不能直接运行。实际上广义的编译,其实包括预处理、编译、汇编、链接这整个过程。
- 预处理,就是把代码里引入的其他代码,插入到这段代码中,形成一个代码文件。
- 编译,就是把代码转化为汇编指令的过程,汇编指令只是cpu相关的,也就是说c代码和python代码,代码逻辑如果相同,编译完的结果其实是一样的。
- 汇编,就是把汇编指令转为机器码的过程,机器码可以被cpu直接执行。
- 链接,就是将一段我们需要的已经编译好的其他库,与我们的汇编结果连起来,这样才是最终程序完整的形式,操作系统才可以运行。不同操作系统编译好的其他库形式不同,而且链接的方式也不同,得到最终程序的形式也不同,所以编译好的程序只能在特定的操作系统下运行。