当前位置: 首页 > news >正文

【C语言__编译和链接__复习篇2】

目录

前言

一、翻译环境和运行环境

二、翻译环境

        2.1 预处理

        2.1 编译 

                2.1.1 词法分析

                2.1.2 语法分析

                2.1.3 语义分析

        2.2 汇编

        2.3 链接

三、运行环境

四、简答主线问题


前言

本篇主要讨论以下问题:

主线问题:

1. 源文件(.c)如何转换成(.exe)文件并被执行的

补充知识:

2. 源文件(.c)转换成(.exe)文件并被执行的过程中依赖哪两个环境,这两个环境分别做什么事

翻译环境部分:

3. 翻译环境分为哪两个大的过程,这两个过程执行后得到的结果是什么

4. 编译又分为哪三个小的过程,这三个小的过程具体都做了哪些事,得到的结果分别是什么

5. 链接的目的是什么

运行环境部分:

6. 运行环境中大概在做些什么

一、翻译环境和运行环境

1. 源文件(.c)能被转换成(.exe)文件并被执行,依赖着两个环境:翻译环境和运行环境。

2. 翻译环境:实现将源文件中的源代码转换成(.exe)文件中的二进制指令。

3. 运行环境:执行(.exe)文件中的二进制指令。

二、翻译环境

1. 翻译环境是由编译和链接两个大过程组成,这两个过程执行完的结果分别是得到(.obj)目标文件和(.exe)二进制可执行文件。

2. 翻译环境中的编译过程又分为预处理(预编译)、编译、汇编三个小的过程。

3. 编译所用的工具是编译器,链接所用的工具是链接器。

4. 在windows环境下目标文件的后缀是(.obj),Linux环境下目标文件的后缀是(.o)。

5. (老师用的是Linux环境的编译器gcc,来观察的编译和链接过程中的细节)

2.1 预处理

1. gcc test.c -E -o test.i

2. 预处理阶段主要处理源文件中#开头的预编译指令,处理的规则如下:

    ① 将所有的#define删除,并展开所有的宏定义。

    ② 处理所有的条件编译指令,比如#if、#ifdef、#elif、#else、#endif等。

    ③ 处理#include预编译指令,将包含的头文件中的内容拷贝插入预编译指令的位置上,这个过程是递归进行的,即包含的头文件也可能包含着其他的头文件。

    ④ 删除所有的注释。

    ⑤ 添加行号和文件名标识,方便后续编译器生成调试信息。

    ⑥ 或保留#pragma的编译器指令,方便编译器后续使用。

3. 经过预处理后的(.i)文件中不再包含宏定义,因为宏已经被全部展开,所包含的头文件信息都已经插入到(.i)文件中,所以当我们无法知道宏定义或者头文件是否包含正确的时候,可以查看预处理后的(.i)文件。

2.1 编译 

1. 编译过程就是将预处理后的⽂件进⾏⼀系列的:词法分析、语法分析、语义分析及优化,⽣成相应的汇编代码⽂件。(C语言代码——>汇编代码)

2. gcc -S test.i -o test.s

2.1.1 词法分析

1. 将源代码程序被输⼊扫描器,扫描器的任务就是简单的进⾏词法分析,把代码中的字符分割成⼀系列的记号(关键字、标识符、字⾯量、特殊字符等)。

2.1.2 语法分析

1. 接下来语法分析器,将对扫描产⽣的记号进⾏语法分析,从⽽产⽣语法树。

2.1.3 语义分析

1. 由语义分析器来完成语义分析,即对表达式的语法层⾯分析。编译器所能做的分析是语义的静态分析,静态语义分析通常包括声明和类型的匹配,类型的转换等,这个阶段会报告错误的语法信息。

2.2 汇编

1. 汇编器是将汇编代码转转变成机器可执⾏的指令,每⼀个汇编语句⼏乎都对应⼀条机器指令。汇编指令和机器指令是根据对照表⼀⼀的进⾏翻译的,并不会做指令的优化。

2. gcc -c test.s -o test.o

 2.3 链接

1. 链接过程主要包括:地址和空间分配,符号决议和重定位等步骤(符号决议和重定位后,会通过决议后的符号的地址去找相对应的函数)。

2. 链接主要目的是解决⼀个项⽬中多⽂件、多模块之间互相调⽤的问题

三、运行环境

①将程序载入内存->②调用main函数->③建立运行时堆栈,执行代码->④正常/异常终止

四、简答主线问题

问:源文件(.c)如何转换成(.exe)文件并被执行的?

