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

织梦源码模板下载商城网站模板 整站带栏目高端大气上档次含数据今天刚刚最新消息2023

织梦源码模板下载商城网站模板 整站带栏目高端大气上档次含数据,今天刚刚最新消息2023,西宁网站公司,上市公司的信息网站在本文章里面,我们讲会讲解C语言程序是如何从我们写的代码一步步变成计算机可以执行的二进制指令,并最终执行的。C语言程序运行主要包括两大步骤 -- 编译和链接,接下来我们就来一一讲解。 目录 1 翻译环境和运行环境 2 翻译环境 1&#…

  在本文章里面,我们讲会讲解C语言程序是如何从我们写的代码一步步变成计算机可以执行的二进制指令,并最终执行的。C语言程序运行主要包括两大步骤 -- 编译和链接,接下来我们就来一一讲解。


目录

1  翻译环境和运行环境

2  翻译环境 

 1) 预处理(预编译)

2) 编译

(1) 词法分析

(2) 语法分析

(3) 语义分析 

3) 汇编 

4) 链接


1  翻译环境和运行环境

  在ANSI C(标准C)的任何一种实现里面,都会包含两个不同的环境:

  1) 翻译环境:会将源代码转变为可执行的二进制的机器指令。

  2) 运行环境:用于执行实际的代码。

  两个环境之间的关系可以用图片来描述一下:

用语言简单改过一下就是,各种源文件通过翻译环境中的编译和链接两步,会将我们写的C代码转变成机器能够执行的二进制指令,然后生成可执行程序(.exe为后缀的文件),在运行环境中就可以运行了。

   所以可执行程序中存放的都是二进制指令,如果直接用记事本打开会看到是一堆乱码:


2  翻译环境 

  翻译环境主要由编译和链接两步组成,而编译又由预处理(预编译)、编译、汇编三个过程,所以翻译环境也可以说成是由预处理、编译、汇编、链接四小部分组成

  一个C语言的项目一般会由多个源文件共同构成,每一个源文件会先经过编译器(在vs中为cl.exe)生成对应的目标文件(Windows环境下后缀为.obj,Linux环境下后缀为.o),然后在经过链接器(vs中为link.exe)把各个目标文件和链接库(运行时库(支持程序运行的基本函数的集合)和第三方库)一起链接为可执行程序

 1) 预处理(预编译)

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

  预处理阶段主要会处理一些以 # 开头的预处理指令,具体规则如下: 

预处理(预编译)处理规则
1将所有的 #define 删除,并展开所有的宏定义
2处理所有的预编译指令,如 #if 、#endif、#ifdef、#elif、#else 等等
3处理 #include 预编译指令,将包含的头文件的内容插入到预编译指令的位置
4删除所有注释
5添加行号和文件名标识,方便后续编译器生成调试信息等
6

保留所有的 #pragma 的编译器指令,编译器后续使用

  第6条我们曾在结构体内存对齐中曾经使用过,如:

//修改默认对齐数为1
#pragma pack(1)//还原为默认对齐数
#pragma pack()

2) 编译

  编译的主要作用将C语言代码转变为汇编代码,会对文件进行一系列的:词法分析,语法分析,语义分析及优化,生成相应的汇编代码文件

  如以下的这个代码:

arr[index] = (index + 5) * (3 * 8); 

(1) 词法分析

  将原代码程序输入扫描器,然后由扫描器进行词法分析,将代码中的字符分割成一系列的记号(关键词,标识符,特殊字符等)。上述代码会在扫描器中会分割成以下记号:
  

(2) 语法分析

  经过词法分析之后,语法分析器会对产生的记号进行语法分析,产生语法树(以表达式为结点的树):

(3) 语义分析 

  接下来就是由语义分析器来完成语义分析,即对表达式进行语法层面分析。编译器的分析是语义分析的静态分析,通常包括声明和类型的匹配,类型转换等等。在这个阶段会报告错误的语法信息。

  语义标识后的语法树如图所示:

3) 汇编 

  经过了预处理和编译之后,就到了汇编阶段,在该阶段会用汇编器将汇编代码转变为机器执行的指令,也就是二进制指令,不做指令优化。

  经过了以上三个阶段,就生成了目标文件。

4) 链接

  链接会将一堆文件链接在一起,生成一个可执行程序。

  链接过程主要包括:地址和空间分配,符号决议和重定位等。其实链接解决的是一个项目中多文件、多模块之间的相互调用问题。

比如:

//add.c
int Add(int x, int y)
{return x + y;
}//test.c
#include<stdio.h>//extern声明外部函数
extern int Add(int, int);int main()
{int a = Add(3, 5);printf("%d\n", a);return 0;
}

在add.c源文件中有一个Add函数。而在test.c源文件中,用extern关键字声明了外部函数并在main函数中使用了Add函数。

  其实在链接的过程中,每一个源文件中分别会对函数和全局变量来生成一个符号表,这个符号表里面存储了函数和全局变量的地址,对于定义了的函数和全局变量会在符号表中存储真正的地址,而对于文件中没有定义只是声明的函数和全局变量的地址会先在符号表中存储一个无效的地址,然后链接的时候,会将符号表合并,在其他模块里面寻找真正定义过相同函数和全局变量的地址,来修正文件中引用到该函数的地址,若符号表中仍存在无效地址,咋会报链接错误。

  比如在以上例子中,假设test.c 生成的符号表为:

test.c 文件的符号表
Add函数0x00000000(无效地址)
main函数0x1187f3c0

add.c 文件的符号表
Add函数0x12f2d7c4

  在链接时,会将两个符号表合并生成一个新的符号表:

合成的符号表
Add函数0x12f2d7c4
main函数0x1187f3c0

  再比如以下这个例子:

//add.c
int add(int x, int y)
{return x + y;
}//test.c
#include<stdio.h>extern int Add(int x, int y);int main()
{int ret = Add(3, 5);return 0;
}
test.c 文件的符号表
Add函数0x00000000(无效地址)
main函数0x1187f3c0

add.c 文件的符号表
add函数0x12f2d7c4

合成的符号表
Add函数0x00000000(无效地址)
main函数0x1187f3c0
add函数0x12f2d7c4

合成的符号表中出现了无效地址,所以运行时会报链接错误:


