比特科技
关注我们,实时接收精彩面对面/面试题/技术博文及IT最新资讯
代码写了这么久
你有没有考虑过这样一个问题
编译器如何执行您的源代码?
事实上,这确实是一个更复杂的问题
但是!没关系
阅读本文
一定能找到您问题的答案
温馨提示:
文中涉及到的编译原理的相关知识,可以参考《编译原理》同类型的书籍进行延伸学习。
首先我们回顾一下正常情况下从编写代码到运行程序的整个过程:
比如我们现在要写一段代码,我们先打开编译器VS2013,在编辑界面编辑我们的代码,然后按快捷键Ctrl+F5,然后我们会看到上面出现一个黑框屏幕上,显示出我们想要的输出信息。
整个过程基本就是这样,但是你有没有想过,从我们编译出来的源码到最后出现的黑匣子,编译器做了什么?
通常,以Windows开发环境中的C语言为例,它们会有以下一系列流程:
.c文件-->预编译-->编译-->链接-->可执行文件.exe
预编译
什么是预编译?
字面意思是在实际编译之前进行。 编译器会处理头文件包含指令(如#include)、宏定义指令(如#define ...)、条件编译指令(如#ifdef、#ifndef、#else、#elif、#endif、 ETC。)。
对于包含指令的头文件,编译器会直接将该指令替换为头文件中包含的信息;
对于宏定义,如#define M 2怎么知道网站的源程序,预编译器会直接将源代码中的M替换为2;
对于条件编译指令来说,就是过滤掉不必要的代码。
简单来说,预编译就是替换代码内容,删除无用代码。
编译
编译是将预编译的代码翻译成机器可以识别的机器语言的过程。
在编译的过程中,编译器还需要对代码进行词法分析、句法分析、语义分析、优化、汇编(相关知识很多,大家可以自己理解,就不解释了详细信息请参见此处)怎么知道网站的源程序,然后生成机器语言代码。 机器语言是计算机可以直接识别和执行的一组用二进制代码表示的机器指令。
在Windows下,我们可以在项目文件夹中找到一个.obj文件,这是我们的目标代码文件。
关联
编译后,我们的代码还不能完全执行,实际上我们今天拥有的只是一堆二进制代码。
比如我们的源程序引用了库文件中的某个函数,但是我们并没有将该函数的定义与那些二进制代码关联起来,那么缺失的代码就是不完整的,而链接的作用就是链接这个关联的文件结合在一起使它们成为一个整体。
链接后我们可以在项目文件下的debug文件夹下找到一个.exe文件,这就是我们最终的可执行文件。
就知识而言,可讲的东西还是太多了。 如果想深入讲相关知识,恐怕还得搬个小板凳慢慢讲。 那么在这里,我只是给大家做了一个简单的介绍,有兴趣的朋友可以继续拓展研究。
结尾
发表评论