【C语言】翻译环境与运行环境

一、前言

  • 在我们学习C语言的时候,第一个接触的程序就是:在屏幕上打印” hello word! “,可当时的我们却未去深入的理解与感悟,一个程序代码是如何运行的;
  • 而这一期的博客,则是带着我们,通过C代码去理解源文件是如何生成可执行程序
  • 首先我们得总体的知道,源文件经过编译+链接生成可执行程序;
  • 编译的目的是编译器将所有的源文件,生成一个目标文件(windows中扩展名为.obj,Linux中扩展名是.o),目的是将C代码转换为计算机可识别的指令;
  • 链接是链接器将所有的源文件生成的目标文件与链接库(我们可以粗浅的认为,链接库是我们声明的头文件内容的实现目的地)链接在一起;
  • 编译又可分为:预处理(预编译)、编译、汇编。

二、问题探讨所使用的开发环境(只需了解现象即可

三、翻译环境

1.预处理
  • 预处理的过程,主要有以下四步:
  • 将头文件全部展开,此操作是递归进行的,也代表着,可以头文件中可以包含头文件
  • 将#define定义的符号与宏,全部进行替换
  • 去掉所有注释,所以注释是给我们程序员自己看的
  • 条件编译的处理,条件成立的代码留下,否则去掉
  • 添加行号与文件名标识,方便后续生成调试信息
  • 还有保留program信息
  • 代码例子:
2.编译
  • 编译的过程与目的:
  • 将代码通过扫描器,分割一个个的符号:关键字,操作符等等,然后进行词义分析、语义分析、语法分析。主要任务是判断类型,声明。有关的语法错误,则是在此阶段完成识别并进行报错。
  • 主要目的是:将C语言转换为汇编语言。
  • 代码例子
3.汇编
  • 汇编的过程与目的:
  • 链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤
  • 主要的目的是:将汇编语言转换为计算机语言。
  • 代码例子:
4.链接
  • 链接的目的:
  • 将多个目标文件与对应的链接库进行处理,生成一个可执行程序。

四、运行环境

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

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

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

相关文章

mac电脑安装redis教程

1、下载地址 Download | RedisRedisYou can download the last Redis source files here. For additional options, see the Redis downloads section below.Stable (7.2)Redis 7.2 …https://redis.io/download/#redis-downloads 2、安装 2.1 解压下载后的压缩文件 2.2 进入…

Vulnhub:WESTWILD: 1.1

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap enm4ulinux sumbclient get flag1 ssh登录 提权 横向移动 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 0…

LeetCode-236. 二叉树的最近公共祖先【树 深度优先搜索 二叉树】

LeetCode-236. 二叉树的最近公共祖先【树 深度优先搜索 二叉树】 题目描述:解题思路一:递归判断解题思路二:0解题思路三:0 题目描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖…

linux操作系统的进程状态

这个博客只是为了自己复习用的!!! 冯诺依曼体系结构 计算机是由一个一个硬件组成的 输入设备:键盘,鼠标,扫描仪,写板等等 中央处理器(CPU):含有运算器和控制器等 输出单…

【算法练习】27:冒泡排序学习笔记

一、冒泡排序的算法思想 原理:以升序为例,冒泡排序通过从左往右连续比较相邻元素,当发现左边比右边大就交换元素。从左往右依次比较完称为“一轮”,每轮结束之后就会固定一个元素。 时间复杂度:2层循环,所以…

不讲概念,讲实操,mysql 分表模糊查询、分页查询 及 merge 表的使用

1.Mysql merge合并表的要求 1.合并的分表必须是 MyISAM 引擎,MyISAN引擎是不支持事务的。2.Merge表只保证合表后数据唯一性,合表前的数据可能会存在重复。3.表的结构必须一致,包括索引、字段类型、引擎和字符集。4.删除 tb_member1 分表正确…

Python实现BOA蝴蝶优化算法优化卷积神经网络分类模型(CNN分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

[技术闲聊]我对电路设计的理解(三)

终于可以独立做项目了,是不是很激动,是不是为自己骄傲和自豪,应该的,奋斗那么久不就是为了站在山巅看看四周的风景嘛! 虽说山外还有山,但是此刻就在脚下的山巅上,怡然自得都是不过分的&#xff…

LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?实战演示(下篇)

引言 简介 编译Android可用的模型 转换权重 生成配置文件 模型编译 编译apk 修改配置文件 绑定android library 配置gradle 编译apk 手机上运行 安装 APK 植入模型 效果实测 0. 引言 清明时节雨纷纷,路上行人欲断魂。 小伙伴们好,我是《小…

9.动态规划——4.最长公共子序列(动态规划类的算法题该如何解决?)

例题——最长公共子序列(一) 分析 设最长公共子序列 d p [ i ] [ j ] dp[i][j] dp[i][j]是 S 1 S_1 S1​的前 i i i个元素,是 S 2 S_2 S2​的前 j j j个元素,那么有: 若 S 1 [ i − 1 ] S 2 [ i − 1 ] S_1[i-1]S_2[i-1] S1​[i−1]S2​[…

leetcode刷题-代码训练营-第7章-回溯算法1

回溯法模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果} }理解 从…

小林coding图解计算机网络|基础篇02|键入网址到网页显示,期间发生了什么?

小林coding网站通道:入口 本篇文章摘抄应付面试的重点内容,详细内容还请移步:小林coding网站通道 文章目录 孤单小弟——HTTP真实地址查询——DNS指南好帮手——协议栈可靠传输——TCP远程定位——IP两点传输——MAC出口——网卡送别者——交…

Linux是什么,该如何学习

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Linux的起源与发展 2、Linux在现代计算机领域…

Golang 内存管理和垃圾回收底层原理(一)

一、这篇文章我们来聊聊Golang内存管理和垃圾回收,主要注重基本底层原理讲解,进一步实战待后续文章 1、这篇我们来讨论一下Golang的内存管理 先上结构图 从图我们来讲Golang的基本内存结构,内存结构可以分为:协程缓存、中央缓存…

Excel 粘贴回筛选后的单元格不能完全粘老是少数据 ,有些单元格还是空的

环境: excel2021 Win10专业版 问题描述: excel 粘贴回筛选后的单元格不能完全粘老是少数据 有些单元格还是空的 复制选择筛选后A1-A10单元格 ,定位条件)(仅可见单元格)来访问,或者你可以使用…

