筑基期—C语言
1.1 环境:
在ansic的任何一种是实现中,存在两种不同的环境。第一种是翻译环境,第二种是执行环境。标准明确说明这两种环境不必在同一台机器上,交叉编译器就是在一台机器上运行,但它所产生的可执行代码可以运行于不同类型的机器上。操作系统也是如此。标准同时讨论了独立环境,就是不存在操作系统的环境。你可能在嵌入式系统(如微波炉控制台)遇到这类型的环境。
1.11 翻译
翻译阶段由几个步骤组成,组成一个程序的每个(有可能多个)源文件通过编译过程分别转换为目标代码(object code)。然后,各个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。连接器也会同时引入标准c函数库中任何被该程序所用到的函数,而且他可以搜索程序员的个人程序库,将其需要使用的函数也链接到程序中。
编译过程本身也由几个阶段组成,首先是预处理器(preprocessor)处理。在这个阶段预处理器在源代码上执行文本操作,例如,用实际值代替由#include指令定义的符号以及读入由#inlclude指令包含的文件的内容。
然后,源代码经过解析(parse),判断它的语句意思。第二阶段是产生绝大多数错误和警告信息的地方。随后,便产生目标代码(机器指令的初步形式)。如果我们在编译程序的过程中加入了要求优化的选项,优化器(optimizer)就会对目标代码进一步进行处理,使它效率更高。
一:文件名约定
c源代码通常保存于以 .c 拓展名命名的文件中,由#include指令包含包含到c源代码的文件被称为头文件,通常有拓展名 .h。目标文件 .o(unix系统) .obj(dos操作系统) 。
二:编译和链接
在绝大多数unix系统中,c编译器被称为cc。
1. cc program.c 产生一个称为 a.out 的可执行程序。中间会产生一个 program.o 的目标文件。
2. cc main.c sort.c lookup.c 编译并链接几个c源文件
3. cc main.o lookup.o sort.c 编译一个源文件,并与它现存的目标文件链接在一起
4. cc -c program.c 编译单个源文件,并产生一个目标文件(program.o),以后再进行链接
5. cc -c main.c sort.c lookup.c 编译几个源文件,并为每个文件产生一个目标文件
6. cc main.o sort.o lookup.o 链接几个目标文件
上面那些可以产生可执行程序的命令均可以加上“-o name” 这个选项,它可以使链接器把可执行程序保存在“name”文件中,而不是“a.out”
ms-dos命令行界面与unix编译器不同点:
1.它的名字是bcc
2.目标文件的名字是file.obj。
3.当单个源文件被编译并链接时,编译器并不删除目标文件。
1.1.2 执行
程序的执行也需要经历几个阶段。首先,程序必须载入到内存中。(宿主环境中)由操作系统完成,那些不是存储在堆栈中的尚未初始化的变量将在这个时候得到初始值。(独立环境),必须手工安排,也可能是通过把可执行代码置入只读内存(rom)来完成。
然后,程序的执行便开始。调用main函数,执行程序代码,程序的终止(正常返回为main函数返回)