1.1信息就是位+上下文
hello程序的声明是从一个源文件开始的。该源程序由程序员通过编译器创建并保存为文本文件。
源程序实际上就是由0和1组成的比特位序列组成的,这些比特位被组织成八个一组,称为字节。而每个字节都表示程序中某个文本字符
现代系统大部分用ASCII码来表示文本字符,每一个文本字符都有一个独特的整数值,通过调整字节的大小我们就能获得不同的文本字符。
#include <stdio.h>
int main() {
printf("hello, world\\n");
return 0;
}
像hello.c这样由ASCII字符构成的文件叫做文本文件,其他文件则被称为二进制文件

中心思想:所有的系统信息都是由0和1的比特位构成的
在不同的上下文中,同样的字节序列能表示的信息可能很不相同。因此,获悉信息的上下文十分重要
1.2程序被其他程序翻译成不同的格式
hello.c一开始是一个高级C语言程序,这个程序是可以轻松被人们读懂的。
但是,为了使机器顺利运行hello.c程序,每条C语句都必须被其他程序转化为一系列的低级机器语言指令

对于C程序的翻译过程是由个4个阶段构成的:
预处理阶段:预处理器(preprocessor)根据以字符#开头的命令(directives),修改原始的C程序。比如
#include <stdio.h>
这段代码告诉预处理器读取系统头文件stdio.h的内容,并把它直接加入到程序文本中去。
用#define过的常量以及宏也会被预处理器给替换掉
结果会得到另一个C程序hello.i,通常是以.i作为文件扩展名
编译阶段:编译器(compiler)将文本文件hello.i翻译成文本文件hello.s。它包含了一个汇编语言程序。汇编语言中的每一条语句都以文本格式描述了一条低级机器语言指令。汇编语言为不同的高级语言以及不同的编译器提供了通用的输出语言。
例:C编译器和Fortan编译器产生的输出文件都是一样的汇编语言
汇编阶段:接下来,汇编器(assembler)将hello.s翻译成机器语言指令。把这些指令打包成一种叫做可重定位(relocatable)目标程序的格式。并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言而不是二进制字符,因此用文本打开的话会呈现乱码
链接阶段:在我们的hello程序中调用了printf()函数,这个函数是<stdio.h>库中的函数,存放在一个名为printf.o的单独的预编译目标文件中,而这个文件需要以某种形式并入到我们的hello.o程序中。链接器(linker)就负责这种并入。最后得到一个可执行文件hello.exe