版本控制

版本控制系统(version control system)是一种能允许多位开发者在同一组文件上工作的工具。它包含了每个文件的历史记录,所以每次改变都能被追踪并且如果有必要的话进行回溯。它有时候也被叫作源代码管理(source control),因为它主要用于计算机程序员来管理他们的源代码。不过,版本控制也可用于其它类型的文件。版本控制系统一般来说非常擅长于管理文本文件。

版本控制的功能

  • 提供中央版本库能让工程师分享源代码
  • 保留对每个源文件的所有更改记录
  • 提供为某个版本加标签的机制,供以后提取已加标签的版本
  • 容许代码从主生产线上建立分支(branch)。它可以用来制作demo或者为较旧的软件版本制作补丁(patch)。

常见的版本控制系统

  • SCCS和RCS. Source Code Control System(SCCS)和Revision Control System(RCS)是两个最古老的版本控制系统。都采用了命令行方式,主要流行于UNIX平台。
  • CVS. Concurrent Version System(CVS)是一个高强度、专业级基于命令行的源代码控制系统,最初是建立在RCS的基础之上的(现已成为独立的工具).CVS流行于UNIX系统,但是其他系统也能用。它是开源的,基于GPL协议(Gnu General Public License). 
  • Subversion. Subversion是一个定位于取代CVS并要做得更好的开源版本控制系统。因为它是开源免费的,对于个人项目、学生项目和小型工作室来说是一个不错的选择。CS架构,S负责管理中央版本库。
  • Git. 这是一个开源的版本控制系统,它曾用于许多经典的项目,包括Linux kernel.在git开发模式下,程序员对文件作修改并将它提交到一个branch。程序员然后就可以把它的改动又快又方便的整合到其它代码branch中去。更多信息请访问:http://git-scm.com/.
  • Perforce. Perforce是一个专业级的源代码控制工具,包括命令行及GUI界面两种操作方式。Perforce提出了change list的概念。change list指被视为同一逻辑单元而进行修改的源文件集合,它会以原子的方式签入版本库。
  • NxN Alienbrain. Alienbrain是一个强大的功能丰富的针对游戏行业设计的版本控制工具。它的亮点在于支持大型数据包括文本的源代码文件和二进制的游戏资源,还有一个自定义的用户界面,能针对美术师、制作人、程序员进行个性化界面。
  • ClearCase. ClearCase是一个专业级的针对大型软件项目使用的源代码控制工具。
  • Microsoft Visual SourceSafe. SourceSafe是一个轻量级的源代码控制工具,已经成功用于一些游戏项目。

Visual Studio的常用宏

$(TargetFilename):项目生成的最终可执行文件、库或DLL的文件名

$(TargetPath):最终可执行文件、库或DLL的绝对路径

$(ConfigurationName):生成的配置名称,典型的值为“Debug”或“Release”

$(OutDir):在该对话框“输出目录”设置的值

$(IntDir):在该对话框“输入目录”设置的值

$(VCInstallDir):安装Visual C++的目录

Linux下如何将源文件逐步编译成目标文件

一个.c源程序需要经过预处理器生成.i文件,再经过编译器生成.s文件,再经过汇编器生成可重定位目标文件.o文件,再与其他.o文件经过链接器生成最终的可执行目标程序。

 预处理阶段。主要是处理源文件中以“#”开头的预编译指令。

  • 删除#define并展开宏
  • 处理所有条件预编译指令,如#if, #ifdef, #endif
  • 插入头文件到“#include”处
  • 删除所有注释
  • 添加行号和文件名标识,以便编译时编译器产生调试用的行号信息
  • 保留所有#pragma编译指令。

编译阶段。将预处理得到的预处理文件进行语法分析,词法分析,语义分析,优化后,生成汇编代码文件(汇编语言源程序)。

汇编阶段。利用汇编程序(汇编器)将汇编语言源程序转换成机器指令序列(机器语言程序)。

链接阶段。将多个可重定位的目标文件.o合并以生成可执行文件,其可以被加载到内存中,由系统执行。

当生成可重定位目标文件.o文件(Windows下是obj)时,它的机器码:可重定位:未决定代码的内存地址;未链接的:为解决外部函数参考和翻译单元外定义的全局变量。

链接器的工作:计算全部机器码的最终相对位置(此时,所有的地址是相对一个任意的基址,而非绝对地址);确保正确的解析每个翻译单元的外部函数参考和全局变量。

剖析工具

Pareto principle(80-20规则):在很多情况下,一些事件的80%后果取决于20%的原因。

变种的90-10规则:任何程序的90%wall clock time消耗在运行仅10%的代码上。

因此,优化的关键是优化那10%的代码:

一些剖析器能告知每个函数的调用次数;因为某个函数消耗时间在于本身运行时间很长和被频繁调用这两点。

剖析器分类

统计式剖析器

启动剖析器后,目标代码的执行速度和未使用剖析器差不多;它的原理是对CPU程序计数器周期性采样,得到每个函数占整体的执行时间比例。

测控式剖析器

能最精确、最详细的计时数据,但是程序不能实时运行。它需要预处理可执行文件,为每个函数安插特殊的初构代码和终解代码,这两个代码会调用剖析器的库,调查程序的所有细节。

剖析器列表:http://en.wikipedia.org/wiki/List_of_performance_analysis_tool

内存泄漏和损坏检测工具

Ration Purify和Bounds Checker

区别工具

ExamDiff、AraxisMerge、WinDiff、GUN区别工具包

三路合并工具

AraxisMerge、WinDiff

十六进制编辑器

HexEdit