文档章节

程序的处理步骤——预处理、编译、链接、运行

M
 MajorHuang
发布于 2017/04/12 20:28
字数 1442
阅读 25
收藏 0

程序的处理步骤——预处理、词法和语法分析、编译、链接、运行

源文件的编译过程包含两个主要阶段,而它们之间的转换是自动的。

先说说要实现一个程序功能要经历的步骤吧  
step1:当然就是在编辑窗口(用高级语言)输入你的原程序  (f.c)
step2:编译你的原程序  编译成计算机能够识别的2进制形式的目标代码(f.o)
step3:将上面的目标代码 输入内存与系统提供的库函数和其他一些目标代码相连接 连接成可以执行的exe文件 f.exe
step4:再将可以执行的exe文件调入内存运行

第一个阶段是预处理阶段(宏、文件包含、条件编译),在正式的编译阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中还有其他许多预处理指令
这个在编译之前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和操作系统环境的限制。一个环境需要的代码跟另一个环境所需的代码可能有所不同,因为可用的硬件或操作系统是不同的。在许多情况下,可以把用于不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。预处理器显示为一个独立的操作,但一般不能独立于编译器来执行这个操作。调用编译器会自动执行预处理过程,之后才编译代码。编译器为给定源文件输出的是机器码,执行这个过程需要较长时间。在对象文件之间并没有建立任何连接。对应于某个源文件的对象文件包含在其他源文件中定义的函数引用或其他指定项的引用,而这些函数或项仍没有被解析。同样,也没有建立同库函数的链接。实际上,这些函数的代码并不是文件的一部分。这些工作是由链接程序(有时称为链接编辑器)完成的。

 

编译方式是指利用事先编好的一个称为编译程序的机器语言程序,作为系统软件存放在计算机内,当用户将高级语言编写的源程序输入计算机后,编译程序便把源程序整个地翻译成用机器语言表示的与之等价的目标程序,然后计算机再执行该目标程序,以完成源程序要处理的运算并取得结果。


第二个是链接程序阶段把所有对象文件中的机器码组合在一起,并解析它们之间的交叉引用。它还集成了对象模块所使用的库函数的代码。这是链接程序的一种简化表示,因为这里假定在可执行模块中,模块之间的所有链接都是静态建立的。实际上有些链接是动态的,即这些链接是在程序执行时建立的。
链接程序静态地建立函数之间的链接,即在程序执行之前建立组成程序的源文件中所包含的函数链接。

动态建立的函数之间的链接(在程序执行过程中建立的链接)将函数编译并链接起来,创建另一种可执行模块—— 动态链接库或共享库。动态链接库中的函数链接是在程序调用函数时才建立的,在程序调用之前,该链接是不存在的。
动态链接库有几个重要的优点。一个主要的优点是动态链接库中的函数可以在几个并行执行的程序之间共享,这将节省相同函数占用的内存空间。另一个优点是动态链接库在调用其中的函数之前是不会加载到内存中的。也就是说,如果不使用给定动态链接库中的函数,该动态链接库就不会占用内存空间。

下面举出一些详细例子:

 
现在的Java是运行时编译。和C++的编译方式完全不同。所有的对象都是动态分配内存的,而且Java的优点在于你不用delete,内存撤销由虚拟机负责

在c++中对内存的管理分为三种:
(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多

 

 

本文转载自:http://blog.csdn.net/love_gaohz/article/details/6935857

共有 人打赏支持
M
粉丝 0
博文 1
码字总数 0
作品 0
深圳
私信 提问
“Hello,World”背后的故事

学习一门语言,经常都是从打印“Hello,World”开始的,打过招呼后,你便可以进入程序的新世界。 就拿经典的C语言举例,基本上每个程序员在上学时就可以闭着眼睛写下“Hello,World”,这也是...

2017/12/28
0
0
Python学习(一)解释器与编译器区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34696203/article/details/81332167 高级语言不能直接被机器所理解执行,所以都需要一个翻译的阶段, 解释...

好好学习天天向上天天再向上
2018/08/01
0
0
事实证明 Linux 永远是 number 1

嗨,我正在写一个简单的程序,我要让这个程序打印出一个整数。 够简单吧。真的吗? 我把它存成了 现在我编译并运行它: 糟糕!,编译失败,出现了下面的错误信息: 这是一个在线编译这段代码...

oschina
2014/01/09
12.2K
104
《深入理解操作系统》1——程序的执行过程

这一段时间比较忙,但是还是抽空看看这本书,大家都推荐看。 今天看了第一章《计算机系统漫游》,主要讲的是程序在计算机中的运行原理,这一部分讲的我大部分都知道。不过还是有很多不太清楚...

曹越
2012/04/09
0
0
linux下c++编程环境搭建,运行过程以及调试

安装g++环境 安装两个RPM包即可搞定 [root@localhost Desktop]# rpm -ivh /home/weiwei/Desktop/libstdc++-devel-4.4.5-6.el6.i686.rpm [root@localhost Desktop]# rpm -ivh /home/weiwei/D......

memristor
2014/04/27
0
4

没有更多内容

加载失败,请刷新页面

加载更多

linux 服务管理 Crontba、Ntpdate、Logrotate、Supervisor

crond linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。 另外, 由于使用者自己也可以设置计划任务,所以,...

狼王黄师傅
38分钟前
1
0
Sobel算子和Scharr滤波器

Sobel算子在数学上的本质是微分,对离散信号,是求邻域内的增量。 基本原理:在图像上,对图像信号在某点进行微分,表示图像的某个特征(如,强度、色调或者饱和度)在该点的变换程度。以强度...

yepanl
54分钟前
1
0
Jenkins API 使用

Jenkins 是一款流行的开源持续集成工具,可以用来做一些软件开发的自动化工作,如打包,测试,自动部署等。 Jenkins 中有 view 和 job 的概念, view 相当于组, job 则是具体的任务。 view...

YanWen
55分钟前
5
0
聊聊jest的NodeChecker

序 本文主要研究一下jest的NodeChecker NodeChecker jest-common-6.3.1-sources.jar!/io/searchbox/client/config/discovery/NodeChecker.java public class NodeChecker extends AbstractS......

go4it
今天
3
0
深入分析String.intern和String常量的实现原理

背景 字符串类型在实际应用场景中使用非常频繁,如果为每个字符串常量都生成一个对应的String对象,明显会造成内存的浪费,针对这一问题,虚拟机实现一个字符串常量池的概念,提供了如下实现...

群星纪元
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部