深入理解软件构造系统

深入理解软件构造系统 pdf epub mobi txt 电子书 下载 2026

出版者:机械工业出版社华章公司
作者:Peter Smith
出品人:
页数:406
译者:仲田
出版时间:2012-6-15
价格:89.00元
装帧:平装
isbn号码:9787111382263
丛书系列:华章程序员书库
图书标签:
  • 软件工程
  • 软件开发
  • 构建
  • 计算机科学
  • 计算机
  • 软件架构
  • 编程
  • make
  • 软件构造
  • 系统设计
  • 编程语言
  • 软件工程
  • 系统架构
  • 开发方法
  • 代码结构
  • 模块设计
  • 可维护性
  • 可靠性
想要找书就要到 图书目录大全
立刻按 ctrl+D收藏本页
你会得到大惊喜!!

具体描述

构造系统在软件开发过程中处于核心地位,它的正确性和性能,在一定程度上决定了软件开发成果的质量和软件开发过程的效率。本书作者作为一名软件构造系统专家,总结了自己在构造系统开发和维护方面的多年经验,对软件构造系统的原理进行了深入浅出的剖析,并通过各种实际使用场景,对几种最流行的构造工具进行了对比分析,另外还讨论了构造系统的性能优化、规模提升等高级主题。

本书分为四部分。第一部分:基础知识,第1~5章分别从构造系统的高层概念、基于Make的构造系统、程序的运行时视图、文件类型与编译工具、子标的与构造变量等方面介绍构造系统的概念和相关主题。第二部分:构造工具,第6~10章结合实际场景案例,对GNU Make、Ant、SCons、CMake和Eclipse IDE这五种构造工具进行分析比较,品评优劣,帮助读者了解构造工具的当前状况,并理解每种工具的优缺点。第三部分:高级主题,第11~16章对依赖关系、元数据、软件打包与安装、构造机器、工具管理等高级主题进行讨论,帮助读者理解关于建设构造系统的许多高级主题,并了解最佳实践。第四部分:提升规模,第17~19章讨论了在大规模构造系统的环境下,如何降低复杂性,提高构造运行速度,帮助读者理解如何设计出能够适应规模增长的小型构造系统,从而对软件构造系统有更好的认识。

本书适合软件开发相关人员,包含软件开发人员、项目经理、软件构造专业人士等阅读。

作者简介

目录信息