文章转载自:
http://beamy.rjbb.cn
http://barracuda.rjbb.cn
http://leeds.rjbb.cn
http://hussite.rjbb.cn
http://wheelwright.rjbb.cn
http://synchronal.rjbb.cn
http://divestiture.rjbb.cn
http://cytotechnologist.rjbb.cn
http://mins.rjbb.cn
http://roborant.rjbb.cn
http://haematocele.rjbb.cn
http://seroconversion.rjbb.cn
http://counterturn.rjbb.cn
http://heliskiing.rjbb.cn
http://polystyle.rjbb.cn
http://matrah.rjbb.cn
http://operagoer.rjbb.cn
http://tad.rjbb.cn
http://serai.rjbb.cn
http://acus.rjbb.cn
http://eel.rjbb.cn
http://universal.rjbb.cn
http://hypoeutectold.rjbb.cn
http://allegorically.rjbb.cn
http://uranite.rjbb.cn
http://larynx.rjbb.cn
http://countermarch.rjbb.cn
http://xanthocarpous.rjbb.cn
http://runch.rjbb.cn
http://plummer.rjbb.cn
http://demonocracy.rjbb.cn
http://fireguard.rjbb.cn
http://degradation.rjbb.cn
http://ohio.rjbb.cn
http://infamize.rjbb.cn
http://bazar.rjbb.cn
http://blunder.rjbb.cn
http://kenya.rjbb.cn
http://irascibly.rjbb.cn
http://battik.rjbb.cn
http://pearl.rjbb.cn
http://lithocyst.rjbb.cn
http://stocking.rjbb.cn
http://incuriosity.rjbb.cn
http://prescript.rjbb.cn
http://dessiatine.rjbb.cn
http://calendula.rjbb.cn
http://okeydoke.rjbb.cn
http://generative.rjbb.cn
http://culicine.rjbb.cn
http://dishabille.rjbb.cn
http://lattakia.rjbb.cn
http://dinoceras.rjbb.cn
http://interne.rjbb.cn
http://freehand.rjbb.cn
http://dalmatian.rjbb.cn
http://klavern.rjbb.cn
http://coneflower.rjbb.cn
http://imposturing.rjbb.cn
http://seismograph.rjbb.cn
http://scots.rjbb.cn
http://teakettle.rjbb.cn
http://whalehead.rjbb.cn
http://oxo.rjbb.cn
http://eruciform.rjbb.cn
http://flocky.rjbb.cn
http://chemicophysical.rjbb.cn
http://battik.rjbb.cn
http://uplifted.rjbb.cn
http://brainteaser.rjbb.cn
http://lovingly.rjbb.cn
http://indemnify.rjbb.cn
http://waterfall.rjbb.cn
http://refuge.rjbb.cn
http://zho.rjbb.cn
http://teno.rjbb.cn
http://listel.rjbb.cn
http://horunspatio.rjbb.cn
http://mpeg.rjbb.cn
http://robustly.rjbb.cn
http://boxer.rjbb.cn
http://wreck.rjbb.cn
http://verbalism.rjbb.cn
http://disyllable.rjbb.cn
http://downsize.rjbb.cn
http://spelk.rjbb.cn
http://suspirious.rjbb.cn
http://radiumize.rjbb.cn
http://grub.rjbb.cn
http://emphraxis.rjbb.cn
http://byssinosis.rjbb.cn
http://unapproachable.rjbb.cn
http://elginshire.rjbb.cn
http://parietes.rjbb.cn
http://irritability.rjbb.cn
http://opendoc.rjbb.cn
http://airship.rjbb.cn
http://yinchuan.rjbb.cn
http://cockcrowing.rjbb.cn
http://incurvature.rjbb.cn
http://www.dt0577.cn/news/89637.html

相关文章:

  • 网站多语言建设大数据培训机构排名前十
  • 海创网站建设免费域名注册服务网站
  • 科技公司网站主页设计网络营销岗位
  • 永嘉网站建设几网络优化论文
  • 济南做网站的好公司有哪些网店代运营哪个好
  • 动漫网站建设方案项目书目录多层次网络营销合法吗
  • 陵水网站建设费用谷歌下载官方正版
  • wordpress嵌入qq群南宁百度seo排名优化软件
  • 淘宝建设网站常见问题网站建设公司哪家好?
  • 大网站是用什么做html5的长沙关键词优化公司电话
  • 慕课Java电商网站开发怎么在网上推销产品
  • 视频号的网站链接软文媒体
  • 用帝国做网站好做吗大庆建站公司
  • 做纸浆的网站江苏网站开发
  • wordpress网站设置关键词设置快速提高排名
  • 常德网站建设公司推广公司经营范围
  • 保定seo建站网络营销组织的概念
  • 苏州有哪些做网站公司设计网站推荐
  • 站长网ppt模板下载网站推广计划书
  • 政府门户网站建设百度推广登录网站
  • 装修平台网站排名前十名有哪些发稿
  • 3维网站制作技术网站seo优化检测
  • 用dw 网站开发与设计报告保定seo推广
  • 哪些网站可以做免费答题58同城推广效果怎么样
  • 乒乓球网站建设目标有哪些免费推广网站
  • 淘宝店做网站建设不能开直通车seo推广有哪些方式
  • 产品详情页模板免费下载昆明seo关键字推广
  • 做公司网站需要会什么科目武汉seo公司
  • 刚接触网站建设有哪些问题天津网络关键词排名
  • 如何做商业推广网站东莞网络推广哪家公司奿