mybatis-plus 表字段存在关键字的处理办法

一、问题复现 当数据库表中字段出现关键字时&#xff0c;若不做其他处理&#xff0c;mybatis-plus的BaseMapper并不会做其他的处理&#xff0c;最终导致SQL执行时&#xff0c;抛出SQL 语法错误。示例如下&#xff1a; Java查询语句 QueryWrapper<User> userQuery new …

Kubernetes(k8s)核心资源解析:Pod详解

Kubernetes核心资源解析&#xff1a;Pod详解 1、什么是Pod&#xff1f;2、Pod 的组成3、Pod 如何管理多个容器4、Pod 的网络5、Pod 的存储方式6、Pod 的工作方式6.1 自主式 Pod6.2 监控和管理 Pod6.3 Pod 的创建流程 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

解锁动态规划:从斐波那契到高效算法

动态规划&#xff08;Dynamic Programming, DP&#xff09;是解决优化问题的一种算法策略&#xff0c;它将一个复杂问题分解为更小的子问题&#xff0c;通过解决子问题来逐步找到复杂问题的最优解。动态规划适用于有重叠子问题和最优子结构性质的问题。接下来&#xff0c;我们通…

基于SSM的药店药品商城管理系统

介绍 本项目分为前后台&#xff0c;分为管理员与普通用户两种角色&#xff0c;管理员登录后台&#xff0c;普通用户登录前台&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,订单管理,客户管理,药品管理,类目管理等功能。用户角色包含以下功能&#xff1a; 用户首…

pycharm打包python文件为exe文件(图文教程)

1.安装pyinstaller库 pip3 install pyinstaller 2.使用pyinstaller 打包文件 首先确保Terminal命令行中&#xff0c;你的路径和你的项目是同一个路径 我的项目就是放在golden_dev中的。 3.命令行内输入打包代码 pyinstaller -F -w gold_miner.py gold_miner.py 是我的项目…