【C语言】编译和链接

这篇具有很好参考价值的文章主要介绍了【C语言】编译和链接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C语言】编译和链接,c语言,开发语言

前言:
编译和链接是计算机程序开发中的两个重要步骤,用于将源代码转化为可执行的程序。


一、翻译环境和运行环境

翻译环境: 是指在开发计算机程序时所使用的工具和设置的集合。它包括开发者用来编写、测试和调试代码的软件工具,,如文本编辑器、集成开发环境(IDE)、编译器、调试器等。
运行环境: 运行环境是指在计算机上执行已编译程序时的环境和设置。

在翻译环境中包含了编译和链接过程:
【C语言】编译和链接,c语言,开发语言


翻译环境:【C语言】编译和链接,c语言,开发语言

⼀个C语⾔的项⽬中可能有多个.c⽂件⼀起构建,那多个.c⽂件如何⽣成可执⾏程序呢?

  • 多个.c⽂件单独经过编译出编译处理⽣产对应的⽬标⽂件。
  • 注:在Windows环境下的⽬标⽂件的后缀是.obj,Linux环境下⽬标⽂件的后缀是.o
  • 多个⽬标⽂件和链接库⼀起经过链接器处理⽣成最终的可执⾏程序。
  • 链接库是指运行时库(它是⽀持程序运⾏的基本函数集合)或者第三⽅库。

二、翻译环境中的编译

编译⼜分为:预处理(或预编译)、编译、汇编三个过程。

【C语言】编译和链接,c语言,开发语言


2.1 预处理(预编译)

预处理是计算机程序编译过程中的第一个阶段,它主要负责对源代码文件进行一些文本处理操作,以准备将源代码转化为目标文件的过程。

  1. 宏替换:在预处理阶段,C和C++编译器会处理源代码中的宏定义,并将其替换为相应的文本。这可以通过宏展开(Macro Expansion)来实现。
#define PI 3.14159265359
double circle_area = PI * radius * radius;//圆形面积

在预处理之后,上述代码将被替换为:
double circle_area = 3.14159265359 * radius * radius;
  1. 头文件包含:#include 预处理指令用于包含其他头文件中的代码,以便在源代码文件中使用其定义的函数和变量。例如:
#include <stdio.h>
预处理会将 <stdio.h> 中的内容插入到当前源代码文件中。
  1. 条件编译:预处理允许使用条件编译指令,如 #ifdef、#ifndef、#if、#else 和 #endif,根据条件编译不同的代码块。在下一篇博客中会仔细讲解预处理指令。
  2. 移除注释:预处理器通常会移除源代码中的注释,以减小目标文件的大小。在预处理之后,注释将被完全移除。
  3. 符号替换:预处理还可以执行符号替换,将定义的符号替换为其对应的值。宏替换和符号替换与不同之处在于,符号替换指的是常量宏(只能是常量),而宏替换指的是可以代表更复杂的代码块以及常量。
#define MAX_VALUE 100//MAX_VALUE
int value = MAX_VALUE;
//预处理会将 MAX_VALUE 替换为 100

2.2 编译

编译过程中的词法分析、语法分析、语义分析和代码生成是编译器中的核心步骤,这些步骤将源代码转化为机器可执行的目标文件。

假如有以下一段代码:

array[index] = (index+4)*(2+6);

2.2.1 语法分析

在词法分析阶段,编译器会将源代码分解成词法单元(令牌)。
上⾯程序进⾏词法分析后得到了16个词法单元:

词法单元 类型
array 标识符
[ 左方括号
index 标识符
] 右方括号
= 赋值运算符
( 左括号
index 标识符
+ 加法运算符
4 整数常量
) 右括号
* 乘法运算符
( 左括号
2 整数常量
+ 加法运算符
6 整数常量
) 右括号
; 分号

2.2.2 语法分析

接下来语法分析器,将对扫描产⽣的记号进⾏语法分析,从⽽产⽣语法树。这些语法树是以表达
式为节点的树。

【C语言】编译和链接,c语言,开发语言


2.2.3 语义分析

语义分析阶段检查代码中的语义错误和类型匹配。

对于这个代码片段,它可能执行以下检查:

  • 检查 array 和 index 是否已经声明。
  • 检查 index 是否为整数类型(因为它用于数组索引)。
  • 检查 index+4 和 2+6 的结果是否是整数类型。
  • 检查 array 是否支持索引操作。
  • 检查赋值运算的左边和右边的类型是否兼容。
  • 如果发现任何类型不匹配或未声明的变量,将生成相应的语义错误。

2.3 汇编

