当前位置:网站首页>C语言的编译

C语言的编译

2022-08-11 05:25:00 火种力量

C语言的编译

前导

  • 在介绍高级语言的编译前,我们先来了解以下内容。
    • 机器是怎么知道它要执行什么指令。
      • 处理器就向我们人一样,它也有着自己的语言,就像我们大部分中国人一样,有着自己的语言-汉语,使用汉语,我们可以进行日常的生活交流,例如购物,搭乘公共交通等;而处理器能够识别的语言叫做机器语言,它也有着自己的一套规则,例如我们汉语的语法结构,主谓宾等。我们要让处理器工作起来,必须要按照的规则,书写一套指令,让它按照我们的预想去做动作。
    • 如何生成这些指令。
      • 我们目前接触的编程语言,历经了多年的发展,已经从当初直接编写机器语言,让处理器运行起来,过渡到高级语言(C语言、C++等)阶段。但是我们的处理器只能识别机器语言,那么我们怎么将高级语言和机器语言联系起来,或者说怎么将高级语言翻译成只有处理器识别的机器语言,那就需要一种工具-编译器,将高级语言翻译成机器语言。

简介

  • 从前导部分可知,编译,其实就是将高级语言翻译成机器语言。翻译这个词我们应该很熟悉,就好像我们将汉语翻译成英语一般,需要经历一个过程,例如分析主谓宾语法结构,语义等然后按照英语的语法结构和语义去组合;而将高级语言翻译成机器语言同样也需要这样的一个过程。

编译的过程

  • 以一个我们非常熟悉的hello world例子C语言例子做说明,其中例子源码如下:
#include <stdio.h>

int main(int argc,char * grgv[])
{
    
    printf("hello world ");
    return 0;
}
  • 以上源码的编译过程,可用下图表示:
    在这里插入图片描述

  • 编译的过程可分为四个阶段,预处理阶段、编译阶段、汇编阶段、链接阶段

    • 预处理阶段 :
      • 预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。比如hello.c中第一行的#include<stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,结果就得到了另一个C程序,通常是以.i作为文件扩展名
    • 编译阶段:
      • 编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令
    • 汇编阶段:
      • 汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种可重定位目标程序的格式,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言指令而不是字符,如果我们在文本文件中打开hello.o文件,看到的将是一堆乱码
    • 链接阶段
      • 链接器(ld)负责处理合并目标代码,生成一个可执行目标文件,可以被加载到内存中,由系统执行

linux gcc编译器对应的命令

编译过程命令含义
预处理阶段gcc -E hello.c -o hello.i预编译
编译阶段gcc -S hello.i -o hello.s将 hello.i 编译为目标代码
汇编阶段gcc -c hello.s -o hello.o生成汇编源文件
链接阶段gcc hello.o -o hello将生成的目标文件链接成可执行文件
原网站

版权声明
本文为[火种力量]所创,转载请带上原文链接,感谢
https://blog.csdn.net/businiaozhiyi/article/details/125956919