湖南智能网站建设费用,网站建站上市公司,长春火车站属于哪个区,wordpress带手机验证码目录 程序的翻译环境和执行环境
翻译环境分为两部分#xff0c;编译链接
第一步#xff1a;预编译#xff08;预处理#xff09;
第二步#xff0c;编译
第三步#xff1a;汇编
关于运行环境分为四点#xff1a;
关于链接库 程序的翻译环境和执行环境 在 ANSI C(标…目录 程序的翻译环境和执行环境
翻译环境分为两部分编译链接
第一步预编译预处理
第二步编译
第三步汇编
关于运行环境分为四点
关于链接库 程序的翻译环境和执行环境 在 ANSI C(标准C) 的任何一种实现中存在两个不同的环境。 *第1种是翻译环境。 在这个环境中源代码被转换为可执行的机器指令。 在编译器中以VS2019为例我们写的C语言代码都是文本的信息各种字符串数据结构体等站在人类的角度我们能够理解但是计算机不行代码需要翻译成计算机呢能够识别的指令二进制指令 *第2种是执行环境。它用于实际执行代码。 代码经过翻译环境后生成的二进制指令代码由执行环境来执行生成。 代码编译时生成可执行程序时的步骤 1. 组成一个程序的每个源文件通过编译过程分别转换成目标代码 object code 。 2. 每个目标文件由链接器 linker 捆绑在一起形成一个单一而完整的可执行程序。 3. 链接器同时也会引入标准 C 函数库中任何被该程序所用到的函数而且它可以搜索程序员个人的程序库将其需要的函数也链接到程序中。 简述来说: 每一个源文件.c都单独经过编译器进行编译生成目标文件.obj目标文件和链接库再通过链接器的处理这个过程就叫链接就生成了可执行程序.exe)。 如下图 翻译环境分为两部分编译链接 编译本身也分为几个阶段预处理 , 编译 汇编。 接下来我们用一个简单的代码源文件名test.c,使用gcc这个编辑器给大家演示整个过程
第一步预编译预处理
预编译的指令是gcc 源文件.c -E - 源文件名 .i 1. 预处理 选项 gcc - E test.c - o test.i 预处理完成之后就停下来预处理之后产生的结果都放在 test.i文件中,具体内容可看下图。 如下面的代码 源文件文件名 test.c#includestdio.h//定义全局变量赋值2023
int year 2023;
#define M 100
int main()
{int a M;printf(%d\n, M);return 0;
} 1.输入指令gcc test.c -E -test i 终端输出 2.观察test.c和test .i的内容 3.在test.i文件中查看 我们发现在test.i整个代码的末尾才是我们源代码的内容那前面的几百行代码又是什么呢是头文件stdio.h的整个内容包含进来了。同时细心的同学发现test.i中没有了注释也没有了宏定义的符号M了所以预处理的作用是 注释的删除#includestddio.h头文件的包含#define 符号的替换文本操作所以的预处理指令都是在预处理阶段处理的 第二步编译
编译指令gcc -S 源文件.c / gcc -S 源文件名 .i 编译 选项 gcc - S test.c 编译 选项 gcc -S test.i (编译时这两个文件都可以输入指令中都会生成文件test.s) 编译完成之后就停下来结果保存在 test.s 中。 我们输入 gcc - S test.c 为例 1.输入指令gcc -S test.c / gcc -S test.i 终端输出 2.生成了test.s文件的内容并展示test.s文件的内容 3.总结 上面黄圈部分就是test.s的内容里面就是汇编指令。编译的作用是把c语言代码翻译成汇编指令 。编译的方式是通过语法分析词法分析语义分析符号汇总等方式。总的来说编译就是把我们的c语言代码拆解分析然后翻译成汇编指令给下一步汇编的动作。 第三步汇编
汇编指令gcc -c 源文件.c / gcc -c 源文件名 .s 汇编 gcc - c test.c 汇编完成之后就停下来结果保存在 test.o 中。 1.输入指令gcc -c test.c / gcc-c test.s 终端输出 2.生成了test.o的目标文件 但是你会发现这是test.o目标文件存放的二进制文件编译器是不支持显示的的如果仍要打开如下图; 3. 总结 1.目标文件中存放的是二进制的指令 2.汇编是把汇编指令翻译成二进制指令 顺便提一下Linux下gcc编译产生的目标文件test.o可执行程序test都是按照ELF的这种文件格式存储的 最后以上过程完成了编译之后到链接过程
链接指令gcc 源文件名.o -o 新文件名 对目标文件进行链接。可生成一个可执行文件 1.输入指令gcc test.o -o vskkk 输出终端 2,对vskkk的内容进行查看 但是文件还是二进制的指令无法查看。 3.总结 链接的作用是 1.合并线段 2.符号表的合并和重定位 关于运行环境分为四点
运行环境相较于翻译环境就好理解的多了通俗理解有以下几点: 1. 程序必须载入内存中。在有操作系统的环境中一般这个由操作系统完成。在独立的环境中程序的载入必须由手工安排也可能是通过可执行代码置入只读内存来完成。 2. 程序的执行便开始。接着便调用 main 函数。 3.开始执行程序代码。这个时候程序将使用一个运行时堆栈stack存储函数的局部变量和回 地址。程序同时也可以使用静态 static 内存存储于静态内存中的变量在程序的整个执行过程 一直保留他们的值。 4. 终止程序。正常终止 main 函数也有可能是意外终止。 关于链接库 我们知道再写C语言代码时只要加上头文件 #includestdio.h 就可以直接使用库函数了比如scanf(),printf(),那为什么可以直接使用呢原因是我们把这些库函数都已经提前编译好打包好放在静态库中可以直接提供给我们比如我们熟悉的scanf函数如下图的打红圈内容标记部分后缀以LIB结尾的就是静态库.LIB库函数的静态库和目标文件在链接器中发生链接生成可执行程序。程序就可以运行啦。 以上就是全部内容了希望能帮助到大家如果可以也希望大家给博主点点赞支持一下谢谢。如果有错误的地方希望大家能在评论区批评指出我会进行订正的。