对本书的赞誉
译者序
前 言
致 谢
作者介绍
第一部分 基础知识
第1章 构造系统概述2
1.1 什么是构造系统2
1.1.1 编译型语言3
1.1.2 解释型语言3
1.1.3 Web应用4
1.1.4 单元测试5
1.1.5 静态分析5
1.1.6 文档生成6
1.2 构造系统的各个组成部分6
1.2.1 版本控制工具7
1.2.2 源树与目标树7
1.2.3 编译工具和构造工具8
1.2.4 构造机器9
1.2.5 发布打包与目标机器9
1.3 构造过程和构造描述11
1.4 如何使用构造系统12
构造管理工具12
1.5 构造系统的质量13
本章小结14
第2章 基于Make的构造系统15
2.1 Calculator示例15
2.2 创建一个简单的makefile17
2.3 对这个makefile进行简化19
2.4 额外的构造任务20
2.5 框架的运用21
本章小结23
第3章 程序的运行时视图24
3.1 可执行程序24
3.1.1 原生机器码25
3.1.2 单体系统镜像25
3.1.3 程序完全解释执行26
3.1.4 解释型字节码26
3.2 程序库28
3.2.1 静态链接28
3.2.2 动态链接29
3.3 配置文件和数据文件30
3.4 分布式程序30
本章小结31
第4章 文件类型与编译工具33
4.1 C/C++34
4.1.1 编译工具34
4.1.2 源文件35
4.1.3 汇编语言文件37
4.1.4 目标文件38
4.1.5 可执行程序40
4.1.6 静态程序库40
4.1.7 动态程序库41
4.1.8 C++编译42
4.2 Java43
4.2.1 编译工具43
4.2.2 源文件44
4.2.3 目标文件45
4.2.4 可执行程序47
4.2.5 程序库48
4.3 C#48
4.3.1 编译工具49
4.3.2 源文件49
4.3.3 可执行程序51
4.3.4 程序库53
4.4 其他文件类型55
4.4.1 基于UML的代码生成56
4.4.2 图形图像57
4.4.3 XML配置文件58
4.4.4 国际化与资源绑定58
本章小结59
第5章 子标的与构造变量60
5.1 针对子标的进行构造61
5.2 针对软件的不同版本进行构造62
5.2.1 指定构造变量63
5.2.2 对代码的定制调整65
5.3 针对不同的目标系统架构进行构造68
5.3.1 多重编译器68
5.3.2 面向指定平台的文件/功能69
5.3.3 多个目标树69
本章小结71
第二部分 构造工具
现实场景75
场景1:源代码放在单个目录中75
场景2:源代码放在多个目录中76
场景3:定义新的编译工具76
场景4:针对多个变量进行构造77
场景5:清除构造树77
场景6:对不正确的构造结果进行调试78
第6章 Make79
6.1 GNU Make编程语言80
6.1.1 makefile规则:用来建立依赖关系图80
6.1.2 makefile规则的类型81
6.1.3 makefile变量82
6.1.4 内置变量和规则84
6.1.5 数据结构与函数85
6.1.6 理解程序流程87
6.1.7 进一步阅读资料90
6.2 现实世界的构造系统场景90
6.2.1 场景1:源代码放在单个目录中90
6.2.2 场景2(a):源代码放在多个目录中92
6.2.3 场景2(b):对多个目录进行迭代式Make操作93
6.2.4 场景2(c):对多个目录进行包含式Make操作96
6.2.5 场景3:定义新的编译工具101
6.2.6 场景4:针对多个变量进行构造102
6.2.7 场景5:清除构造树104
6.2.8 场景6:对不正确的构造结果进行调试105
6.3 赞扬与批评107
6.3.1 赞扬107
6.3.2 批评108
6.3.3 评价109
6.4 其他类似工具110
6.4.1 Berkeley Make110
6.4.2 NMake111
6.4.3 ElectricAccelerator和Spark Build111
本章小结113
第7章 Ant115
7.1 Ant编程语言116
7.1.1 比“Hello World”稍多一些116
7.1.2 标的的定义和使用118
7.1.3 Ant的控制流119
7.1.4 属性的定义120
7.1.5 内置的和可选的任务122
7.1.6 选择多个文件和目录125
7.1.7 条件126
7.1.8 扩展Ant语言127
7.1.9 进一步阅读资料128
7.2 现实世界的构造系统场景129
7.2.1 场景1:源代码放在单个目录中129
7.2.2 场景2(a):源代码放在多个目录中130
7.2.3 场景2(b):多个目录,多个build.xml文件130
7.2.4 场景3:定义新的编译工具133
7.2.5 场景4:针对多个变量进行构造136
7.2.6 场景5:清除构造树140
7.2.7 场景6:对不正确的构造结果进行调试141
7.3 赞扬与批评142
7.3.1 赞扬143
7.3.2 批评143
7.3.3 评价144
7.4 其他类似工具144
7.4.1 NAnt144
7.4.2 MS Build145
本章小结146
第8章 SCons147
8.1 SCons编程语言148
8.1.1 Python编程语言148
8.1.2 简单编译151
8.1.3 管理构造环境154
8.1.4 程序流程和依赖关系分析157
8.1.5 决定何时重新编译158
8.1.6 扩展该语言160
8.1.7 其他有趣的特性162
8.1.8 进一步阅读资料163
8.2 现实世界的构造系统场景163
8.2.1 场景1:源代码放在单个目录中163
8.2.2 场景2(a):源代码放在多个目录中163
8.2.3 场景2(b):多个SConstruct文件164
8.2.4 场景3:定义新的编译工具165
8.2.5 场景4:针对多个变量进行构造167
8.2.6 场景5:清除构造树168
8.2.7 场景6:对不正确的构造结果进行调试169
8.3 赞扬与批评171
8.3.1 赞扬171
8.3.2 批评172
8.3.3 评价173
8.4 其他类似工具173
8.4.1 Cons173
8.4.2 Rake174
本章小结176
第9章 CMake177
9.1 CMake编程语言178
9.1.1 CMake语言基础178
9.1.2 构造可执行程序和程序库179
9.1.3 控制流182
9.1.4 跨平台支持184
9.1.5 生成原生构造系统185
9.1.6 其他有趣的特性以及进一步阅读资料190
9.2 现实世界的构造系统场景191
9.2.1 场景1:源代码放在单个目录中191
9.2.2 场景2:源代码放在多个目录中191
9.2.3 场景3:定义新的编译工具192
9.2.4 场景4:针对多个变量进行构造193
9.2.5 场景5:清除构造树194
9.2.6 场景6:对不正确的构造结果进行调试194
9.3 赞扬与批评195
9.3.1 赞扬195
9.3.2 批评195
9.3.3 评价196
9.4 其他类似工具196
9.4.1 Automake196
9.4.2 Qmake197
本章小结197
第10章 Eclipse199
10.1 Eclipse的概念和GUI199
10.1.1 创建项目200
10.1.2 构造项目206
10.1.3 运行项目210
10.1.4 使用内部项目模型212
10.1.5 其他构造特性213
10.1.6 进一步阅读资料214
10.2 现实世界的构造系统场景215
10.2.1 场景1:源代码放在单个目录中215
10.2.2 场景2:源代码放在多个目录中216
10.2.3 场景3:定义新的编译工具217
10.2.4 场景4:针对多个变量进行构造217
10.2.5 场景5:清除构造树220
10.2.6 场景6:对不正确的构造结果进行调试220
10.3 赞扬与批评221
10.3.1 赞扬221
10.3.2 批评221
10.3.3 评价222
10.4 其他类似工具222
本章小结224
第三部分 高级主题
第11章 依赖关系226
11.1 依赖关系图227
11.1.1 增量式编译228
11.1.2 完全、增量式和子标的构造228
11.2 依赖关系错误导致的问题229
11.2.1 问题:依赖关系缺失导致运行时错误229
11.2.2 问题:依赖关系缺失导致编译错误230
11.2.3 问题:多余的依赖关系导致大量不必要的重新构造231
11.2.4 问题:多余的依赖关系导致依赖关系分析失败231
11.2.5 问题:循环依赖关系232
11.2.6 问题:以隐式队列顺序替代依赖关系232
11.2.7 问题:Clean标的什么也清除不了233
11.3 步骤一:计算依赖关系图233
11.3.1 获取确切的依赖关系234
11.3.2 把依赖关系图缓存起来236
11.3.3 对缓存的依赖关系图进行更新237
11.4 步骤二:判断哪些文件已过期239
11.4.1 基于时间戳的方法240
11.4.2 基于校验和的方法241
11.4.3 标志参数比较242
11.4.4 其他高级方法243
11.5 步骤三:为编译步骤排定队列顺序243
本章小结246
第12章 运用元数据进行构造247
12.1 调试支持247
12.2 性能分析支持249
12.3 代码覆盖分析支持250
12.4 源代码文档化251
12.5 单元测试253
12.6 静态分析256
12.7 向构造系统加入元数据257
本章小结258
第13章 软件打包与安装259
13.1 归档文件260
13.1.1 用于打包的脚本260
13.1.2 其他归档文件格式262
13.1.3 对打包脚本的改进263
13.2 包管理工具265
13.2.1 RPM包管理工具格式265
13.2.2 rpm build过程266
13.2.3 RPM规格文件示例267
13.2.4 根据规格文件创建RPM文件272
13.2.5 安装RPM示例274
13.3 定制式GUI安装工具275
13.3.1 Nullsoft Scriptable Install System(NSIS)276
13.3.2 安装工具脚本277
13.3.3 定义安装页面280
13.3.4 许可授权页面281
13.3.5 选择安装目录282
13.3.6 主要组件282
13.3.7 可选组件283
13.3.8 定制页面285
13.3.9 安装页面和卸载程序286
本章小结288
第14章 版本管理289
14.1 对哪些东西进行版本控制290
14.1.1 构造描述文件290
14.1.2 对工具的引用292
14.1.3 大型二进制文件296
14.1.4 对源树的配置296
14.2 哪些东西不应当放到源树中297
14.2.1 生成的文件被保存到源树中297
14.2.2 生成的文件被纳入到版本控制中299
14.2.3 构造管理脚本299
14.3 版本编号300
14.3.1 版本编号体系300
14.3.2 协调并更新版本号301
14.3.3 版本号的保存与检索302
本章小结303
第15章 构造机器305
15.1 原生编译与跨平台编译306
15.1.1 原生编译306
15.1.2 跨平台编译306
15.1.3 异构环境307
15.2 集中式开发环境307
15.2.1 构造机器为何有差异308
15.2.2 管理多个构造机器310
15.3 开源开发环境312
15.4 GNU Autoconf315
15.4.1 高层次工作流315
15.4.2 Autoconf示例317
15.4.3 运行autoheader和autoconf319
15.4.4 在构造机器上运行configure脚本320
15.4.5 使用配置信息322
本章小结323
第16章 工具管理324
16.1 工具管理的规则324
16.1.1 规则1:做笔记324
16.1.2 规则2:对源代码进行版本控制325
16.1.3 规则3:定期升级工具326
16.1.4 规则4:对工具的二进制文件进行版本控制327
16.1.5 对规则的破坏329
16.2 编写自己的编译工具329
用Lex和Yacc编写定制工具330
本章小结332
第四部分 提升规模
第17章 降低最终用户面对的复杂性334
17.1 构造框架334
17.1.1 面向开发人员的构造描述335
17.1.2 面向框架的构造描述336
17.1.3 惯例优先于配置336
17.1.4 构造工具示例:Maven337
17.2 避免支持多个构造变量的原因338
17.2.1 需要测试更多的构造变量338
17.2.2 代码会变得混乱339
17.2.3 构造时间会增多340
17.2.4 需要更多磁盘空间340
17.3 降低复杂性的各种技术方法340
17.3.1 使用现代构造工具340
17.3.2 自动检测依赖关系341
17.3.3 把生成的文件放在源树之外341
17.3.4 确保正确清除构造树341
17.3.5 碰到第一个错误即中止构造342
17.3.6 提供有意义的错误信息343
17.3.7 校验输入参数343
17.3.8 不要把构造脚本搞得过分复杂344
17.3.9 避免使用晦涩的语言特性344
17.3.10 不要用环境变量控制构造过程345
17.3.11 确保构造形成的发布版与调试版保持相似345
17.3.12 准确显示正在执行的命令346
17.3.13 把对工具的引用纳入版本控制347
17.3.14 把构造指令纳入版本控制347
17.3.15 自动检测编译标志参数的变化347
17.3.16 不要在构造系统中调用版本控制工具347
17.3.17 尽量频繁地进行持续集成348
17.3.18 统一使用一种构造机器348
17.3.19 统一使用一种编译器348
17.3.20 避免遗留#ifdefs的垃圾代码348
17.3.21 使用有意义的符号名349
17.3.22 删除垃圾代码349
17.3.23 不要复制源文件350
17.3.24 使用统一的构造系统350
17.4 对构造系统进行规划充分、人力充足的改进351
本章小结352
第18章 管理构造规模353
18.1 单体模型构造存在的问题354
18.2 组件式软件355
18.2.1 使用组件的好处357
18.2.2 组件到底是什么358
18.2.3 把多个组件集成到单个产品中361
18.3 人员和过程管理364
18.3.1 开发团队的结构365
18.3.2 组件版本队列管理367
18.3.3 管理组件缓存368
18.3.4 协调软件新特性的开发370
18.4 Apache Ivy372
本章小结373
第19章 更快的构造375
19.1 度量构造系统性能375
19.1.1 启动阶段的性能度量375
19.1.2 编译阶段的性能度量382
19.1.3 性能度量工具386
19.1.4 修正问题:改进性能388
19.2 构造减免:消除不必要的重新构造389
19.2.1 目标文件缓存389
19.2.2 智能依赖关系391
19.2.3 构造减免的其他技术方法395
19.3 并行396
19.3.1 构造集群/云396
19.3.2 并行构造工具397
19.3.3 对可伸缩性的限制398
19.4 减少磁盘使用398
本章小结400
参考文献401
· · · · · · (收起)

