CSAPP translation page 3

这里,GCC编译器驱动程序读取hello.c源文件然后翻译成一个可执行的目标文件hello. 翻译执行的4个阶段在图1.3中有展示. 执行(perform)这四个阶段的程序(programs)(预处理器、编译器、汇编程序和链接q器被统称为编译系统(compilation system)。


CSAPP translation page 3_第1张图片

•预处理阶段. 预处理器(cpp)修改最初的C语言程序通过以# 字符开始的指令.例如, #include 命令在hello.c 的第一行告诉预处理器读取在系统中头文件stdio.h的内容和直接进入插入程序文本. 这个结果是一个其他的C语言程序,通常后缀名(suffix)是 .i

•编译阶段(compilation phase).编译器(cc1)翻译文本文件hello.i 变成文本文件 hello.s,其中包含汇编语言(assembly-language)程序. 汇编语言程序中的每个语句(statement)都准确地描述了一个低级语句标准文本形式的机器语言指令。汇编语言是实用的,因为它为不同语言的不同编译器(compilers)提供了一种通用的输出语言. 例如,C语言编译器和Fortran语言编译器两者都是以相同的汇编语言生成(generate)输出文件.

•汇编(assembly)阶段. 接下来,汇编程序(assembler)把hello.s转换成机器语言指令.把它们打包成可重定位的目标程序形式并将结果存储在对象文件hello.o中。hello.o文件是一个二进制的文件,它的字节编码是机器语言指令而不是字符集.如果我们观察hello.o的文本编辑,它将会看起来令人费解.

•链接器阶段.注意,我们的hello.c程序调用(calls)printf函数(function).它是每一个C语言编译器都提供的标准C语言函数库中的一个函数. printf 函数驻留在(resides)单独的(separate)一个被称为printf.o的预编译(precompiled)对象文件里,它必须以某种方式(somehow)和我们的hello.o程序合并(merged).链接器处理这个合并.它的结果是hello 文件. 它是一个可执行的目标文件(或一个简单的可执行文件(executable,可执行文件)) ,它可以被加载(loaded)到内存(memory)中然后被系统执行(executed).

你可能感兴趣的:(CSAPP translation page 3)