答:多个(.c)和(.h)文件经过预处理生成多个(.i)文件,(.i)文件经过编译处理生成多个(.s)汇编代码文件,(.s)文件经过汇编处理生成多个(.obj)二进制指令文件,多个(.obj)文件和链接库经过链接器的处理最终生成了一个(.exe)文件,(.exe)文件再在运行环境中经处理实现代码的执行。(<编译和链接>当前了解这么多即可,不需要更深入的了解。如果后期想要深入了解可以看《程序员的自我修养》这一本书。)

相关文章:

【C语言__编译和链接__复习篇2】

目录 前言 一、翻译环境和运行环境 二、翻译环境 2.1 预处理 2.1 编译 2.1.1 词法分析 2.1.2 语法分析 2.1.3 语义分析 2.2 汇编 2.3 链接 三、运行环境 四、简答主线问题 前言 本篇主要讨论以下问题&#xff1a; 主线问题&#xff1a; 1. 源文件(.c)如何转换成(.exe)文件…...

Jmeter —— 自动录制脚本

1、Jmeter配置 1.1新增一个线程组 1.2Jmeter中添加HTTP代理 1.3配置HTTP代理服务器 修改端口 修改Target Cintroller(目标控制器) 修改Grouping(分组) 编辑录制中的包含和排除 在“URL Patterns to include包含模式”中填入.*(123456).*用以过滤请求地址中不包含123456的请求…...

使用python互相转换AVI、MP4、GIF格式视频文件

一、AVI文件转MP4文件 要将AVI格式的视频转换为 MP4&#xff0c;你可以使用 Python的 moviepy 库。以下是一个示例代码&#xff0c;用于将 AVI 文件转换为 MP4 文件&#xff1a; from moviepy.editor import VideoFileClip# 读取 AVI 文件 clip VideoFileClip("input.a…...

11 Php学习:函数

PHP 内建函数Array 函数 PHP Array 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。 创建 PHP 函数 当您需要在 PHP 中封装一段可重复使用的代码块时&#xff0c;可以使用函数。下面详细解释如何创建 PHP 函数并举例说明。 创建 PHP 函数的语法 PHP 函数的基…...

查询电脑用户名和组信息

在命令行里查看电脑名&#xff1a; c:\>hostname 在命令行里&#xff0c;查看组信息&#xff1a; # 显示本地所有的用户组 c:\>net localgroup #显示administrators组包含的用户信息 c:\>net localgroup administrators # 比如我的显示信息&#xff1a; C:\>ne…...

【Godot4.2】CanvasItem绘图函数全解析 - 9.绘制表格

概述 之前介绍TextLine和TextParagraph的时候&#xff0c;提到了用制表符和设定列宽形式来绘制简易表格&#xff0c;但是很明显&#xff0c;单纯使用此种方式很难获得对表格的精确控制。 所以对于表格绘制问题&#xff0c;我决定单独开坑&#xff0c;单独深入研究。 目前比较…...

部署HDFS集群(完全分布式模式、hadoop用户控制集群、hadoop-3.3.4+安装包)

目录 前置 一、上传&解压 &#xff08;一 &#xff09;上传 &#xff08;二&#xff09;解压 二、修改配置文件 &#xff08;一&#xff09;配置workers文件 &#xff08;二&#xff09;配置hadoop-env.sh文件 &#xff08;三&#xff09;配置core-site.xml文件 &…...

TCP协议简单总结

TCP&#xff1a;传输控制协议 特点&#xff1a;面向连接、可靠通信 TCP的最终目的&#xff1a;要保证在不可靠的信道上实现可靠的传输 TCP主要有三个步骤实现可靠传输&#xff1a;三次握手建立连接&#xff0c;传输数据进行确认&#xff0c;四次挥手断开连接 三次握手建立可靠…...

【Qt 实现录音】

Qt 实现录音源代码: #include <QAudioInput> #include <QAudioDeviceInfo> #include <QAudioRecorder> #include <QFile> #include...

python:算法竞赛入门之一

计算 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;不受长整型位数限制。 编写 fibonacci.py 如下 # -*- coding: utf-8 -*- """ 计算 斐波那契数列&#xff08;Fibonacci sequence&#xff09;""" import sys from …...

【大数据与云计算】虚拟机安装Linux

前言&#xff1a;使用Linux系统对大数据学习必不可少&#xff0c;本文主要介绍虚拟机安装linux的流程 文章目录 一、 下载VMware二、下载Linux三、安装Linux 一、 下载VMware 官网链接 下载VMware-player&#xff0c;一直下一步安装即可。 二、下载Linux 点击链接直接下载&…...

从零开始编写一个cmake构建脚本