读后感

评分

评分

评分

评分

评分

用户评价

评分

**评价四:** 这本书的叙事结构非常精妙,它采取了一种自下而上的构建方式,从最基本的构件单元开始,逐步搭建起宏伟的软件大厦。我特别喜欢其中穿插的那些关于“早期编程思想家”的轶事,这些历史背景的补充,使得那些看似枯燥的理论拥有了鲜活的生命力。它成功地将计算机科学中最核心的几个难题——并发性、安全性和可维护性——统一在一个连贯的理论框架下进行讨论。作者对并发控制的讲解,避开了传统的锁机制的表面讨论,转而深入探讨了状态隔离的必要性,这让我对多线程编程的理解提升到了一个新的维度。整本书的排版和插图设计也十分考究,图表的引导作用极强,往往一个精心绘制的流程图胜过千言万语的文字描述。读完后,我有一种感觉,过去我写代码时总是在“猜”代码的运行结果,而现在,我能更自信地“断言”代码的行为,这种信心的转变,是这本书给予我的最大馈赠。

评分

**评价二:** 这本书给我的感觉,就像是拿到了一份来自软件工程“黄金时代”的秘密蓝图。它没有过多渲染时髦的技术名词,而是专注于那些永恒不变的、支撑起大型复杂系统的核心原则。我之前总觉得模块化设计是一个模糊的概念,读完关于“信息隐藏”和“强内聚、弱耦合”的章节后,我才真正理解了这两者之间的辩证关系。书中通过一系列富有洞察力的案例分析,展示了如何在实际开发中权衡不同设计选择的代价。比如,作者对错误处理机制的描述,简直是一部如何优雅地应对软件世界中“不可预测性”的教科书。我甚至开始反思自己过去项目中那些被我草草了事的小模块,现在看来,每一个设计决策背后都隐藏着巨大的技术债务风险。这本书的行文风格是内敛而自信的,它不试图说服你,而是用无可辩驳的逻辑和结构展示了“好的构造”的本质。对于那些厌倦了追逐新框架、渴望沉淀核心能力的工程师而言,这本书无疑是一剂清醒剂。

