编程就是从源程序test.c到可执行程序test.exe的过程,这个过程中到底发生什么事呢?
组成一个程序的每个目标文件捆绑在一起形成一个单一而完整的可执行程序,链接器也会同时引入标准c函数库中任何被该程序用的函数而且他可以搜索程序员个人的程序库,将其需要的函数也链接到程序。
整个过程分为两个环境:翻译环境和运行环境。
翻译环境又分为编译和链接过程
接下来分别介绍一下:
先说说编译吧‘在这个过程中进行了预处理器处理、编译和汇编。
这三个分别是干什么的呢?
预处理器处理过程:(1)头文件的包含 -就是我们每次写程序的时候前面的头文件,这些头文件包含了我们常用的一些函数,以便后面使用
(2)#define定义的标识符的替换
(3)宏替换
(4)注释的删除
注:2、3过程都是直接替换进去
编译过程:
(1)语法分析
(2词法分析
(3)语义分析
(4)符号汇总
汇编:
(1)汇编-二进制指令
(2)形成符号表
链接过程包括两部分:
(1)合并段表
(2)符号表的合并和符号表的重定义
运行环境的过程为:
(1)程序必须载入内存中,在有操作系统的环境中:一般这个由操作系统完成。
在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
(2)程序的执行便开始。接着便调用main函数。
(3)开始执行程序代码。这个时候将使用一个运行时堆栈,储存函数的局部变量和返回地址。程序同时也可以使用静态内存
存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
(4)终止程序。正常终止main函数;也有可能是意外终止。
以上这些就是从源程序到可执行程序的过程。
接下来可以在unix环境下看一下整个个过程:
首先在unix环境创写一个简单的程序
输入指令vim test.c
wq后退出就会出现一个test.c文件
然后输入指令gcc -E test.c -o test.i:
这时会出现一个test.i文件,文件中存的就是预处理产生的结果:
输入指令vim test.i 打开test.i文件:
这时候就会发现原来的#include<stdio.h>不见了,被一大段代码代替,这些就是头文件包含的内容:
输入指令;gcc -S test.c 对test.c编译,编译完成后停下来存在test.s文件中:
vim test.s打开test.s文件
这就是编译完成后的结果;然后输入指令
gcc -c test.c 对test.c文件进行汇编:
输入指令 vim test.o
输入指令gcc -s test.c产生一个可执行文件a.out:
输入指令./a.out执行命令
输入指令vim a.out:
以上就是在unix环境下显示的形成可执行程序的过程。