简介 本文档介绍cmake构建脚本编写&#xff0c;包含的一些主要元素和命名规范。 cmake构建脚本编写步骤 cmake构建工具版本要明确 # 命令名字要小写&#xff0c;这条语句要求构建工具至少需要版本为3.12或以上 cmake_minimum_required (VERSION 3.12)工程名及库的版本号明确…...

pringboot2集成swagger2出现guava的FluentIterable方法不存在

错误信息 Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: springfox.documentation.spring.web.scanners.ApiListingScanner.scan(ApiListingScanner.java:117) The following method did not ex…...

进程线程的关系

举个例子 滑稽老师吃100只鸡 如何加快滑稽老师吃鸡的效率&#xff1f;&#xff1f; 有一个方案&#xff0c;搞两个房间&#xff0c;两个滑稽老师 一个滑稽吃50只鸡&#xff0c;速度一定会大幅度增加 多进程的方案 创建新的进程 就需要申请更多的资源&#xff08;房间和…...

一些 VLP 下游任务的相关探索

目录 一、Image-Text Retrieval (ITR , 图像文本检索) 任务目的&#xff1a; 数据集格式 训练流程 evaluation流程 实际使用推测猜想 二、Visual Question Answering &#xff08;VQA &#xff0c; 视觉问答&#xff09; 任务目的 数据集格式 训练流程 demo以及评估流…...

【opencv】示例-pca.cpp PCA图像重建演示

// 加载必要的头文件 #include <iostream> // 用于标准输入输出流 #include <fstream> // 用于文件的输入输出 #include <sstream> // 用于字符串的输入输出流操作#include <opencv2/core.hpp> // OpenCV核心功能的头文件 #include "o…...

C语言中的编译和链接

系列文章目录 文章目录 ​编辑 系列文章目录 文章目录 前言 一、 翻译环境和运行环境 二、 翻译环境 2.1 编译 2.1.1 预处理 2.1.2 编译 2.1.2.1 词法分析 : 2.1.2.2 语法分析 2.1.2.3 语义分析 2.1.3 汇编 2.2 链接 三、运行环境 前言 在我们平常的写代码时&#xff0c;我们很…...

如何将三方库集成到hap包中——通过IDE集成cmak构建方式的C/C++三方库

简介 cmake构建方式是开源三方库的主流构建方式。DevEco Studio目前以支持cmake的构建方式。本文将通过在IDE上适配cJSON三方库为例讲来解如何在IDE上集成cmake构建方式得三方库。 创建工程 在开发进行三方库适配以及napi接口开发前&#xff0c;我们需要创建一个三方库对应的…...

Towards Street-Level Client-Independent IP Geolocation(2011年)(第二部分)

被引次数:306 Wang Y, Burgener D, Flores M, et al. Towards {Street-Level}{Client-Independent}{IP} Geolocation[C]//8th USENIX Symposium on Networked Systems Design and Implementation (NSDI 11). 2011. 接着Towards Street-Level Client-Independent IP Geolocati…...

软件测试过程和测试生命周期

众所周知&#xff0c;软件生命周期包括&#xff0c;需求阶段、设计阶段、设计构建阶段、测试周期阶段、最后测试、实施阶段、最后运维和维护验收。每个阶段都需要在软件开发的生命周期中从前一阶段交付。需求转化为设计&#xff0c;设计转化为开发和开发成测试&#xff0c;经过…...

python-study-day1

ps&#xff1a;前言 可做毕设&#xff0c;html&#xff0c;web&#xff0c;app&#xff0c;小程序&#xff0c;bug修改&#xff0c;可加急 作者自述 作为一名前端开发工程师&#xff0c;这个大环境不好的情况下&#xff0c;我试过我前端接单子但是没有后端&#xff0c…...

【Apache2】彻底删除 Apache2 服务器

要彻底删除 Apache2 服务器&#xff0c;需要卸载 Apache2 软件包并删除其配置文件和数据文件。在 Ubuntu 上&#xff0c;可以按照以下步骤来完成&#xff1a; 停止 Apache2 服务&#xff1a; sudo systemctl stop apache2卸载 Apache2 软件包&#xff1a; sudo apt-get purge a…...

C#:成绩等级转换

任务描述 本关任务&#xff1a;给出一百分制成绩&#xff0c;要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以上为A 80-89分为B 70-79分为C 60-69分为D 60分以下为E&#xff0c;如果输入数据不在0~100范围内&#xff0c;请输出一行&#xff1a;“Score is error!”…...

每日OJ题_01背包③_力扣494. 目标和(dp+滚动数组优化)

