目录
一、程序环境简介
在ANSI C的任何一种实现中,存在两个不同的环境;第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令;第二种是执行环境,它用于实际执行代码;
二、程序的翻译环境
1.翻译环境
//将多个源文件(.c文件),通过编译器(VS使用的是cl.exe文件)编译成多个对应的目标文件(.obj文件),再将所有目标文件和链接库(头文件等)一起经过链接器(VS使用的是link.exe文件)处理,最后形成可执行程序(.exe文件);
组成一个程序的每个源文件通过编译过程分别转换成目标代码(ovject code);
每一个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序;
链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而其他可以搜索程序员个人的程序库,将其需要的函数也链接到程序中;
2.编译过程
从代码到可执行程序过程可以分为:编译和链接两个大步骤,而编译又可以分为预编译(预处理)、编译、汇编;即代码->预编译(预处理)->编译->汇编->链接->生成可执行程序;
2.1预编译(预处理)
所有的预处理指令都是在预处理阶段处理的,预处理阶段处理的内容,包括头文件的包含(#include)、#define定义符号的替换和删除、注释的删除等,这些操作都是文本操作;
2.2编译
编译阶段编译内容是,将C语言代码转换成汇编代码;
转换的过程包括:语法分析、词法分析、语义分析、符号汇总;
符号汇总会将全局符号进行汇总,包括全局变量名、函数名、main等。
2.3汇编
汇编阶段汇编的内容,是将汇编代码转换为二进制指令;将编译过程中汇总的符号进行整合并、编排地址,形成符号表;
2.4链接
链接包括合并段表和符号表合并及重定位;符号表使得程序可以跨文件找到代码;
三、程序的执行环境
//程序执行的过程:
1.程序必须载入内存中。在有操作系统的环境中:一般由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成;
2.程序执行并载入内存后,调用main函数;
3.开始执行程序代码。这时程序将使用一个运行时堆栈(stack),储存函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值;
4.终止程序。正常终止main函数;也可能意外终止;
(-- end --)