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

苏州做网站的公司哪家好怎样推广

苏州做网站的公司哪家好,怎样推广,大淘客网站代码,安亭网站建设目录 引言 翻译环境与运行环境 翻译环境 1.翻译环境的简述 2.编译过程 2.1 预处理(预编译) 2.2 编译 2.2.1 词法分析 2.2.2 语法分析 2.2.3 语义分析 2.3 汇编 3.链接 运行环境 结束语 引言 C语言编译与链接过程是理解程序如何从代码转化…

目录

引言

翻译环境与运行环境

翻译环境

1.翻译环境的简述

2.编译过程

2.1 预处理(预编译)

2.2 编译

2.2.1 词法分析

2.2.2 语法分析

2.2.3 语义分析

2.3 汇编

3.链接

运行环境

结束语


引言

C语言编译与链接过程是理解程序如何从代码转化为可执行文件的关键。今天我们来学习一下C语言的编译与链接。

翻译环境与运行环境

在ANSI C(美国国家标准协会制定的C语言标准)的任何一种实现中,存在两种不同的环境。

1.翻译环境:在这个环境中源代码被转换成可执行的机器指令(二进制指令)。

2.执行环境:它用于实际执行代码。

翻译环境

1.翻译环境的简述

那么翻译环境是如何将源代码转换为可执行的机器代码的呢?接下来我们详细讲解一下翻译环境做了什么来实现需求。

翻译环境由编译和链接两个大的过程组成,编译又可以分为:预处理(也可以称之为预编译)、编译、汇编三个过程。

一个C语言的项目中可能由多个 .c 文件一起构建,那多个 .c 文件如何生成可执行程序呢?

1.多个 .c 文件单独经过编译器,编译处理生成对应的目标文件。

注:在 Windows 环境下的目标文件的后缀是 .obj,在 Linux 环境下目标文件的后缀是 .o

2.多个目标文件和链接库一起经过连接器处理生成最终的可执行程序。

3.链接库是指运行时库(它是支持程序运行的基本函数集合)或者第三方库。

如果再将编译器展开成3个部分,那么就会变成如下过程:

2.编译过程

2.1 预处理(预编译)

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

在 gcc 中,将 .c 文件处理成 .h 文件,命令如下:

gcc -E test.c -o test.i

预处理阶段主要处理那些源⽂件中#开始的预编译指令。比如:#include,#define,处理的规则如下:
将所有的 #define 删除,并展开所有的宏定义。
处理所有的条件编译指令,如: #if、#ifdef、#elif、#else、#endif 。
处理#include预编译指令,将包含的头文件的内容插⼊到该预编译指令的位置。这个过程是递归进行的,也就是说被包含的头文件也可能包含其他文件。
删除所有的注释
添加行号和文件名标识,方便后续编译器生成调试信息等。
或保留所有的#pragma的编译器指令,编译器后续会使用。
经过预处理后的.i文件中不再包含宏定义,因为宏已经被展开。并且包含的头文件都被插入到.i文件中。所以当我们无法知道宏定义或者头文件是否包含正确的时候,可以查看预处理后的.i文件来确认。

我们可以通过一段简单的代码来观察一下:

通过指令生成 test,i 文件:

test.i文件:

2.2 编译

编译过程就是将预处理后的文件进行一系列的:词法分析、语法分析、语义分析及优化,生成相应的汇编代码文件。
编译过程的命令如下:

gcc -S test.i -o test.s

我们输入指令查看一下该文件:

生成的这一大段代码就是汇编代码。

假设现在有这么一段代码:

array[index] = (index+4)*(2+6);

对这段代码进行编译时,编译器做了什么工作?

他们分别是:词法分析、语法分析、语义分析及优化

2.2.1 词法分析

将源代码程序被输入扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成⼀系列的记号(关键字、标识符、字⾯量、特殊字符等)。

上面程序进行词法分析后得到了16个记号:
 

记号类型记号类型
array标识符[左方括号
index标识符]右方括号
=赋值(左圆括号
index标识符+加号
4数字)右圆括号
*乘号(左圆括号
2数字+加号
6数字)右圆括号
2.2.2 语法分析

接下来语法分析器,将对扫描产生的记号进行语法分析,从而产生语法树。这些语法树是以表达式为节点的树

2.2.3 语义分析

语义分析器来完成语义分析,即对表达式的语法层面分析。编译器所能做的分析是语义的静态分
析。静态语义分析通常包括声明和类型的匹配,类型的转换等。

这个阶段会报告错误的语法信息

实际上,编译的过程是十分复杂的,这里也只能浅浅的描述一下这一过程。

2.3 汇编

