【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 链接 三、运行环境 四、简答主线问题 前言 本篇主要讨论以下问题: 主线问题: 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,你可以使用 Python的 moviepy 库。以下是一个示例代码,用于将 AVI 文件转换为 MP4 文件: from moviepy.editor import VideoFileClip# 读取 AVI 文件 clip VideoFileClip("input.a…...
11 Php学习:函数
PHP 内建函数Array 函数 PHP Array 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。 创建 PHP 函数 当您需要在 PHP 中封装一段可重复使用的代码块时,可以使用函数。下面详细解释如何创建 PHP 函数并举例说明。 创建 PHP 函数的语法 PHP 函数的基…...
查询电脑用户名和组信息
在命令行里查看电脑名: c:\>hostname 在命令行里,查看组信息: # 显示本地所有的用户组 c:\>net localgroup #显示administrators组包含的用户信息 c:\>net localgroup administrators # 比如我的显示信息: C:\>ne…...
【Godot4.2】CanvasItem绘图函数全解析 - 9.绘制表格
概述 之前介绍TextLine和TextParagraph的时候,提到了用制表符和设定列宽形式来绘制简易表格,但是很明显,单纯使用此种方式很难获得对表格的精确控制。 所以对于表格绘制问题,我决定单独开坑,单独深入研究。 目前比较…...
部署HDFS集群(完全分布式模式、hadoop用户控制集群、hadoop-3.3.4+安装包)
目录 前置 一、上传&解压 (一 )上传 (二)解压 二、修改配置文件 (一)配置workers文件 (二)配置hadoop-env.sh文件 (三)配置core-site.xml文件 &…...
TCP协议简单总结
TCP:传输控制协议 特点:面向连接、可靠通信 TCP的最终目的:要保证在不可靠的信道上实现可靠的传输 TCP主要有三个步骤实现可靠传输:三次握手建立连接,传输数据进行确认,四次挥手断开连接 三次握手建立可靠…...
【Qt 实现录音】
Qt 实现录音源代码: #include <QAudioInput> #include <QAudioDeviceInfo> #include <QAudioRecorder> #include <QFile> #include...
python:算法竞赛入门之一
计算 斐波那契数列(Fibonacci sequence),不受长整型位数限制。 编写 fibonacci.py 如下 # -*- coding: utf-8 -*- """ 计算 斐波那契数列(Fibonacci sequence)""" import sys from …...
【大数据与云计算】虚拟机安装Linux
前言:使用Linux系统对大数据学习必不可少,本文主要介绍虚拟机安装linux的流程 文章目录 一、 下载VMware二、下载Linux三、安装Linux 一、 下载VMware 官网链接 下载VMware-player,一直下一步安装即可。 二、下载Linux 点击链接直接下载&…...
从零开始编写一个cmake构建脚本
简介 本文档介绍cmake构建脚本编写,包含的一些主要元素和命名规范。 cmake构建脚本编写步骤 cmake构建工具版本要明确 # 命令名字要小写,这条语句要求构建工具至少需要版本为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只鸡 如何加快滑稽老师吃鸡的效率?? 有一个方案,搞两个房间,两个滑稽老师 一个滑稽吃50只鸡,速度一定会大幅度增加 多进程的方案 创建新的进程 就需要申请更多的资源(房间和…...
一些 VLP 下游任务的相关探索
目录 一、Image-Text Retrieval (ITR , 图像文本检索) 任务目的: 数据集格式 训练流程 evaluation流程 实际使用推测猜想 二、Visual Question Answering (VQA , 视觉问答) 任务目的 数据集格式 训练流程 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 链接 三、运行环境 前言 在我们平常的写代码时,我们很…...
如何将三方库集成到hap包中——通过IDE集成cmak构建方式的C/C++三方库
简介 cmake构建方式是开源三方库的主流构建方式。DevEco Studio目前以支持cmake的构建方式。本文将通过在IDE上适配cJSON三方库为例讲来解如何在IDE上集成cmake构建方式得三方库。 创建工程 在开发进行三方库适配以及napi接口开发前,我们需要创建一个三方库对应的…...
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…...
软件测试过程和测试生命周期
众所周知,软件生命周期包括,需求阶段、设计阶段、设计构建阶段、测试周期阶段、最后测试、实施阶段、最后运维和维护验收。每个阶段都需要在软件开发的生命周期中从前一阶段交付。需求转化为设计,设计转化为开发和开发成测试,经过…...
python-study-day1
ps:前言 可做毕设,html,web,app,小程序,bug修改,可加急 作者自述 作为一名前端开发工程师,这个大环境不好的情况下,我试过我前端接单子但是没有后端,…...
【Apache2】彻底删除 Apache2 服务器
要彻底删除 Apache2 服务器,需要卸载 Apache2 软件包并删除其配置文件和数据文件。在 Ubuntu 上,可以按照以下步骤来完成: 停止 Apache2 服务: sudo systemctl stop apache2卸载 Apache2 软件包: sudo apt-get purge a…...
C#:成绩等级转换
任务描述 本关任务:给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以上为A 80-89分为B 70-79分为C 60-69分为D 60分以下为E,如果输入数据不在0~100范围内,请输出一行:“Score is error!”…...
每日OJ题_01背包③_力扣494. 目标和(dp+滚动数组优化)
目录 力扣494. 目标和 问题解析 解析代码 滚动数组优化代码 力扣494. 目标和 494. 目标和 难度 中等 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - ,然后串联起所有整数,可以构造一个 表达式 : …...
vue3+element plus图片预览点击按钮直接显示图片的预览形式
1 需求 直接上需求: 我想要直接点击下面这个“预览”按钮,然后呈现出预览图片的形式 ok,需求知道了,下面让我们来看看如何实现吧 ~ 2 实现 template部分 <el-buttontype"primary"size"small"click&qu…...
GAMS104 现代游戏引擎 2
渲染的难点可以分为一下三部分:如何计算入射光线、如何考虑材质以及如何实现全局光照。 渲染的难点之一在于阴影,或者说是光的可见性。如何做出合适的阴影效果远比想象中要难得多,在实践中往往需要通过大量的技巧才能实现符合人认知的阴影效…...
spring boot学习第十七篇:OAuth2概述及使用GitHub登录第三方网站
0. 导言 我们在浏览器上可以访问成百上千个网站,使用每个网站的服务一般都要先注册账号,那么我们为了更好地记忆,一般都会在多个网站使用相同的账号和密码进行注册。那么问题就来了,如果在你注册的网站中有某些个网站的系统设计不…...
基于springboot的电影评论网站系统源码数据库
基于springboot的电影评论网站系统源码数据库 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了电影评论网站的开发全过程。通过分析电影评论网站管理的不足,创建了一个计算机管理电影评论网站的方案。文…...
javaScript手写专题——实现instanceof/call/apply/bind/new的过程/继承方式
目录 原型链相关 手写instanceof 实现一个_instance方法,判断对象obj是否是target的实例 测试 手写new的过程 实现一个myNew方法,接收一个构造函数以及构造函数的参数,返回构造函数创建的实例对象 测试myNew方法 手写类的继承 ES6&…...
C++11 新特性:tuple 元组
std::tuple是 C11 中引入的一个非常强大的类型,它允许将多个类型不同的值,组合成单一对象。 std::tuple非常适合用于那些需要返回多个值的场景,而且它的灵活性和通用性使得其成为现代 C 编程中不可或缺的一部分。下面,我们将探讨…...
企业网站备案密码怎么找回/商丘网站推广公司
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11520 Accepted Submission(s): 5072Problem DescriptionRPG girls今天和大家一起去游乐场玩。最终能够坐上梦寐以求的过山车了。但是,过山车…...
菏泽网站建设公司/小程序
实战需求 我正在尝试将 Picker 和 macOS SwiftUI 应用程序中的 Menu 中的一些按钮组合起来。不幸的是 Picker 会自动折叠到子菜单中,我很难找到解决方案。如何防止 Picker 弃牌,或者可能有更好的解决方案? Menu("Budgets") {Picker("Budgets", select…...
用dw做网站的视频/百度seo快速排名优化软件
中国武术有句名言:“内练一口气,外练筋骨皮”,修炼内功可以让自己比变得更强!本文将全面的带领大家了解一下G1这款垃圾收集器,在正式了解G1之前,我们先来回顾一下垃圾回收的相关基础知识。 如何定位内存中…...
网站上做旅游卖家要学什么/引流软件有哪些
很久之前就看过attention的相关知识,只是没有动手实践,所以很多小细节没有考虑到. (1)sequence-to-sequence model中,在解码的第一步S0_00是如何计算的就晕了好一阵,下面的图给出了…...
南宁建设网站制作/关键词挖掘
设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行&a…...
网络营销推广的三斧/seo外链收录
word2vec是早期NLP的必要预处理过程,其用于生成词的向量表示(embeding)。 其将单词映射为固定长度的向量(embeding向量),而通过向量表示可以更好地表达不同词之间的相关性,因此会使得后续的分类…...