1.1信息就是位+上下文
#include <stdio.h> int main() { printf("hello, world\n"); }
其对应的ASCII文本表示如下
# i n c l u d e <sp> < s t d i o . //35 105 110 99 108 117 100 101 32 60 115 116 100 105 111 46 h > \n \n i n t <sp> m a i n ( ) \n { //104 62 10 10 105 110 116 32 109 97 105 110 40 41 10 123 \n <sp> <sp> <sp> <sp> p r i n t f ( " h e l //10 32 32 32 32 112 114 105 110 116 102 40 34 104 101 108 l o , <sp>w o r l d \ n " ) ; \n } //108 111 44 32 119 111 114 108 100 92 110 34 41 59 10 125
1.2程序被其它程序翻译成不同的格式
unix>gcc -o hello hello.c,此时hello.c将经理4个阶段:
- hello.c -> 预处理器 -> hello.i 预处理阶段 (.i被修改后的源文件 文本)
- hello.i -> 编译器 -> hello.s 编译阶段 (.s汇编文件 文本)
- hello.s ->汇编器 -> hello.o 汇编阶段 (.o可重定位目标文件 二进制)
- hello.o -> 链接器 -> hello.exe 链接阶段 (可执行目标文件 二进制)
预处理阶段:
预处理器根据以字符#开头的命令,修改原始.c文件,在hello.c中,预处理器将读取stdio.h的内容,并把其直接插入到hello.c的文本中,结果就得到了修改后的源文件,一般以.i为文件扩展名。
编译阶段:
编译器将hello.i翻译成hello.s,它包含一个汇编语言文件,该文件的每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。
汇编阶段:
汇编器将hello.s翻译成机器语言指令,把这些指定打包成为一种叫做可重定位(relocatable)目标程序的格式,并将结果保存到hello.o中。
hello.o是一个二进制文件,它的字节编码是机器语言指令而不是字符。
链接阶段:
代码中我们调用了printf(),它是C标准库中的一个函数,每个C编译器都提供。
printf函数存在于一个名为printf.o的单独的预编译目标文件中,而此文件必须以某种方式并入到我们的hello.o中。
链接器就负责处理这种并入,结果就得到hello.exe文件,这是可执行目标文件。
可执行目标文件加载到存储器后,由系统负责执行。
1.3了解编译系统如何工作是大有益处的
111
标签:计算机系统,文件,32,10,第一章,110,漫游,hello,105 From: https://www.cnblogs.com/anzf/p/16853980.html