程序的翻译环境和执行环境
在ANSI C的任何一种实现中,存在两个不同的环境
第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行环境,它用于实际执行代码。
基本情况如下图:
程序的翻译环境
编译:
预编译 编译 汇编
1、预编译(文本操作)(test.c (C语言代码)->test.i (C语言代码)):
1、头文件的包含
#include----预处理指令
2、删除注释
3、#define定义
符号的替换
2、编译(test.i (C语言代码)->test.s (汇编代码):
将c语言代码转换成汇编代码
1、语法分析
2、词法分析
3、语义分析
4、符号汇总
全局符号汇总
3、汇编(test.s (汇编代码)->test.o (二进制指令)):
1、形成符号表
给符号汇总中的符号配上地址
链接(test.o add.o ->a.out (可执行程序)):
1、合并段表
2、符号表的合并和重定位
1、
2、
默认填充值(没有任何意义)
多个目标文件进行链接的时候会通过符号表查看来自外部符号是否真实存在
程序的执行环境
程序执行的过程: 1、 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。 2、程序的执行便开始。接着便调用main函数。
3、开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。 4、 终止程序。正常终止main函数;也有可能是意外终止。
源程序到运行的全过程
详解预处理
预处理符号
__FILE__
__LINE__
__DATE__
__TIME__
__STDC__
使用:
#include<stdio.h>
int main()
{
printf("%s\n",__FILE__);
printf("%s\n",__LINE__);
printf("%s\n",__DATE__);
printf("%s\n",__TIME__);
}
实例;记录日志
int main()
{
FILE*pf=fopen("log.txt","w");
if(pf==NULL)
{
return 1;
}
for(i=0;i<10;i++)
{
fprintf(pf,"%s %s %s %d %d",__DATE__,__TIME__,__FILE__,__LINE__,i);
}
fclose(pf);
pf=NULL;
return 0;
}
|