汕尾海丰建设规划局网站,wordpress有识图插件,北京网页设计公司兴田德润可以吗,龙轩导航编译与链接 翻译环境和执行环境翻译环境1.1预编译1.2编译1.3汇编#xff08;ASM#xff09;2.链接 执行环境最后给大家附上一张关于本节知识内容的图供大家更好理解~  … 编译与链接 翻译环境和执行环境翻译环境1.1预编译1.2编译1.3汇编ASM2.链接 执行环境最后给大家附上一张关于本节知识内容的图供大家更好理解~  欢迎来到小庄代码世界~ 喜欢的小伙伴记得一键三连哦 ૮(˶ᵔ ᵕ ᵔ˶)ა 引言我们平常写代码是否思考过在我们按下运行时c程序会发生些什么过程呢 事实上存在翻译和执行环境这篇文章让博主来分享分享请放心食用 翻译环境和执行环境 在ANSIC的任何⼀种实现中存在两个不同的环境 1.翻译环境 我们知道计算机看懂的是二进制这个环境就是用来将我们的源代码翻译成可执行的二进制指令 2.执行环境 该环境用于实际执行代码 具体如下图 接下来让博主对翻译环境进行详细讲解´༥
翻译环境
翻译环境是如何将源代码转换成二进制指令呢其实翻译环境由编译和链接两大板块组成而编译又细分为预处理(预编译)编译汇编三个阶段૮(˶ᵔ ᵕ ᵔ˶)ა
一个项目由多个源文件构成这些源文件经过编译阶段和编译器(cl.exe)处理生成对应的目标文件接着对应的目标文件在链接阶段经过连接器(link.exe)生成对应的可执行程序xx.exe文件这就是大致的翻译环境的流程。 1.windows系统目标文件的后缀为.obj,而linux下为.o 2.链接库链接库指的是将库文件编译后打包为一个二进制文件这些文件在调用的时候会加载到内存中。实际上一个或多个源文件转换为目标文件后这个文件所引用的外部符号需要通过链接来找缺失的地址这里我们做个小铺垫~ 我们可以将它理解为我们要借用的大哥的力量比如标准库函数等。 接下来我们先来了解翻译环境所拆分的三个阶段以linux环境gcc编译器为例 注对于.i和.s的中间文件他们是临时的用完会删除
1.1预编译
在预处理阶段源⽂件和头⽂件会被处理成为.i为后缀的⽂件。 在 gcc 环境下想观察⼀下对 test.c ⽂件预处理后的.i⽂件命令如下
gcc -E test.c -o test.i预编译阶段主要是对预处理指令进行处理#开头的都是预处理指令他们都是在这个阶段处理的比如#include #define该阶段特点是替换将预处理指令替换成它实际指向的内容
让我们来了解下他的替换规则 1.头文件的包含处理#include预编译指令将包含的头⽂件的内容插⼊到该预编译指令的位置。这个过程是递归进⾏的也就是说被包含的头⽂件也可能包含其他⽂件。 2.#define:它会将所有#define删除并展开它的定义。 3.注释所有注释都会被替换成空格 4.处理所有的条件编译指令如: #if、#ifdef、#elif、#else、#endif 5.或保留所有的#pragma的编译器指令编译器后续会使⽤。 经过预处理后的.i⽂件中不再包含宏定义因为宏已经被展开。并且包含的头⽂件都被插⼊到.i⽂件 中。所以当我们⽆法知道宏定义或者头⽂件是否包含正确的时候可以查看预处理后的.i⽂件来确认
最后我们总结一下预处理主要特点就是将预处理指令指向的实际内容进行替换⌯’▾’⌯
1.2编译
在编译这个阶段主要进行的是符号汇总(先来个铺垫)和将预处理后的⽂件进⾏⼀系列的词法分析、语法分析、语义分析及优化⽣成相应的汇编代码⽂件
编译过程的命令如下
gcc -S test.i -o test.s词法分析 词法分析完成的工作主要是识别记号将源代码程序被输⼊扫描器扫描器的任务就是简单的进⾏词法分析把代码中的字符分割成⼀系列的记号关键字、标识符、字⾯量、特殊字符等
array[index] (index4)*(26);上面的代码经过扫描后得到如下16个记号 语法分析 识别出记号后接下来语法分析器将对扫描产⽣的记号进⾏语法分析从⽽产⽣语法树。这些语法树是以表达式为节点的树 语义分析 由语义分析器来完成语义分析即对表达式的语法层⾯分析。编译器所能做的分析是语义的静态分 析。静态语义分析通常包括声明和类型的匹配类型的转换等。这个阶段会报告错误的语法信息。
联系我们之前的知识我们有链接错误运行错误编译错误。编译错误大多是语法错误就是从这而来由编译阶段来检查
经过3个阶段后所生成就是我们的汇编指令生成.s后缀文件 总结在编译阶段完成工作是将c语言源代码转换成汇编指令通过词法分析语法分析语义分析更好地理解代码。
1.3汇编ASM
汇编器是将汇编代码转转变成机器可执⾏的指令每⼀个汇编语句⼏乎都对应⼀条机器指令。就是根 据汇编指令和机器指令的对照表⼀⼀的进⾏翻译也不做指令优化。
总结汇编阶段的工作是将汇编代码翻译成二进制指令生成对应的目标文件
2.链接
链接是一个比较复杂的过程链接的时候需要把⼀堆⽂件链接在⼀起才⽣成可执⾏程序。链接过程主要包括地址和空间分配符号决议和重定位*等这些步骤。链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题
你是否一脸雾水( ͡° ʖ̯ ͡°)让博主来给你细细道来 符号汇总 你是否记得我们在讲编译时有讲到符号汇总这个工作 所谓符号就是程序中的变量名、函数名在编译阶段我们会把出现的符号给汇总到一起 形成符号表 什么是符号表 符号表是一种供编译器用于保存有关源程序构造的各种信息的数据结构。通俗讲就是存放我们符号属性信息比如它的存储位置类型和其他相关信息等符号表通常需要支持同一符号在一个程序的多重声明。 符号决议和重定位 我们先上图说话 这个过程就是符号决议了概括起来就是只要每个目标文件所引用符号都能在其目标文件中找到唯一定义整个链接过程就是正确的
通过了符号决议后就是进行重定位了修改唯一正确的属性信息 执行环境
前面的翻译官帮我们翻译完后计算机就能看懂一系统二进制指令了便可以开始执行程序了 程序必须载⼊内存中。在有操作系统的环境中⼀般这个由操作系统完成。在独⽴的环境中程序 的载⼊必须由⼿⼯安排也可能是通过可执⾏代码置⼊只读内存来完成。程序的执⾏便开始。接着便调⽤main函数开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈stack存储函数的局部变量和返回 地址。程序同时也可以使⽤静态static内存存储于静态内存中的变量在程序的整个执⾏过程 ⼀直保留他们的值. 4.终⽌程序。正常终⽌main函数也有可能是意外终⽌。 最后给大家附上一张关于本节知识内容的图供大家更好理解~
本次知识分享官就体验结束啦〃•ω‹〃小伙伴们喜欢的话支持小庄给俺点个关注点个收藏来个评论你们的支持是我更新的强大动力