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

编译与链接

编译环境与运行环境

ANSI C 的任意一种实现中,存在两个不同的环境:

   1.翻译环境,这个环境中的源代码被转换为可执行的机器指令(二进制指令)

   2.执行环境,用于实际执行代码。

 翻译环境

翻译环境是由编译链接两大过程组成的  而编译又可以分解为:预处理、编译、汇编三个过程。

 源文件经过编译器生成对应的目标文件(.obj) 。
若多个.c文件单独经过编译器,编译处理生成对应的目标文件。
多个目标文件与链接库一起经过链接器生成最终可执行程序。
链接库是指运行库或者第三方库 

预处理 

预处理阶段,源文件和头文件会被处理成.i为后缀的文件

这个阶段,主要处理那些原文件中#开始的预编译指令 规则如下:

1 将所有的 #define 删除,并展开所有的宏定义。
2 处理所有的条件编译指令,如#if #iedef #elif 
3 处理 #include 预编译指令,将包含的头文件的内容插入到该预编译指令的位置,这个过程是递归进行的,也可能包含其他文件
4 删除所有注释
5 添加行号与文件名标识,方便后续编译器生成调试信息等
6 或保留所有的 #pragma 的编译器指令,编译器后续会使用。

编译

词法分析

它的任务是读取源代码,并将其分解成一系列的词法单元(tokens)。词法单元是源代码中的基本语法元素,例如关键字、标识符、常数、运算符和分隔符等。以下是词法分析的一些关键点:

  • 将源代码字符串转换成词法单元序列。
  • 忽略源代码中的空白、注释等无关紧要的部分。
  • 检测并报告词法错误,如非法字符或词法格式错误。
语法分析

语法分析的主要任务是验证程序的语法结构是否正确,并根据某种形式文法(通常是上下文无关文法)将词法分析阶段产生的词法单元(tokens)组织成一棵抽象语法树(Abstract Syntax Tree, AST)。

语义分析

它不仅检查源代码是否符合语法规则,还确保程序的行为符合开发者的意图。通过语义分析,编译器能够在程序运行之前发现许多潜在的错误,从而提高程序的质量和可靠性。(语义的静态分析:声明和类型的匹配 )

汇编

汇编器是将汇编代码转变为机器可执行指令,每一个汇编语句几乎都对应一条机器指令。就是根据汇编指令和机器指令的对照表一一进行翻译,也不做优化指令。    

运行环境

程序执行的过程:

1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序 的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。

2. 程序的执行便开始。接着便调用main函数。

3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回 地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程 一直保留他们的值。

4. 终止程序。正常终止main函数;也有可能是意外终止。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ChatTCP:一款离线TCP数据包分析macOS APP,致力于让分析TCP数据包像看聊天记录一样简单
  • 【QT】析构函数执行引发异常
  • MATLAB 中双引号 ““ 和单引号 ‘‘ 的区别详解
  • 设计模式-原型适配器桥接外观
  • Pixelmator Pro for Mac 专业图像处理软件【媲美PS的修图软件】
  • 【openwrt-21.02】T750 openwrt-21.02 Linux-5.4.238 input子系统----gpio-keys实现分析
  • MySQL5.7配置优化
  • Shell教程_在Bash_Shell中使用for循环详解
  • 《Rust避坑入门记》第1章:挖数据竞争大坑的滥用可变性
  • 2.SpringBoot项目pom.xml文件配置
  • ASP.NET Core 入门教学五 集成日志
  • Linux:手搓shell
  • 研究生深度学习入门的十天学习计划------第六天
  • 基于激光雷达的无人机相互避障
  • Linux---FTP文件服务器搭建及实战
  • python3.6+scrapy+mysql 爬虫实战
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • hadoop集群管理系统搭建规划说明
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JAVA并发编程--1.基础概念
  • js 实现textarea输入字数提示
  • JS笔记四:作用域、变量(函数)提升
  • miaov-React 最佳入门
  • sublime配置文件
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 设计模式 开闭原则
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 06-01 点餐小程序前台界面搭建
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​linux启动进程的方式
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ![CDATA[ ]] 是什么东东
  • # 安徽锐锋科技IDMS系统简介
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (1)Hilt的基本概念和使用
  • (4)STL算法之比较
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (办公)springboot配置aop处理请求.
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (蓝桥杯每日一题)love
  • (三)终结任务
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一) springboot详细介绍
  • (一) 初入MySQL 【认识和部署】
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m