zhaoyu@home:~$

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文件,是一个可执行的对象文件,用于加载进内存,被系统执行。