编译器的工作过程

简单的说,其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:

1.预处理阶段(也就是常说的切token)

2.词法与语法分析阶段

3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件)

4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息。(生成.exe文件)

编译器在编译时是以C文件为单位进行的,也就是说如果你的项目中一个C文件都没有,那么你的项目将无法编译。连接器是以目标文件为单位,它将一个或多个目标文件进行函数与变量的重定位,生成最终的可执行文件,在PC上的程序开发,一般都有一个main函数,这是各个编译器的约定。当然,你如果自己写连接器脚本的话,可以不用main函数作为程序入口!!!!

  (main .c文件 目标文件 可执行文件)

有了这些基础知识,再言归正传,为了生成一个最终的可执行文件,就需要一些目标文件,也就是需要C文件,而这些C文件中又需要一个main函数作为可执行程序的入口,那么我们就从一个C文件入手,假定这个C文件内容如下:

main.c函数

#include <stdio.h>
#include "mytest.h"

int main(int argc,char **argv)
{
    test = 25;
    printf("test.................%d\n",test);
    return 0;
}

mytest.h头文件内容如下:

int test;

现在以这个例子来讲解编译器的工作:

1.预处理阶段:编译器以C文件作为一个单元,首先读这个C文件,发现第一句与第二句是包含一个头文件,就会在所有搜索路径中寻找这两个文件,找到之后,就会将相应头文件中再去处理宏,变量,函数声明,嵌套的头文件包含等,检测依赖关系,进行宏替换,看是否有重复定义与声明的情况发生,最后将那些文件中所有的东东全部扫描进这个当前的C文件中,形成一个中间"C文件"。

2.编译阶段:在上一步中相当于将那个头文件中的test变量扫描进了一个中间C文件,那么test变量就变成了这个文件中的一个全局变量,此时就为这个中间C文件的所有变量、函数分配空间(原则上,在这里只能看到.h文件中函数、变量的声明,为变量和函数的形参等分配空间),将各个函数编译成二进制码,按照特定目标文件格式生成目标文件,在这种格式的目标文件中进行各个全局变量、函数的符号描述(编译器维护一个符号描述表),将这些二进制码按照一定的标准组织成一个目标文件。

3.连接阶段:将上一步成生的各个目标文件,根据一些参数,连接生成最终的可执行文件,主要的工作就是重定位各个目标文件的函数、变量等,相当于将个目标文件中的二进制码按一定的规范合到一个文件中。

时间: 2024-10-29 19:07:29

编译器的工作过程的相关文章

编译器的工作过程和原理

转帖: http://www.codeceo.com/article/compiler-process.html#0-youdao-1-33675-32553cecb956bf88a1550052113e506a 码要运行,必须先转成二进制的机器码.这是编译器的任务. 比如,下面这段源码(假定文件名叫做test.c). #include <stdio.h> int main(void) { fputs("Hello, world!\n", stdout); return 0

Nginx reopen reload作用及工作过程

http://www.iigrowing.cn/nginx-reopen-reload-zuo-yong-ji-gong-zuo-guo-cheng.html Nginx reopen reload作用及工作过程 2012-12-05  categories:nginx  author:sch 原创文章,转载请指明出处并保留原文url地址 一.Nginx简介 Nginx (“engine x”) 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器.Ngin

编译器知识--编译程序过程

定义: 编译程序(Compiler,compiling program)也称为编译器,是指把用高级程序设计语言书写的源程序,翻译成等价的机器语言格式目标程序的翻译程序.编译程序属于采用生成性实现途径实现的翻译程序.它以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言表示的目标程序作为输出.编译出的目标程序通常还要经历运行阶段,以便在运行程序的支持下运行,加工初始数据,算出所需的计算结果. 一.编译程序是一种动作,是根据编译原理技术,由高级程序设计语言编译器翻译成机器语言二进制代码行为

MapReduce程序的工作过程

