软件构建基础-->构建流程

软件的构建分解为4个步骤,分别是预处理(Prepressing),编译(Compilation),汇编(Assembly),链接(Linking)。

下面以C语言为例,分别对这4步做简单说明:

预处理

预处理主要是将源文件中以"#"开始命令进行处理,主要为:

1、将宏定义(#define)在源文件引用位置原封原样的展开(所以使用宏定义要多用括号打包整个定义)。

2、处理条件预编译(#ifdef ...),得出正确的条件流程。

3、在包含文件的预编译处(#include )将对应的头文件展开,如果头文件也有包含其他文件,则递归展开。

4、删除代码中的注释

5、添加行号和文件名标识,便于编译器调试或警告等可以显示行号

6、保留编译器设置指令(#pragma),用于编译器

预处理后的文件为".i"后缀,我们可以查看此文件来判断整理后的代码是否正确。

编译

编译就是把预处理过程的".i"文件处理为".s"汇编文件,这个过程会经历词法分析、语法分析、语义分析和优化步骤。

词法分析:

将代码逐个扫描,根据当前所使用语言的规则分离出关键字、标识符、特殊符号、字面量等,分类生成有序的表格。

语法分析:

根据使用语言的语法规则,将词法分析的表格进行语法检查,并生成语法树。语法树也是表明了一行代码中运行的优先级及顺序等。

若有语法错误,在这步就会报错。

语义分析:

将语法树进行语义分析,经过语言分析后,标识符的类型就能够被确定(判断是否需要强制转换等等)。

若有语义错误,在这步就会报错(比如两个指针相乘)。

优化:

将最后的语法树转换为中间代码后优化,最终生成和硬件有关的汇编代码。

汇编

汇编将编译生成的汇编文件根据硬件构架而转换成对应的机器码文件,也叫目标文件(Object File),为".o"后缀。

注意:此时汇编而成的文件中,内部变量及函数等的最终地址需要通过链接才能确定。

链接

链接将多个目标文件中指令及其对其他符号的地址引用修正,生成可执行的文件。

主要包括地址和空间分配(Address and Storage Allocation)、符号决议(Symbol Resolution)、重定位(Relocation)等步骤。

时间: 2024-11-09 05:04:32

软件构建基础-->构建流程的相关文章

雷观(十二):构建基础库,提升研发效率

观点:IT之所以迅速普及,进入到每个人的生活.一方面是由于,IT相关技术产品,给每个人带来了丰富的虚拟世界和娱乐生活.另一方面,它大大提升了大部分行业的生产效率.社会生产力的发展方向,就是时代的发展方向.   程序员等IT技术人员,在IT届的地位,就像IT在社会生活中的地位:不可或缺.普遍存在.生产力的关键. 作为一名自学6年多的程序员,对技术的追求从未曾放弃.但我也终究意识到,纯粹的技术无法带我到达理想境界,而生产力的提高才可以把我从繁杂的基础工作中解脱出来,可以把我带向幸福美好的生活中. 与

C#使用设计模式和软件设计原则构建应用程序 PartIII

依赖注入 这个原则的要点是什么.为什么你不能对类的实例进行再次硬编码?当我们编码,测试的时候,让我们关注一件很重要的事情.希望你知道单元测试并知道它的重要性.也许在你做任何编码之前你都应该首先设计你的测试,因此你应该很熟悉测试驱动开发.为了定义新功能你应该去写测试,你应该尝试去实现并开始编码直到测试通过.让我们先看看之前的文章的代码. public class DateBasedTaxFactory:ITaxFactory { Customer _customer; ITaxFactory _t

Oracle OAF 应用构建基础之实现控制器 (转)

原文地址: Oracle OAF 应用构建基础之实现控制器 设计一个OA Controller 如OA Framework Page解析中所描述的,OA Controller定义了web beans的行为.具体来说,编写控制器代码的目的是:•在运行时处理/初始化UI(包含那些通过编程方式添加的layout)•拦截或响应按钮按下之类的用户事件 控制器不应该包含任何业务逻辑:这应该属于模型类. 必备知识 通常来说,在提出如何设计控制器之前,应该思考一下是否需要创建控制器. 作为一条规则,应该只在绝对

Gradle笔记——构建基础

本篇文章主要介绍一下Gradle的构建基础. 它看起来似乎和android项目没多大关系.不能让人一下子理解android项目中的Gradle配置文件,可是这篇基础真的非常重要. 学习Gradle前,须要有一个Groovy语言的基础,以免被Groovy的语法困扰.反而忽略了Gradle的知识.这里有一个Groovy的简明中文教程文档,能够高速学习Groovy的一些语法:http://download.csdn.net/detail/maosidiaoxian/8049823 1 Projects

java并发编程实战学习笔记之对象的组合与基础构建模块

第四章 对象的组合 4.1 构建安全的类 4.2 实例封闭 @ThreadSafe public class PersonSet {     @GuardedBy("this") private final Set<Person> mySet = new HashSet<Person>();     public synchronized void addPerson(Person p) {         mySet.add(p);     }     pub

linux系统构建基础学习笔记——操作

linux系统构建 ********************************************************                  ---交叉编译环境构建--- 安装arm-linux-gcc-4.3.2 (交叉编译器) tar xzvf arm-linux-gcc-4.3.2.tgz -C /cd /usr/local/arm/4.3.2/bin./arm-linux-gcc -v在/etc/bashrc文件的最后添加如下一行:   export PATH=

[Java Concurrency in Practice]第五章 基础构建模块

基础构建模块 委托时创建线程安全类的一个最有效的策略,只需让现有的线程安全类管理所有的状态即可. 平台类库中包含了一个并发构建块的丰富集合,如线程安全的容器与同步工具. 5.1 同步容器类 分两部分,一是JDK1.0的Vector与Hashtable,另一个是JDK1.2才被加入的同步包装类Collections.synchronizedXxx工厂方法创建的.Collections.synchronizedXxx工厂方法构造出的容器返回的List与Set的iterator()与listItera

GeneXus DevOps 自动化构建和部署流程

以下视频详细介绍了GeneXus DevOps自动化构建和部署流程,包括通过MS Bulid来管理自动化流程,自动化的架构,以及在GeneXus Server上使用Jenkins做为自动化引擎. 视频链接:https://v.qq.com/x/page/e3048y6pl9e.html(视频为英文语音和英文字幕) 原文地址:https://www.cnblogs.com/genexusblog/p/12191319.html

IDEA + maven 零基础构建 java agent 项目

200316-IDEA + maven 零基础构建 java agent 项目 Java Agent(java 探针)虽说在 jdk1.5 之后就有了,但是对于绝大多数的业务开发 javaer 来说,这个东西还是比较神奇和陌生的:虽说在实际的业务开发中,很少会涉及到 agent 开发,但是每个 java 开发都用过,比如使用 idea 写了个 HelloWorld.java,并运行一下, 仔细看控制台输出 本篇将作为 Java Agent 的入门篇,手把手教你开发一个统计方法耗时的 Java A