程序开发流程
本节阅读量:软件开发,通常遵循如下流程:
需求分析
首先,明确需要编程解决的问题。
例如:
- 开发一个将输入数字进行加减乘除的计算器
- 开发一个转换图片格式的程序
- 开发一个统计excel中指定信息的软件
方案设计
这一步,需要思考采用何种方案去解决问题。针对问题有许多好或坏的解法,仔细思考挑选出优秀的解法。
「方案设计」在软件开发中经常被忽略。大部分情况可能拍脑袋,有个思路,就开始进行编程。 这样容易编写出脆弱且充满「bug」的程序。
bug是什么含义?
1947年9月9日,Grace Hopper在哈佛大学计算实验室研究计算机MarkII和Mark III。
在计算机运行时,突然停止了工作。于是技术人员爬上去找原因,发现这台巨大的计算机内部一组继电器触点之间有一只飞蛾,显然飞蛾由于光和热的吸引,飞到触点上,被高电压击死。在报告中,Hopper用胶条贴上飞蛾,用“bug”表示“在电脑程序里的错误”,此说法一直沿用到现在。

好的解决方案有以下特征:
- 简洁不复杂
- 容易写出来并被别人理解
- 模块化,只要略加修改,系统的每个部分都能复用或单独升级
- 具有健壮性,当异常发生时,易恢复或有明确错误信息
编写程序
编写程序需2个必备条件。首先要了解使用的编程语言,即本教程所讲授的。其次,要准备文本编辑器来编写代码。
代码是编译器能够理解的文本。因此可以使用任何喜欢的文本编辑器,比如notepad,vi,emacs等。 但更推荐使用专门为编程设计的编辑器,下一章节会介绍。
好的编辑器使编程更加容易:
- 显示行号。当程序编译失败时,编辑器提示某一行存在错误,有行号的编辑器能定位到错误位置。
- 语法高亮。语法高亮帮助我们结构化理解程序,清楚展示程序不同组成部分。
- 挑选合适字体。要能区分数字「0」和字母「O」,数字「1」和字母「I」(大写i)以及「l」(小写L)。推荐选等宽字体(monospaced font),容易对齐代码缩进。字体名称里含有「mono」是等宽字体,例如「DejaVu Sans Mono」字体就可以。
下面是一个带行号与语法高亮的例子:
|
|
C++程序文件以「.cpp」为文件后缀,有人也喜欢使用「.cc」后缀。这里推荐使用「.cpp」。
大多数C++程序都会由多个cpp文件组成。大型C++程序,可能有成千上万的cpp文件。 我们从含有单个cpp文件的程序开始学习和编写。
编译
在得到可执行程序前,要使用C++编译器对C++源代码编译。目前比较流行的编译器有GCC,LLVM,MSVC。
在编译「.cpp」文件时,编译器主要做如下操作:
- 检查代码是否符合C++语言规范,如果不符合,给出对应有问题的行号。直到代码中所有的语法错误都被修改完,才能通过。
- 将代码转换成由机器语言组成的文件,被称作「目标文件」。后缀是「.o」或者「.obj」,前缀与对应的cpp文件名一致。
如下,有3个「.cpp」文件,生成3个对应「.o」目标文件。
链接
为得到最终的可执行文件,需使用「链接器」将目标文件组合一起。需链接到一起的有如下三部分:
- 编译器产出的目标文件
- C++标准库。C++语言本身不提供太多功能,许多额外有用功能被打包到「C++标准库」中。一般情况下会默认链接C++标准库,不需要额外设置。
- 其它预编译好的库文件。许多目标文件,打包到一起,其它程序可以使用它的功能,称为库文件。例如,如果想编写播放音乐的软件,如何解析与验证音频,如何让硬件来播放。完成这些功能需要大量的编程工作。为完成需求,下载已经编写好的支持这些功能的库。使用别人的库来快速开发程序。
在产出最终的可执行文件时,链接器检查所有跨文件依赖。例如,在A.cpp中定义某个功能,在B.cpp中使用,在链接时,将依赖连接起来。
如果发现某个功能找不到定义,或有重复定义。链接器会给出对应报错。
测试与调试
至此,运行最后得到的可执行文件,「测试」下运行的结果是否符合预期。
如果程序不能正常工作,「调试」程序,看是哪里的问题。后续详细讲解如何调试。
