c语言:编译和链接

news2025/2/25 9:19:46

翻译环境和运行环境

在ANSIC的任何⼀种实现中,存在两个不同的环境。

第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。

第2种是执行环境,它用于实际执行代码。


编译过程

  1. 预处理(Preprocessing)

    • 文件包含(File Inclusion):

      • 使用#include指令将其他文件的内容包含到当前文件中。
      • 包含的文件可以是系统头文件(如stdio.h)或自定义头文件。
      • 预处理器会将被包含文件的内容插入到#include指令所在的位置。
    • 宏展开(Macro Expansion):

      • 宏是一种用于替换文本的代码片段,可以通过#define指令定义。
      • 预处理器会将源代码中出现的宏名称替换为宏定义中的内容。
      • 宏展开可以简化代码、提高代码的可读性和维护性。
    • 条件编译(Conditional Compilation):

      • 使用条件编译指令(如#ifdef#ifndef#if#elif#else#endif)根据条件选择性地编译代码。
      • 条件编译可以根据宏的定义情况决定是否编译某些代码块。
      • 这可以用于实现跨平台编译、调试代码和版本控制等。
    • 注释删除(Comment Removal):

      • 预处理器会删除源代码中的注释,包括单行注释(//)和多行注释(/* ... */)。
      • 注释的目的是为了提高代码的可读性,但在编译过程中并不需要注释。
    • 其他处理:

      • 预处理器还可以执行其他一些操作,如去除行尾空格、处理特殊字符等。
      • 例如,#pragma指令用于向编译器发出特定的指示。
  2. 编译(Compilation):

    • 词法分析(Lexical Analysis):

      • 词法分析器(Lexer)将源代码分解为一个个的词法单元(Token)。
      • 词法单元是源代码中的最小语法单位,如关键字、标识符、运算符和常量等。
      • 词法分析器根据预定义的词法规则来识别和分类词法单元。
    • 语法分析(Syntax Analysis):

      • 语法分析器(Parser)根据语法规则分析词法单元的组合,并构建抽象语法树(Abstract Syntax Tree,AST)。
      • 抽象语法树是一种树状结构,表示源代码的语法结构和语义关系。
      • 语法分析器检查代码是否符合语法规则,并生成语法树作为中间表示。
    • 语义分析(Semantic Analysis):

      • 语义分析器(Semantic Analyzer)对语法树进行语义检查,确保代码的语义正确性。
      • 语义分析器会检查类型匹配、变量声明和使用、函数调用等语义相关的问题。
      • 如果发现错误,会生成相应的错误信息。
    • 代码生成(Code Generation):

      • 代码生成器将语法树转换为汇编语言或机器语言。
      • 生成的代码与目标机器的指令集和内存模型相关。
      • 代码生成器会进行优化,以提高代码的执行效率和性能。
  3. 汇编(Assembly):

    • 汇编器将汇编代码转换成机器代码。
    • 生成目标文件(通常是以.obj.o为扩展名的文件)。

 

链接过程:

  1. 目标文件生成:

    • 如果程序包含多个源文件,每个源文件都会被编译成一个目标文件。
    • 每个目标文件包含该文件的机器代码和一些附加信息。
  2. 库链接(Library Linking):

    • 如果程序使用了外部库,链接器会将程序与这些库连接在一起。
    • 静态链接时,整个库的机器代码被复制到可执行文件中。
    • 动态链接时,程序包含对库的引用,但实际的链接发生在运行时。
  3. 符号解析(Symbol Resolution):

    • 解决程序中使用的符号(变量和函数名)的地址。
    • 确保所有引用的符号都能在可执行文件中找到对应的地址。
  4. 重定位(Relocation):

    • 将程序中的相对地址转换为绝对地址。
    • 使得程序能够正确地在内存中运行。
  5. 可执行文件生成:

    • 最终生成可执行文件,该文件包含了所有必要的信息,可以在操作系统上运行。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1391355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Python进阶] 正则表达式的验证

8.2 正则表达式的验证 正则表达式的语法很令人头疼,即使对经常使用它的人来说也是如此。由于难于读写,容易出错,所以找一种工具对正则表达式进行测试是很有必要的。 8.2.1 本地验证 通过Regex Tester这款软件可以在本地对正则表达式进行验…

CTF CRYPTO 密码学-3

题目名称:反编译 题目描述: 分析 题目给出一个pyc后缀的文件,需要使用uncompyle6模块去还原成py文件 uncompyle6简介 uncompyle6 是一个 Python 反编译器,它能够将 Python 字节码(.pyc 文件)转换回源代码&…

系统的可观察性是指什么?

系统的可观察性是指什么? 本文转自 公众号 ByteByteGo,如有侵权,请联系,立即删除 系统的可观察性是系统设计的重要一环。不可观察的系统无法度量、无法监控、无法改进。 日志、追踪和度量是系统可观测性的三大支柱。 下图显示了…

2019年认证杯SPSSPRO杯数学建模D题(第二阶段)5G时代引发的道路规划革命全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 D题 5G时代引发的道路规划革命 原题再现: 忙着回家或上班的司机们都知道交通堵塞既浪费时间又浪费燃料,甚至有的时候会带来情绪上的巨大影响,引发一系列的交通问题。据报道,每年交通拥堵使得美国…

怎么用Office的Excel将图片转为excel表格?

在处理大量的表格数据时,我们经常需要将图片中的表格转换成Excel格式,以便进行更高效的数据分析和处理。然而,手动将图片中的表格数据录入Excel是一项既耗时又容易出错的工作。那么,有没有一种方法能够快速、准确地实现图片表格到…

从2023年因果推断在线峰会看程序员的未来:掌握因果推理,洞悉数据背后的真相

在科技飞速发展的时代,程序员作为数字世界的建筑师,需要不断拓宽视野,汲取新知识,以应对日益复杂的问题和挑战。 2023年的因果推断在线峰会,为程序员们提供了一个了解因果推理的绝佳机会。本文将探讨程序员在峰会上可…

一种基于YOLO改进的高效且轻量级的表面缺陷检测网络, NEU-DET和GC10-DET涨点明显

💡💡💡本文摘要:一种基于YOLO改进的高效且轻量级的表面缺陷检测, 在NEU-DET和GC10-DET任务中涨点明显 目录 1.轻量且高效的YOLO 1.1 SCRB介绍 1.1.1 ScConv介绍 1.2 GSConvns 1.3 od_mobilenetv2_050 1.4 对应ya…

016-Vue-黑马2023:前后端分离开发(在线接口文档),前端工程化、Element、nginx

第三节 前后端分离开发 1、介绍 开发模式 前后端混合开发:传统开发模式 前后端分离开发:当前最为主流的开发模式 页面原型需求案例:分析出接口文档 离线开发文档示例: 2、YAPI(官网已停用) 202…

芯品荟 | 电脑机箱键盘副屏市场调研报告

一.产品简介 1.带TFT彩屏电脑机箱 2.带小TFT彩屏电脑键盘 为什么电脑机箱&键盘,要带屏? 带屏的电脑机箱&键盘客户群体? 电竞玩家、设计师、电子发烧友、股民...... 二、市场规模 中国电脑机箱年产量约6000万台,键盘年产量约3亿…

二次开发在线预约上门服务、预约到家系统 增加开发票功能 轮播图链接跳转 uniapp代码

客户具体要求: 1、在我的个人中心里面增加一个 开票功能,点击进去之后可以查看到能开票的订单列表,如果是个人是填写姓名电话邮箱,就是填写单位名称 税号 邮箱,提交申请到后台审核,如果审核通过后线下人工…

「 典型安全漏洞系列 」03.跨站请求伪造CSRF详解

引言:CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种攻击技术,通过使用用户的身份进行不诚实地操作,恶意用户可以在受害者(目标)的机器上执行一些未授权的操作。这可能会危及…

I2C总线和通信协议详解 (超详细配42张高清图+万字长文)

I2C总线和通信协议详解 (超详细配42张高清图万字长文) I2C(Inter-Integrated Circuit)通信总线,作为嵌入式系统设计中的一个关键组成部分,其灵活性和高效率使其在高级应用中备受青睐。本文旨在提供关于I2C通信总线的深度解析&…

齿轮齿条运动相关计算(博途S7-1200PLC脉冲轴组态)

有关S7-1200PLC脉冲轴相关应用介绍请参考下面的系列文章: S7-1200PLC脉冲轴位置控制功能块 https://rxxw-control.blog.csdn.net/article/details/135299302https://rxxw-control.blog.csdn.net/article/details/135299302S7-1200脉冲轴功能块 https://rxxw-control.blog.c…

这是一篇优雅的Springboot2.0使用手册

这是一篇优雅的Springboot2.0使用手册 最近再研究springboot的原理😋颇有收获,现在让我分享一下springboot如何使用吧~ 啥是Springboot 和书上理解的不同,我认为Springboot是一个优秀的快速搭建框架,他通过maven继承方式添加依…

【windows】右键添加git bash here菜单

在vs 里安装了git for windows 后,之前git-bash 右键菜单消失了。难道是git for windows 覆盖了原来自己安装的git ?大神给出解决方案 手动添加Git Bash Here到右键菜单(超详细) 安装路径:我老的 ? vs的gi…

c++可调用对象、function类模板与std::bind

函数调用与函数调用运算符 先写一个简单的函数&#xff0c;如下&#xff1a; /*函数的定义*/ int func(int i) {cout<<"这是一个函数\t"<<i<<endl; }void test() {func(1);//函数的调用 } 通过这个普通的函数可以看到&#xff0c;调用一个函数很…

黑盒测试,软件测试中的军体拳

黑盒测试&#xff0c;软件测试中的军体拳 让我们来讲一个故事黑盒测试的测试方法黑盒测试的测试方法用于黑盒测试的工具&#xff1a;黑盒测试可以识别什么黑盒测试的特点&#xff1a;黑盒测试的优点&#xff1a; 五星上将麦克阿瑟曾经说过“如果把白盒测试比做六脉神剑&#xf…

vue实现 marquee(走马灯)

样式 代码 <div class"marquee-prompt"><div class"list-prompt" refboxPrompt><span v-for"item in listPrompt" :title"item" class"prompt">{{item}}</span></div> </div>data() {…

快速入门Torch构建自己的网络模型

真有用构建自己的网络模型 读前必看刚学完Alex网络感觉很厉害的样子&#xff0c;我也要搭建一个可以看着网络结构实现上面的代码你已经很强了&#xff0c;千万不要再想实现VGG等网络&#xff01;&#xff01;&#xff01;90%你能了解到的模型大佬早已实现好&#xff0c;直接调用…

【python】16.Python语言进阶

Python语言进阶 重要知识点 生成式&#xff08;推导式&#xff09;的用法 prices {AAPL: 191.88,GOOG: 1186.96,IBM: 149.24,ORCL: 48.44,ACN: 166.89,FB: 208.09,SYMC: 21.29 } # 用股票价格大于100元的股票构造一个新的字典 prices2 {key: value for key, value in prices…