网站的标题怎么做吸引人,深圳成交型网站建设,seo就业前景如何,不利用网站怎么做调查问卷一#xff1a;程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中#xff0c;存在两个不同的环境。 第 1 种是翻译环境#xff0c;在这个环境中源代码被转换为可执行的机器指令。 第 2 种是执行环境#xff0c;它用于实际执行代码 也就是说#xff1a;↓ 1#xff1…一程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中存在两个不同的环境。 第 1 种是翻译环境在这个环境中源代码被转换为可执行的机器指令。 第 2 种是执行环境它用于实际执行代码 也就是说↓ 1翻译环境代码-二进制指令
2执行环境执行二进制指令
Q我们写的代码是文本信息而计算机执行的是二进制的指令这二者之间如何进行的转换
换句话说就是翻译环境中发生了什么才让代码-二进制指令 解释 我们写代码的文件叫作.c源文件会经过编译器生成目标文件不同环境和编译器的目标文件不同比如VS是.obj,Linux环境下的gcc是.o然后最后通过链接器把目标文件和链接库进行链接生成可执行程序。
这是一个在VS上写代码到生成可执行程序的过程编译器为我们做了很多才让我们能从源文件一下到目标文件所以博主选择在Linux环境下的gcc编译器下进行细节上的演示才能清楚的知道翻译环境到底发生了什么。
二翻译环境工作图 解释翻译环境分为四步
1预编译也叫作预处理
2编译
3汇编
4链接
三翻译环境工作的展示
前提准备
源文件创建及代码书写
①
我们创建一个在gcc中创建一个class110目录在其下创建一个源文件test.c在里面写上如图所示的代码 第一阶段预编译 ① 然后在终端对test.c这个源文件进行gcc -E -o test.i-E代表执行完预编译阶段就停止然后放在test.i这个文件 ②此时生成了test.i这个文件 ③将test.i和test.c进行对比 解释
将test.i和test.c进行对比我们能发现了第一阶段预编译的作用
1注释的删除
2头文件的包含test.i前面的800行就是#includestdio.h的内容
3#define符号的替换直接把M替换成了100
总结所有的预处理指令如文件包含、宏定义、条件编译等都是在预编译阶段完成的。
这些统称为文本操作 第二阶段编译 ①gcc -S test.i对test.i进行 -S执行完第二阶段编译就停止放进自动生成的test.s中 解释此时打开test.s发现全是汇编代码 所以第二阶段的工作是将代码翻译成汇编代码放进了自动生成的test.s中 第三阶段汇编 ①gcc -c test.c执行完第三阶段汇编就停止放进自动生成的目标文件test.o中
②打开test.o被警告 解释打开test.o发现其是二进制文件所以该阶段的功能将汇编指令翻译成了二进制指令
③强行打开目标文件test.o 解释ELF是一种文件的格式 需要用指令readelf来读取ELF格式的文件
④:用指令readelf来读取ELF格式的文件 解释此时返现我们需要输入一些选项-a,-h,-l.......来进行选择性的查看
⑤-a选项查看到段表 解释这就是段表也就是说ELF这种文件格式其实是按照一个一个的段来存储的这也是第四阶段链接中的功能合并段表中所谓的段表
⑥-s来查看符号表 解释
1此时发现符号表中有我们代码的全局变量g_val函数Add函数main库函数printf
2这些都被存储到了符号表中 这就是第三阶段汇编的另一个作用形成符号表那么符号表是做什么的在第四阶段里面有作用 第四阶段链接 ①gcc test.o -0 test(链接生成可执行程序test) ②打开可执行程序test 解释可执行程序test依旧是一个二进制文件也是可以用ELF打开的 四链接的功能讲解
①假设两个.c源文件 解释一个.c只是声明了Add函数一个.add有函数的定义
②链接的功能 解释
1每个源文件都在编译阶段 进行了符号汇总然后在汇编阶段进行了形成符号表即函数和对应的地址进行合并形成符号表test.c的 Add是声明所以地址是无效的
2在链接进行合并符号表把两个源文件的符号表进行合并
3Add的地址确认为有效地址add.c中的函数地址就叫作符号表的重定位