在这个阶段,编译器将生成的中间表示(通常是汇编代码)转化为目标机器的二进制机器代码,这个二进制代码可以在计算机上执行。


三、翻译环境中的链接

在编程中,链接是将多个目标文件或库文件合并成一个可执行文件或共享库的过程。链接是编译过程的最后一步,它将不同的目标文件和库文件整合在一起,以创建最终可运行的程序或共享库。

步骤包括:目标文件生成、地址和空间分配,符号决议和重定位等这些步骤。具体的不再深入讲解


四、运行环境

  1. 程序必须载⼊内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独⽴的环境中,程序的载⼊必须由手工安排,也可能是通过可执行代码置⼊只读内存来完成。
  2. 程序的执行便开始。接着便调⽤main函数。
  3. 开始执行程序代码。这个时候程序将使⽤⼀个运⾏时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程⼀直保留他们的值。
  4. 终止程序。正常终止main函数;也有可能是意外终止。

【C语言】编译和链接,c语言,开发语言

如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。文章来源地址https://www.toymoban.com/news/detail-735206.html

到了这里,关于【C语言】编译和链接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言·编译和链接

            在ANSI C的任何一种实现中,存在两种不同的环境         第一种是翻译环境,在这个环境中源代码被转换成可执行的机器指令         第二种是运行环境,它用于实际执行代码         我们知道项目中的以.c或.h为后缀的文件计算机是不认识的、无法直

    2024年01月19日
    浏览(33)
  • C语言编译和链接

    翻译环境和运行环境 在ANSI C的任何一种实现中,存在两个不同的环境 .第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令 .第二种是执行环境,它用于实际执行代码 翻译环境是由编译和链接两个大过程组成,而编译又可以分解成:预处理(预编译)、编译和

    2024年01月19日
    浏览(40)
  • C语言:编译和链接

    目录 一:翻译环境和运行环境 二:翻译环境 2.1预处理(预编译) 2.2编译 2.2.1 词法分析: 2.2.2语法分析 2.2.3语义分析 2.3 汇编 三:运行环境 在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第2种是执行

    2024年01月17日
    浏览(37)
  • 编译和链接---C语言

    众所周知,C语言是一门高级的编程语言,是无法被计算机直接读懂的,C语言也不同于汇编PHP,无法直接翻译成机器语言,在学习的过程中,你是否好奇过我们所敲的C语言代码,是如何一步步翻译成机器语言的呢?今天这篇博客---编译和链接,就是要带领我们解决这样的问题

    2024年01月25日
    浏览(34)
  • C语言之编译和链接

    目录 一、引言  二、编译和链接 2.1 预处理(预编译) 2.2 编译 2.3 汇编 2.4 链接 像这样,只由ASCII字符构成的文件被称为文本文件,它需要经过翻译环境的 编译和链接 后才能成为二进制文件,也就是可执行程序。 可执行程序的内部是一系列二进制形式的计算机指令和数据的

    2024年01月19日
    浏览(70)
  • 浅谈C语言编译与链接

    个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 在ANSI C(标准 C)的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)。 第2种是执行环境,它用于实际执行

    2024年04月26日
    浏览(31)
  • 【C语言】编译和链接深度剖析

    本小节,我们学习翻译环境和运行环境,其中我们将学习编译环境的4个阶段:预编译,编译(词法分析,语法分析,语义分析),汇编,链接,文章干货满满!学习起来吧😃! 在 ANSI C 的任何⼀种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换

    2024年01月20日
    浏览(60)
  • C 语言->编译和链接实现原理

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 今天学习 :浅学编译和链接内部实现原理 前提:本文是在gcc编译环境下学习,目前只是浅学习 在ANSI C的任何⼀种实现中,存在两个不同的环境。 第1种 是翻译环

    2024年01月20日
    浏览(39)
  • C语言从入门到实战————编译和链接

    目录   前言 1. 翻译环境和运行环境 2. 翻译环境 2.1 预处理(预编译)  2.2 编译 2.2.1 词法分析:  2.2.2 语法分析  2.2.3 语义分析  2.3 汇编  2.4 链接 3. 运行环境  编译和链接是将C语言源代码转换成可执行文件的必经过程,涉及到以下主要步骤: 预处理 :在编译的开始阶段

    2024年04月25日
    浏览(70)
  • C语言从入门到实战——编译和链接

    在C语言中,编译和链接是将源代码转换为可执行文件的两个主要步骤。 编译过程包括以下步骤: 预处理:将源代码中的预处理指令(如 #include 和 #define )替换为实际的代码。 编译:将预处理后的代码转换为汇编语言。 汇编:将汇编语言转换为机器码指令。 链接过程包括以

    2024年01月21日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包