万网做网站怎么样,优化算法 网站,建筑材料交易平台,网站推广步骤有哪些你好#xff01;感谢支持孔乙己的新作#xff0c;本文就程序的编译及链接与大家分析我的思路。 希望能大佬们多多纠正及支持 #xff01;#xff01;#xff01; 个人主页#xff1a;爱摸鱼的孔乙己-CSDN博客 1.翻译译环境与运行环境 当我们进行程序设计时… 你好感谢支持孔乙己的新作本文就程序的编译及链接与大家分析我的思路。 希望能大佬们多多纠正及支持 个人主页爱摸鱼的孔乙己-CSDN博客 1.翻译译环境与运行环境 当我们进行程序设计时使用编译器、开发工具编写代码.c文件则需要在翻译环境通过编译将文件中源代码转换为可执行的机器指令二进制指令作用于运行环境实际执行代码。 1.1.翻译环境
顾名思义翻译环境是由编译和链接两大过程组成的编译又可拆分为预处理有些书籍或许称之为预编译、编译、汇编三个过程。
在一个包含多个.C文件的项目中多个.C文件单独进行编译并生成对应的目标文件Windows环境下的目标文件后缀是.objLinux环境下后缀是.o 多个目标文件和链接库一起经过链接器处理生成最终的可执行程序链接库是指运行时库支持程序运行的基本函数集合或者第三方库
接下来我们观察一下编译器的进程 首先编译过程始于源文件通常是以.c或.cpp结尾的代码文件。接下来这些源文件经过预处理生成一个中间文件通常是.i文件在这个阶段预处理会处理宏定义和文件包含等指令。随后预处理后的文件被编译生成汇编语言文件通常是 .s 文件。在这个过程中编译器将源代码转换为更接近机器语言的形式。接下来是链接阶段编译器将生成的汇编文件与标准库如 libc.a进行链接。链接器在这一阶段负责将所有目标文件和库文件合并最终生成可执行文件。最后经过链接器处理后输出的可执行文件便是用户可以运行的最终结果。 1.2.预处理预编译
在预处理阶段源文件和头文件会被处理为.i 为后缀的文件。在预处理阶段主要是处理源文件中#开始的预编译指令处理规则如下 • 将所有的 #define 删除并展开所有的宏定义。 • 处理所有的条件编译指令如 #if 、 #ifdef 、 #elif 、 #else 、 #endif 。 • 处理#include 预编译指令将包含的头⽂件的内容插⼊到该预编译指令的位置。 这个过程是递归进⾏的也就是说被包含的头⽂件也可能包含其他⽂件。 • 删除所有的注释 • 添加⾏号和⽂件名标识⽅便后续编译器⽣成调试信息等。 • 或保留所有的#pragma的编译器指令编译器后续会使⽤。 1.3.编译 编译过程就是将预处理的文件进行一系列操作词法分析、语法分析、语义分析及优化并生成相应的汇编代码文件。 1.3.1.词法分析 将源代码程序输入扫描器进行简单的词法分析把代码中字符分割成一系列的记号关键字、标识符、字面符与特殊符号 记号 类型array标识符【左方括号index 标识符 】右方括号赋值左圆括号index标识符加号4数字右圆括号*乘号左圆括号2数字加号6数字右圆括号 1.3.2.语法分析 接下来语法分析器将对扫描产⽣的记号进⾏语法分析从⽽产⽣语法树。这些语法树是以表达式为节点的树。 1.3.3.语义分析 由语义分析器来完成语义分析即对表达式的语法层⾯分析。编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配类型的转换等。这个阶段会报告错误的语法信息。 1.4.链接 链接作为一个复杂的过程链接时需要把一堆文件链接在一起方可生成可执行程序。链接的过程主要包括地址和空间分配符号决议和重定位这些步骤链接解决的是一个项目中多文件、多模块之间互相调用的问题。 1.5.运行环境 程序必须载入内存中在有操作系统的环境中一般这个由操作系统完成。在独立的环境中程序的载入必须由手工安排也可能是通过可执行代码置入只读内存来完成程序的执行便开始紧接着调用main函数开始执行程序代码这个时候程序将使用一个运行时堆栈stack存储函数的局部变量和返回地址。程序同时也可以使用静态static内存存储于静态内存中的变量在程序的整个执行过程一直保留他们的值终止程序。