目录 力扣494. 目标和 问题解析 解析代码 滚动数组优化代码 力扣494. 目标和 494. 目标和 难度 中等 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; …...

vue3+element plus图片预览点击按钮直接显示图片的预览形式

1 需求 直接上需求&#xff1a; 我想要直接点击下面这个“预览”按钮&#xff0c;然后呈现出预览图片的形式 ok&#xff0c;需求知道了&#xff0c;下面让我们来看看如何实现吧 ~ 2 实现 template部分 <el-buttontype"primary"size"small"click&qu…...

GAMS104 现代游戏引擎 2

渲染的难点可以分为一下三部分&#xff1a;如何计算入射光线、如何考虑材质以及如何实现全局光照。 渲染的难点之一在于阴影&#xff0c;或者说是光的可见性。如何做出合适的阴影效果远比想象中要难得多&#xff0c;在实践中往往需要通过大量的技巧才能实现符合人认知的阴影效…...

spring boot学习第十七篇:OAuth2概述及使用GitHub登录第三方网站

0. 导言 我们在浏览器上可以访问成百上千个网站&#xff0c;使用每个网站的服务一般都要先注册账号&#xff0c;那么我们为了更好地记忆&#xff0c;一般都会在多个网站使用相同的账号和密码进行注册。那么问题就来了&#xff0c;如果在你注册的网站中有某些个网站的系统设计不…...

基于springboot的电影评论网站系统源码数据库

基于springboot的电影评论网站系统源码数据库 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了电影评论网站的开发全过程。通过分析电影评论网站管理的不足&#xff0c;创建了一个计算机管理电影评论网站的方案。文…...

javaScript手写专题——实现instanceof/call/apply/bind/new的过程/继承方式

目录 原型链相关 手写instanceof 实现一个_instance方法&#xff0c;判断对象obj是否是target的实例 测试 手写new的过程 实现一个myNew方法&#xff0c;接收一个构造函数以及构造函数的参数&#xff0c;返回构造函数创建的实例对象 测试myNew方法 手写类的继承 ES6&…...

C++11 新特性:tuple 元组

std::tuple是 C11 中引入的一个非常强大的类型&#xff0c;它允许将多个类型不同的值&#xff0c;组合成单一对象。 std::tuple非常适合用于那些需要返回多个值的场景&#xff0c;而且它的灵活性和通用性使得其成为现代 C 编程中不可或缺的一部分。下面&#xff0c;我们将探讨…...

企业网站备案密码怎么找回/商丘网站推广公司

过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11520 Accepted Submission(s): 5072Problem DescriptionRPG girls今天和大家一起去游乐场玩。最终能够坐上梦寐以求的过山车了。但是&#xff0c;过山车…...

菏泽网站建设公司/小程序

实战需求 我正在尝试将 Picker 和 macOS SwiftUI 应用程序中的 Menu 中的一些按钮组合起来。不幸的是 Picker 会自动折叠到子菜单中,我很难找到解决方案。如何防止 Picker 弃牌,或者可能有更好的解决方案? Menu("Budgets") {Picker("Budgets", select…...

用dw做网站的视频/百度seo快速排名优化软件

中国武术有句名言&#xff1a;“内练一口气&#xff0c;外练筋骨皮”&#xff0c;修炼内功可以让自己比变得更强&#xff01;本文将全面的带领大家了解一下G1这款垃圾收集器&#xff0c;在正式了解G1之前&#xff0c;我们先来回顾一下垃圾回收的相关基础知识。 如何定位内存中…...

网站上做旅游卖家要学什么/引流软件有哪些

很久之前就看过attention的相关知识&#xff0c;只是没有动手实践&#xff0c;所以很多小细节没有考虑到&#xff0e; &#xff08;&#xff11;&#xff09;sequence-to-sequence model中&#xff0c;在解码的第一步S0_00​是如何计算的就晕了好一阵&#xff0c;下面的图给出了…...

南宁建设网站制作/关键词挖掘

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行&#xff0c;每行分别先给出多项式非零项的个数&#xff0c;再以指数递降方式输入一个多项式非零项系数和指数&#xff08;绝对值均为不超过1000的整数&#xff09;。数字间以空格分隔。 输出格式: 输出分2行&a…...

网络营销推广的三斧/seo外链收录

word2vec是早期NLP的必要预处理过程&#xff0c;其用于生成词的向量表示&#xff08;embeding&#xff09;。 其将单词映射为固定长度的向量&#xff08;embeding向量&#xff09;&#xff0c;而通过向量表示可以更好地表达不同词之间的相关性&#xff0c;因此会使得后续的分类…...