评分

**评价五:** 这是一部需要反复研读的经典之作,每一次重读都会有新的感悟。我发现它最迷人的地方在于,它超越了任何单一的编程语言范畴,直指软件工程的本质——如何用有限的资源(时间和人力)去管理无限的复杂性。书中对契约式设计(Design by Contract)的阐述,并非是教你如何写注释,而是将其视为一种强制性的自我约束机制,用以保证系统各个部分之间的接口清晰无误。我曾一度对设计模式感到困惑,认为它们是僵硬的教条,但读完此书,我才明白,很多设计模式本质上是针对特定“构造陷阱”的成熟解决方案。作者的笔触非常细腻,尤其是在论述抽象层次的提升时,他总能找到最恰当的比喻,将那些晦涩的理论用一种极其直观的方式呈现出来。这本书不仅是教会我如何写出更好的代码,更重要的是,它塑造了我对“优秀软件”的定义和追求标准,它无疑是技术书架上最值得珍藏的宝物之一。

评分

**评价三:** 坦白讲,这本书的阅读体验并非一帆风顺,它更像是一场艰苦的登山之旅,而非轻松的散步。我对其中关于形式化验证和程序正确性证明的部分印象尤为深刻,虽然我没有完全吃透那些数学符号,但作者阐述的“软件应该像数学证明一样可靠”的理念,已经深深植入了我的思维。书中对数据结构和算法的讨论,不再是孤立地介绍它们的功能,而是将其置于特定约束和性能指标的背景下进行对比分析。比如,它没有简单地说链表和数组哪个好,而是详尽地分析了在特定内存访问模式下,哪种结构能带来更优的缓存命中率。这种将理论与底层硬件行为联系起来的分析深度,是我在其他任何书籍中都未曾见过的。这本书的价值在于,它教你如何像一个严谨的科学家那样去构建软件,而不是仅仅像一个熟练的工匠那样去堆砌代码。它要求你对细节保持近乎苛刻的关注,但回报是你将获得构建“健壮”系统的能力。

