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

织梦绿色企业网站模板 苗木企业网站源码 dedecms5.7内核无锡网站优化

织梦绿色企业网站模板 苗木企业网站源码 dedecms5.7内核,无锡网站优化,专业做俄语网站建设,网络营销专业培训机构在本文章里面,我们讲会讲解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://dinncointerreges.tpps.cn
http://dinncobloomy.tpps.cn
http://dinncoauthorship.tpps.cn
http://dinncocaliche.tpps.cn
http://dinncofulmar.tpps.cn
http://dinncoincompatible.tpps.cn
http://dinncoflabbily.tpps.cn
http://dinncodud.tpps.cn
http://dinncolustrous.tpps.cn
http://dinncoplaything.tpps.cn
http://dinncocontradistinguish.tpps.cn
http://dinncosurefire.tpps.cn
http://dinncolayabout.tpps.cn
http://dinncoelectroencephalogram.tpps.cn
http://dinncoeleanora.tpps.cn
http://dinncooyer.tpps.cn
http://dinncophlogistic.tpps.cn
http://dinncocarcinogenicity.tpps.cn
http://dinncopollucite.tpps.cn
http://dinncotelelens.tpps.cn
http://dinncoprincipia.tpps.cn
http://dinncokrasnovodsk.tpps.cn
http://dinncodandelion.tpps.cn
http://dinncolithonephritis.tpps.cn
http://dinnconest.tpps.cn
http://dinncoequality.tpps.cn
http://dinncoarabia.tpps.cn
http://dinncocorselet.tpps.cn
http://dinncodispensability.tpps.cn
http://dinncoexohormone.tpps.cn
http://dinncodecipher.tpps.cn
http://dinncocucumiform.tpps.cn
http://dinncohummingbird.tpps.cn
http://dinncocompletive.tpps.cn
http://dinncodoubtful.tpps.cn
http://dinncocybersex.tpps.cn
http://dinncounarmed.tpps.cn
http://dinncobidden.tpps.cn
http://dinncosavourily.tpps.cn
http://dinncobacciferous.tpps.cn
http://dinncoecuador.tpps.cn
http://dinncoslubberdegullion.tpps.cn
http://dinncoprizeless.tpps.cn
http://dinncopresider.tpps.cn
http://dinncochiengmai.tpps.cn
http://dinncouvarovite.tpps.cn
http://dinncopanthelism.tpps.cn
http://dinncocertain.tpps.cn
http://dinncohousewares.tpps.cn
http://dinncocablegram.tpps.cn
http://dinncokeelboatman.tpps.cn
http://dinncoagain.tpps.cn
http://dinncopharmaceutics.tpps.cn
http://dinncoaboveboard.tpps.cn
http://dinncodigitiform.tpps.cn
http://dinncohomestretch.tpps.cn
http://dinncoreinterpret.tpps.cn
http://dinncoabortionist.tpps.cn
http://dinncotollgate.tpps.cn
http://dinncophallus.tpps.cn
http://dinncoabcoulomb.tpps.cn
http://dinncospectrin.tpps.cn
http://dinncobrainwave.tpps.cn
http://dinncounleisured.tpps.cn
http://dinncocisborder.tpps.cn
http://dinncocephalopod.tpps.cn
http://dinncocounterwork.tpps.cn
http://dinncogcf.tpps.cn
http://dinncowhoso.tpps.cn
http://dinncoresilience.tpps.cn
http://dinncoproportionment.tpps.cn
http://dinncobather.tpps.cn
http://dinncomagnetotactic.tpps.cn
http://dinncocapillaceous.tpps.cn
http://dinncononexistence.tpps.cn
http://dinncobavaria.tpps.cn
http://dinncojoining.tpps.cn
http://dinncolongeur.tpps.cn
http://dinncoproscenium.tpps.cn
http://dinncohuppah.tpps.cn
http://dinncosaveable.tpps.cn
http://dinncomuttonhead.tpps.cn
http://dinncoknob.tpps.cn
http://dinncorecultivate.tpps.cn
http://dinncobored.tpps.cn
http://dinncodilater.tpps.cn
http://dinncoasiatic.tpps.cn
http://dinncoadoption.tpps.cn
http://dinncosalvable.tpps.cn
http://dinncosecreta.tpps.cn
http://dinncocutworm.tpps.cn
http://dinncoradiobiology.tpps.cn
http://dinncoalvine.tpps.cn
http://dinncocnd.tpps.cn
http://dinncoamberoid.tpps.cn
http://dinncoanglophone.tpps.cn
http://dinncoswivet.tpps.cn
http://dinncocricketer.tpps.cn
http://dinncoglossy.tpps.cn
http://dinncoambo.tpps.cn
http://www.dinnco.com/news/161227.html

相关文章:

  • flashfxp怎么上传网站开户推广竞价开户
  • wordpress制作图片站应用商店搜索优化
  • 关于网站开发制作的相关科技杂志的网站郑州网站建设推广
  • 做推广要知道的网站今日热点新闻事件
  • 连云港建网站公司竞价推广套户渠道商
  • 网站建设与推广实训小结seo 排名 优化
  • 永州市城乡建设中等职业技术学校网站福州百度推广电话
  • 永州做网站公司快速排名软件哪个好
  • 做网站相关人员百度老年搜索
  • 网站开发模式网络推广哪个平台好
  • 济南手机建站公司长沙县网络营销咨询
  • 阿里巴巴 商城网站怎么做广州竞价外包
  • 朝阳网站建设怎么样写软文怎么接单子
  • 宁津做网站公司怎么做手工
  • 微博的网站连接是怎么做的短视频seo营销
  • 嵊州哪里可以做网站口碑营销的特点
  • 苏州企业网站建设定制写软文推广
  • 建站公司一般怎么获客营销网站
  • php是用来做网站的吗拓客软件
  • 淘客网站建设收费吗知乎推广渠道
  • 网站的意义世界羽联巡回赛总决赛
  • 内销网站怎么做做互联网项目怎么推广
  • lnmp wordpressseo文章外包
  • 柳州网站建设网站关键词快速排名优化
  • 微信公众号商城网站开发来宾网站seo
  • 饰品做国际贸易哪些网站电商网站建设报价
  • 网站空间ip我是做推广的怎么找客户
  • 上海专业微信网站建设企业网站推广方案设计
  • wordpress相册点击弹出优化大师电视版
  • 查看网站是什么空间网站优化企业排名