还记得2.5年前就搭建好了Hadoop伪分布式集群,安装好Eclipse后运行成功了WordCount.java,然后学习Hadoop的步伐就变得很慢了,相信有很多小伙伴和我一样.自己对MR程序(特指Hadoop 1.x版本)的工作过程一直都不是很清楚,现在重点总结一下,为MR编程打好基础.由于MapReduce是基于HDFS的操作,因此要想深入理解MapReduce(解决的是分布式计算问题),首先得深入理解HDFS(解决的是分布式存储问题). 一. HDFS框架组成 HDFS采用master/

交换机的功能及工作过程

一.交换机概述: 交换机是一种工作在二层的设备,但是随着技术的不断进步,现在已经出现了诸如三层交换机,多层交换机产品.在本篇中讨论的是二层交换机的一些特性. 二.交换机的功能: 1.    地址学习 有些地方也叫做基于源MAC地址学习,这个功能主要就是学习和存储MAC地址. 2.    帧的转发/过滤 数据帧的转发主要是交换机能够根据MAC地址表来转发数据,过滤则是对一些受限制的数据进行阻止或丢弃. 3.    环路避免 由于交换机的某些特性会带来一些问题,比如形成环路,因此为了保证网络上数据的

测试或运维工作过程中最常用的几个linux命令?

大家在测试工作过程中,可能会遇到需要你去服务器修改一些配置文件,譬如说某个字段的值是1 则关联老版本,是0则关联新版本,这时候你可能就需要会下vi的命令操作:或者查看session设置的时长,可能需要cd到某个目录cat下某个文件.可能我们不需要精通linux,但是基础操作了解对大家的工作还是蛮有帮助的.今天TestYao就介绍几个常用的linux命令给大家认识: 1.ls命令 ls命令是列出目录内容(List Directory Contents)的意思,运行它就是列出文件夹里的内容,可能是文

servlet的作用和工作过程

servlet的作用: servlet能够使服务器根据运行时的情况动态生成web页面. 工作过程: 1 客户端向服务器端发送请求 2 服务器端将请求信息发送给Servlet 3 Servlet根据请求进行响应,产生响应的HTML语句,并将这些语句传回服务器 4 服务器将响应内容返回给客户端 Servlet内部采用线程的方式可以同时为多个请求服务,这是比CGI工作效率高的因素 Servlet完全运行在Java虚拟机上,所以同样具有平台无关性 Servlet是web容器的组件,所以要在web.xml

DHCP工作过程的六个主要步骤

对于学习DHCP来说,很重要的一部分就是对于DHCP工作过程的理解. DHCP分为两个部分:一个是服务器端,另一个是客户端. 所有客户机的IP地址设定资料都由DHCP服务器集中管理,并负责处理客户端的DHCP请求:而客户端则会使用从服务器分配下来的IP地址. 1. DHCP服务器IP分配方式 DHCP服务器提供三种IP分配方式: 自动分配(Automatic Allocation)自动分配是当DHCP客户端第一次成功地从DHCP服务器端分配到一个IP地址之后,就永远使用这个地址. 动态分配(Dy

煤泥烘干机工作过程中一些不足的问题

如今商场上的煤泥烘干机可以说现已达到了一个很高端的水平,可是经过查询发现仍旧有不少的疑问存在.商场上等待着各大机械设置配备铺排厂家研讨新的计划,来处理当时煤泥烘干机作业进程中一些缺少的疑问. 1.煤泥单调处置赏罚进程也存在疑问,易发作臭气,需求除尘脱臭处置赏罚,能耗或处置赏罚费用大,单调污泥的商场需求量动摇大,缺少销路,存在可燃性粉尘爆破的安全危险和设备严重磨损等技术疑问,煤泥单调处置赏罚本钱高; 2.热源地腐蚀性:有些技术直接将燃煤焚烧的烟气引进煤泥烘干机设置配备铺排,由于国内燃煤中普遍富含少