C语言运行流程

2023-11-10

在上一篇文章visual studio如何运行并调试C语言代码中写了如何运行并调试代码。
我们就明确一个事实:即不论是嵌入式系统,亦或是普通PC电脑,对于程序的运行硬件处理器只能识别0/1的二进制码。从类人语言的C代码,需要经过一系列的转换过程,才能完全翻译成机器识别的0/1二进制码流。
总的来说,从C语言代码翻译为二进制的过程,主要经历以下四个阶段:
阶段一:预编译
阶段二:编译
阶段三:汇编
阶段四:链接

  1. 【预编译】

    预编译,看一个预字,就表明它是正式编译前的准备阶段。在C语言的代码中,预编译阶段主要完成下面几个工作:

    头文件展开:我们常看到每个C文件的第一行都是#include形式,该形式表明对头文件的引用。源代码开始进行编译之前,这些include(被包含进来的)的文件需要在#include的位置进行展开。
    在这里插入图片描述
    宏替换:在C语言中,一些常用的变量,比如圆周率可以使用C语言的宏定义方式进行常量级别的定义。与头文件展开一样,宏定义也是在引用的位置进行变量展开。宏定义的方式为:#define 标识符 字符串
    例如我们定义:#define Max_length 1000
    条件编译:即我们可以让编译器根据我们设定的条件,让符合条件的代码参与编译,不符合条件的代码不参与编译。以此来实现我们对最后目标代码的控制(不参与编译的代码,实现的功能不会进入到目标代码中)。

  2. 编译,根据字面理解,就是对指定的C语言代码进行“翻译”的过程,并根据C语言中我们前面讲到的各种语法规则,在编译器的参与下,生成符合指定运行硬件的汇编代码。
    我们都明确,目标代码是要运行在硬件上,不管你是ARM,MIPS还是X86。每个不同的硬件,存在不同的汇编指令,编译的过程是要从C语言生成汇编指令,所以不同的硬件都会由其厂家或者其他编译器开发公司,提供符合对应硬件的编译器。我们常见的有X86下的GCC,ARM下的arm_cc和MIPS下的mips_gcc。

  3. 【汇编】
    汇编,一句话概括就是完成上一个阶段生成的汇编代码转换机器码。这个阶段,非底层的程序员不需要考虑, 编译器不会搞错的。也与c/c++开发者无关,但是我们可以利用反汇编来调试代码。

  4. 【链接】:
    C语言的源文件经过了预编译,编译和汇编,都已经转化为了目标文件。我们在代码开发过程中,引用的一些C语言前辈们开发的库文件也是以成型的目标文件的形式给出的。但是这些零散的二进制文件,彼此之间是零散分布的,需要一种方式将它们有机的结合在一起,形成一个可运行的统一的目标文件。那么这个过程,就是链接器的主要工作。
    关于链接中的动态库静态库问题。大家可以简单的理解为:静态库经过链接过程,会被打包进最后的可执行文件a.out文件;动态库只有在a.out文件正式开始运行的时候,才会载入到内存,参与运行。所以,静态链接后,a.out文件的大小往往大于动态链接后的a.out文件大小。
    在这里插入图片描述
    在visual studio中 通过编译和链接这两个步骤之后将会在文件中产生一个.exe可执行文件。这个可执行文件是由VS(C语言编译工具)软件生成的。当单击“执行”或者按下快键键Ctrl+F5时,执行的就是这个.exe文件。但是这个文件并不是由VS执行的,而是由CPU执行的。
    当单击“执行”按钮时,VS编译工具就会向操作系统发出请求,让操作系统执行.exe文件。而操作系统收到VS的请求时,就会调用CPU。执行的结果就是在显示器上输出,这就是此程序执行的过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言运行流程 的相关文章

  • CCPC-南阳比赛总结

    打铁归来 感触好多 记得英语课上 收到晓红老师的消息 说给我们争取下了国赛的名额 我们感觉好幸运 没想到最后打铁了 这个结果也不太意外 下面说下 这几天的行程 反思 下一步的目标 15号 淄博到济南 15 16号 济南 郑州 南阳 17号
  • 如何过滤 map

    获取 EntrySet 然后正常使用 stream 的 filter 过滤 Entry 最后再转为 Map 即可 对 map 过滤 filter Test public void testMapFilter Map
  • OCJP题库1Z0-851(21/30)

    这套题我参考了这篇文章 以及一些百度上找的内容 再加上自己的解释 总结下来的详解 第1题 1 Given a pre generics implementation of a method 11 public static int sum

