bit
ASCII
由一个字节表示(byte),一个byte有8个bit组成。目前ASCII表示了128个字符。如(A=65=0100 0001)。
翻译
人类编写的程序是高级的文本文件,但是计算机执行的是一系列低等级的机器语言指令。这些指令被打包成“可执行对象文件”的形式(如win的exe),存储为 二进制磁盘文件。在Unix中,从源文件翻译到对象文件的工作由编译器完成。如下是c语言翻译成对象文件的过程。
#include <stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}
该过程由4部分组成,预处理,编译,汇编,连接。执行这4部分的动作的被称为编译系统。
- 预处理阶段
预处理器(cpp)根据#
开头的指令修改C程序,如#include <stdio.h>
告诉预处理器读取系统头文件stdio.h的内容,直接插入到程序中。处理 后的文件以.i
结尾。 - 编译阶段
编译器(cc1)将.i
结尾的文件翻译成.s
结尾的文件,.s
文件包含了汇编语言程序。如hello.s包含了main函数的定义。main: subq $8, %rsp movl $.LC0, %edi call puts movl $0, %eax addq $8, %rsp ret
汇编语言就是低等级的机器指令的文本形式。汇编语言为不同的语言和不同编译器提供了统一的输出语言,如C语言和java语言都会生成同样汇编语言的 输出文件。
- 汇编过程 汇编器将hello.s的汇编语言翻译成低等级的机器语言。将他们打包成relocatable object program(可重定位对象程序)的形式。存储为一个对象 文件hello.o。这是一个二进制文件,如果我们打开它,那么,就会发现完全看不懂。
- 链接阶段 我们的hello程序调用了printf程序,printf函数被保存在一个独立的对象文件printf.o中,必须和我们的hello.o程序合并,链接器就会处理这种 合并。合并后的记过为hello文件,是一个可执行的对象文件,用于加载进内存,被系统执行。