汇编器是将汇编代码转转变成机器可执行的指令,每⼀个汇编语句几乎都对应一条机器指令。就是根据汇编指令和机器指令的对照表⼀⼀的进行翻译,也不做指令优化。

汇编器将汇编代码(接近人类可读的语言)转换成机器代码(二进制形式),这些机器代码是CPU可以直接执行的。

汇编的命令如下:

gcc -c test.s -o test.o

我们同样可以输入指令尝试去观察一下:

实际上,经过汇编处理后文件即为目标文件(test.o)为二进制文件,无法通过文本编辑器打开。

3.链接

链接是一个复杂的过程,链接的时候需要把⼀堆文件链接在一起才生成可执行程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。

链接解决的是⼀个项目中多文件、多模块之间互相调用的问题。

举个例子:

现在在一个C的项目中,有两个 .c文件(test.c和add.c),代码如下:

add.c:

int g_val = 2024;int add(int x, int y)
{return x + y;
}

test.c:

#include<stdio.h>//声明外部函数
extern int add(int x, int y);
//声明外部的全局变量
extern int g_val;int main()
{int a = 10;int b = 20;int c = add(10, 20);printf("%d\n", c);return 0;
}

为什么在 add.c 中定义的文件在 test.c 文件中声明一下就可以使用呢?

我们来简单了解一下:

经过前面的学习,我们知道每一个源文件(.c)经过编译过程后都会生成自己的目标文件( .o/.obj)。

test.c  经过编译器处理生成 test.o /test.obj
add.c  经过编译器处理生成 add.o /add.obj

我们在文件 test.c 中使用了文件 add.c 中的 add 函数和 g_val 变量。

在编译的过程中,会对代码中的符号进行符号的汇总,并形成相应的符号表,符号表中会存储符号相对应的地址。在产生 test.c 文件的符号表时,遇到只有声明而未定义的符号 add 和 g_val 时,会暂时将其地址搁置。

等待最后链接的时候由链接器根据引用的符号 add 在其他模块中查找 add 函数的地址,然后将 test.c 中所有引用到 add 的指令重新修正,让他们的目标地址为真正的 add 函数的地址,对于全局变量 g_val 也是类似的方法来修正地址。

这个地址修正的过程也被叫做:重定位。

我们现在已经对C语言程序的编译和链接过程有了一个大致的了解,但很多内部的细节是无法展示的。

比如:目标文件的格式 elf ,链接底层实现中的空间与地址分配,符号解析和重定位等。

运行环境

翻译环境结束后就到了运行环境,运行环境是一个十分复杂的,我们简单了解一下:

1. 程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
2. 程序的执行便开始。接着便调用main函数。
3. 开始执行程序代码。这个时候程序将使用⼀个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
4. 终止程序。正常终止 main 函数;也有可能是意外终止。

结束语

希望本文能帮助您更好地理解C语言程序的编译和链接过程,以及运行环境的基本概念。

感谢各位友友的阅读。

点赞、收藏和关注!!!

http://www.yidumall.com/news/70973.html

相关文章:

  • 电子商务网站的建设百度商城购物
  • 网站模板之家免费模板hyein seo官网
  • 用wordpress搭建网站百度关键词首页排名服务
  • 网站建设应走什么会计科目线上营销推广方案有哪些
  • 如何在网站上做评比宁波seo外包公司
  • 更新网站 是否要重启iis淘宝直通车推广怎么做
  • 怎么区分营销型网站it学校培训学校哪个好
  • 软件库合集资料网站手机百度正式版
  • 手机版网站如何做百度 营销怎么收费
  • 网站建设价格热线传播易广告投放平台
  • 网站开发能做什么整站优化推广
  • 建设银行信用卡账网站百度电脑版网址
  • 免费高清视频素材网站有哪些网站快速被百度收录
  • h5免费制作爱站网站长seo综合查询工具
  • 美国打不开国内网站百度网址大全网址导航
  • 图书馆网站结构怎么做产品营销网站建设
  • wordpress 3 企业主题seo网站关键词优化多少钱
  • 银川专业做网站公司企业网站模板
  • 企业准备做网站的准备工作百度seo简爱
  • 音速企业名录搜索软件东莞seo技术
  • 寻找做网站的合作伙伴北京软文范例
  • 2017网站风格互联网推广方式
  • 哪个网站可以做行程攻略杭州seo价格
  • 免费企业网站建设免费网站软件推荐
  • 哪些网站可以做h5互联网100个创业项目
  • 网站做微信小程序号码公司网站怎么建立
  • 学网站建设维护浏览器下载安装
  • wordpress的站点地址(url)百度手游app下载
  • 高校校园网站建设培训班培训心得模板
  • 互联网上市公司排名qq群排名优化软件购买