随机推荐

  • 申请被拒模板 (六)

    这里只是模板 仅供学习 出现任何问题 与博主无关 Hi xxxxx We really appreciate the time and effort you took to connect with us and apply for the
  • nginx配置详解

    一 什么是nginx nginx是一款自由的 开源的 高性能的HTTP服务器和反向代理服务器 同时也是一个IMAP POP3 SMTP代理服务器 Nginx作为一个HTTP服务器进行网络的发布处理 另外Nginx可以作为反向代理进行负载均衡
  • 【数据分析】为什么要学习分析方法?

    为什么要学习分析方法 如果你有以下这些症状 没有数据分析意识 工作由拍脑袋决定 而不是靠数据分析来支持决策 统计时的数据分析 做了很多图表 却发现不了业务中存在的问题 只会使用工具的数据分析 谈起使用工具的技巧头头是道 但是面对问题 还是不
  • 用C++实现softmax函数(面试经验)

    背景 今天面试字节算法岗时被问到的问题 让我用C 实现一个softmax函数 softmax是逻辑回归在多分类问题上的推广 大概的公式如下 i n p u t
  • Unity的C#编程教程_56_Namespace 详解

    文章目录 Namespaces Tour of Namespaces Namespaces 命名空间使得我们可以组织和管理我们的代码库 假设我们设置一个脚本名叫 Weapon using System Collections using S
  • python整段代码注释-Python中注释(多行注释和单行注释)的用法实例

    Python中注释 多行注释和单行注释 的用法实例 发布时间 2020 09 30 23 18 32 来源 脚本之家 阅读 97 前言 学会向程序中添加必要的注释 也是很重要的 注释不仅可以用来解释程序某些部分的作用和功能 用自然语言描述代
  • main.c:9:21: fatal error: sqlite3.h: 没有那个文件或目录

    今天在 Ubuntu 里看别人代码时 头文件里面有个
  • 2023普华永道中国首席数据官调研

    导读 在中国2 500家最大的上市企业中 首席数据官或类似管理岗的渗透率仅为1 3 远低于全球27 的水平 首席数据官的推广任重道远 其中 金融行业和通讯 媒体与科技行业的首席数据官或类似管理岗的数量位居前两位 也与这几个行业的数字化转型发
  • 【100天精通Python】Day48:Python Web开发_WSGI网络服务器网关接口与使用

    目录 1 WSGI接口 1 1 CGI 简介 1 2 WSGI 简介 1 3 定义 WSGI 接口 1 3 1 应用程序 Application 1 3 2 服务器 Server 1 4 WSGI 接口的使用示例 1 5 WSGI接口的优势
  • bp网络拟合函数 matlab_基于RBF神经网络的曲线拟合

    目前 在人工神经网络的实际应用中 绝大部分的神经网络模型是采用误差逆传播 error BackPropagation BP 网络和它的变化形式径向基函数 Radial Basis Function RBF 神经网络 RBF网络是一种高效的前
  • 微信小程序使用image组件显示图片的方法

    本文实例讲述了微信小程序使用image组件显示图片的方法 分享给大家供大家参考 具体如下 1 效果展示 2 关键代码 index wxml 代码如下
  • Lightgbm 直方图优化算法深入理解

    一 概述 在之前的介绍Xgboost的众多博文中 已经介绍过 在树分裂计算分裂特征的增益时 xgboost 采用了预排序的方法来处理节点分裂 这样计算的分裂点比较精确 但是 也造成了很大的时间开销 为了解决这个问题 Lightgbm 选择了
  • ubuntu16.04 使用astra s摄像头

    Astra相机使用方法 官网链接 https orbbec3d com develop Astra相机 GitHub orbbec ros astra camera ROS wrapper for Astra camera 普通相机 Git
  • mac安装lrzsz后运行卡死解决办法

    lrzsz的安装配置具体参见 https segmentfault com a 1190000012166969 上述完成后 若可以正常使用 万事大吉 如出现卡死的情况 可以查看配置文件 usr local bin iterm2 recv
  • openwrt 之通过uci 设置参数

    在openwrt中 默认一种配置文件 默认的路径 etc config 在这里面的所有配置文件如需要修改只需使用uci 这个指令来修改 以下uci 指令参数 root xxxx uci Usage uci
  • ubuntu自带vim配色方案

    系统版本 ubuntu 16 04 LTS 刚开始用vim的时候 大家可能会觉得默认的语法高亮的颜色不合心意 不过对于vim来说 这并不是一个问题 其实vim的配色方案是可以更改的 既可以选择系统自带的配色方案 也可以从网上下载其它配色方案
  • 简单理解Hadoop(Hadoop是什么、如何工作)

    一 Hadoop主要的任务部署分为3个部分 分别是 Client机器 主节点和从节点 主节点主要负责Hadoop两个关键功能模块HDFS Map Reduce的监督 当Job Tracker使用Map Reduce进行监控和调度数据的并行处
  • linux下部署thinkphp5项目

    准备工作 购买一个linux服务器地址 安装好linux常用的ssh工具 我这边喜欢用xshell敲命令 用filezilla传输文件 这些工具只要到官网下载就好 速度很快的 1 安装phpstudy for linux 安装下载phpst
  • java:JSONArray转byte[]字节数组

    package com xxx huali hualitest json import com alibaba fastjson JSONArray import com alibaba fastjson util Base64 publi
  • C语言运行流程

    在上一篇文章visual studio如何运行并调试C语言代码中写了如何运行并调试代码 我们就明确一个事实 即不论是嵌入式系统 亦或是普通PC电脑 对于程序的运行硬件处理器只能识别0 1的二进制码 从类人语言的C代码 需要经过一系列的转换过