系统学习1——C程序的生命周期
来源:互联网 发布:51vv直播软件 编辑:程序博客网 时间:2024/06/05 09:40
通过跟踪C语言的hello程序来对系统进行学习。
信息就是位+上下文
hello程序的生命周期是从源程序开始的,即程序员通过编辑器创建并保存的文本文件,文件名是hello.c。
# include <stido.h>
int main()
{
printf("hello,world\n");
return 0;
}
源程序实际上是0,1组成的位(比特)序列,8个位组成一个组(字节),每个字节表示程序中的某些文本字符。
hello.c程序的ASCII码(ASCII标准用来表示文本字符)。实际上就是用唯一的单字节大小的整数值来表示每个字符。
hello.c是以字节序列的方式存储在文件中,对应的某些字符。就比如C语言的开头命令# include <stdio.h> 比如,35代表‘#’,105代表‘i’。同时,每个文本行都是以‘\n’来结束的。
只有像hello.c的由ASCII字符构成的文件成为文本文件。其他的都称为二进制文件。
这种方法说明了一个基本思想:系统中的所有信息,磁盘文件,内存中程序,内存中存放的数据以及网上传送的数据,都是由一串比特表示。区分不同数据对象的唯一方法是我们读取数据对象的上下文。不同的上下文,同样的字节表示为不同的命令。
每条C语句都必须被其他程序转换成低级机器语言指令,按照一种称为可执行目标程序的格式打包,以二进制磁盘文件的形式保存,目标程序称为可执行目标文件。
Unix系统上,源文件到目标文件的转化是由编译器驱动程序完成。例如命令gcc -o hello hello.c。这个过程分为四个阶段完成,执行这四个阶段的程序(预处理器、编译器、汇编器、链接器)一起构成了编译系统。
预处理阶段:预处理器(cpp)根据#开头的命令,修改原始的C程序,比如# include <stdio.h>,告诉预处理器读取系统头文件stdio.h的内容,并把它插入到程序文本中,形成.i为后缀的文件。
编译器:编译器(ccl)将hello.i翻译为hello.s,它包含了一个汇编语言程序。如图:
用文本格式描述了一条低级机器语言指令。汇编语言是不同程序和不同编译器产生的汇编语言,但是许多编译器产生的汇编语言都相同。
汇编阶段:汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成可重定位目标程序的格式,并把结果保存在目标文件hello.o中,hello.o是一个二进制文件,包含的17个字节是main的指令编码。
链接阶段:hello调用了printf函数,为每个C编译器都提供了标准C库中的一个函数,比如printf函数就存在于预编译好了的目标文件中,这个文件必须以某种方式合并到hello.o程序中。那么链接器(ld)就是用来搞合并的。结果就得到了hello文件,他是一个可执行的目标文件。可以被加载到内存中,由系统执行。
- 系统学习1——C程序的生命周期
- ios学习路线—Objective-C(生命周期)
- linux下C程序的生命周期
- 微信小程序详解——小程序的生命周期和页面的生命周期
- IOS6 学习笔记(1)—— Application 的生命周期
- Android学习——Activity的生命周期
- C程序的学习
- C程序的学习
- Linux系统编程(24)——信号的生命周期
- android 程序的生命周期
- iphone程序的生命周期
- iPhone程序的生命周期
- Android程序的生命周期
- Windows程序的生命周期
- iOS程序的生命周期
- iOS 程序的生命周期
- iOS程序的生命周期
- Windows程序的生命周期
- expdp命令远程备份
- C语言宏定义时#(井号)和##(双井号)的用法
- Hibernate JPA —— could not insert 或 detach entity passed to persist 或Found shared references 错误
- null, equals(""), isEmpty 区别
- 单例模式解析
- 系统学习1——C程序的生命周期
- Tox 聊天工具
- Maven如何手动添加依赖的jar文件到本地Maven仓库
- 机器学习原来如此有趣!全世界最简单的机器学习入门指南
- unity自定义inspector面板(选择不同枚举类型,inspector面板出现不同信息)
- Friend Circles问题及解法
- FP-growth算法
- Linux开发环境安装 运行环境
- Android Intent调用大全