评分

**评价一:** 初捧此书,那厚重的篇幅和略显晦涩的标题,让人不免有些望而生畏。然而,一旦翻开第一页,那种扑面而来的扎实感便立刻抓住了我。它并非那种只停留在概念表层的“科普读物”,而是真正深入到了软件构建的肌理之中。书中对抽象数据类型(ADT)的探讨,远比我以往接触的任何教材都要来得透彻和细致。作者似乎并不满足于解释“是什么”,而是穷尽心思去剖析“为什么会这样设计”以及“如果换一种方式会有什么后果”。特别是关于不变性(Invariants)的论述,简直是一场关于软件可靠性的哲学思辨。我尤其欣赏作者在讲解复杂算法结构时,那种庖丁解牛般的冷静与精准,每一个例子都如同精心雕琢的艺术品,逻辑链条严密得令人拍案叫绝。这本书要求读者具备一定的基础功力,但对于那些渴望从“码农”跃升至“架构师”心智模式的同路人来说,它提供的知识深度和广度,绝对是无价之宝。阅读过程虽然需要高度集中注意力,但每一次理解上的突破,都伴随着巨大的成就感,感觉自己的软件观正在被系统性地重塑。

评分

仔细读了一下,内容没有超出我理解的build工具,空洞无物

评分

看来不错。

评分

我觉得这本书,写得浅显易懂。能够帮助大家,理解程序的构造过程。翻译的的也挺好的。

评分

我觉得这本书,写得浅显易懂。能够帮助大家,理解程序的构造过程。翻译的的也挺好的。

评分

仔细读了一下,内容没有超出我理解的build工具,空洞无物

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2026 book.wenda123.org All Rights Reserved. 图书目录大全 版权所有